linux设备驱动程序开发.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux设备驱动程序开发.ppt

模块的加载 例图给出了一个加载两个模块:VFAT和FAT后的核心链表示意图。不过图中没有画出链表中的第一个模块: 用来存放核心输出符号表的一个伪模块。lsmod可以帮助我们列出系统中所有已加载的核心模块以及相互间依赖关系。它是通过重新格式化从核心module结构中建立的/proc/modules来进行这项工作的。核心为其分配的内存被映射到insmod的地址空间, 这样它就能访问核心空间。insmod将模块拷贝到已分配空间中, 如果为它分配的核心内存已用完,则它将再次申请。注意:模块不会总是加载到相同地址,在两个不同Linux系统中也不会加载到相同位置。另外此重定位工作包括使用适当地址来修改模块映象。这个新模块也希望将其符号输出到核心中,insmod将为其构造输出符号映象表。每个核心模块必须包含模块 初始化和模块清除例程,它们的符号被设计成故意不输出,但是insmod必须知道这些地址,这样它可以将它们传递给核心。所有这些工作做完之后,insmod将调用初始化代码并执行一个特权级系统调用将模块的初始化与清除例程地址传递给核心。 模块的加载 当将一个新模块加载到核心中间时,核心必须更新其符号表并修改那些被新模块使用的老模块。那些依赖于其他模块的模块必须维护在其符号表尾部维护一个引用链表并在其module数据结构中指向它。例图中VFAT 依赖于FAT文件系统模块。所以FAT模块包含一个对VFAT模块的引用;这个引用在加载VFAT模块时添加。核心调用模块的初始化例程,如果成功它将安装此模块。模块的清除例程地址被存储在其module结构中,它将在模块卸载时由核心调用。最后模块的状态被设置成RUNNING。 模块的卸载 模块可以通过使用rmmod命令来删除,如果核心中的其他部分还在使用某个模块,则此模块不能被卸载。例如系统中安装了多个VFAT文件系统,那么将不能卸载VFAT模块。执行lsmod可以看到每个模块的引用记数。模块的引用记数被保存在其映象的第一个长字中。这个字同时还包含AUTOCLEAN和VISITED标志。请求加载模块使用这两个标志域。如果模块被标记成AUTOCLEAN则核心知道此模块可以自动卸载。VISITED标志表示此模块正被一个或多个文件系统部分使用;只要有其他部分使用此模块则这个标志被置位。 最简单模块事例 #define MODULE #includelinux/module.h int init_module(void) { printk(1Hello,world\n); return 0; } void cleanup_module(void) { printk(1Goodbye cruel world\n); } root# arm-linux-gcc –D_KERNEL_ -I /usr/src/kenelSB/include –DKBUILD_BASENAME= hello –DMODULE -c –o hello.o hello.c root# insmod ./hello.o Hello,world root# rmmod hello Goodbye cruel world root# 样例模块化驱动程序、测试程序、Makefile文件和模块化驱动的操作步骤: 以demo.c为例的操作步骤 字符设备的例子 1、编译: Makefile的形式-参考代码 root# make clean root# make 命令行的形式 root# arm-linux-gcc –D_KERNEL_ -I /usr/src/kenelSB/include –DKBUILD_BASENAME=demo –DMODULE -c –o demo.o demo_drv.c 2、在系统中为驱动程序模块建立一个设备节点 root# mknod /dev/demo_drv c 125 0 其中/dev/demo_drv标识设备名为demo_drv,“c”说明是字符设备,125是指定的主设备号, 0是次设备号 root# lsmod 3、加载驱动 root# insmod demo.o root# lsmod 4、运行测试代码 root#。Chmod a+x test //修改文件 root#。/test 字符设备的例子 卸载驱动 root# rmmod demo root# insmod demo.o demo_param = 8 root# lsmod root# ./test root# rmmod demo root# rm demo_drv –rf root# make clean 字符设备的例子 open 提供给驱动程序初始化设备的能力,为后续的操作做准备 此外一般会递增使用计

文档评论(0)

暖洋洋 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档