Linux设备驱动程序简介 .docx
《Linux设备驱动程序简介 .docx》由会员分享,可在线阅读,更多相关《Linux设备驱动程序简介 .docx(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品名师归纳总结第一章Linux 设备驱动程序简介Linux Kernel系统架构图一、驱动程序的特点是应用和硬件设备之间的一个软件层。这个软件层一般在内核中实现设备驱动程序的作用在于供应机制,而不是供应策略,编写拜望硬件的内核代码时不要给用户强加任何策略o 机制:驱动程序能实现什么功能。o 策略:用户如何使用这些功能。二、设备驱动分类和内核模块设备驱动类型。 Linux系统将设备驱动分成三种类型o 字符设备o 块设备o 网络设备内核模块:内核模块是内核供应的一种可以动态加载功能单元来扩展内核功能的机制,类似于软件中的插件机制。这种功能单元叫内核模块。通常为每个驱动创建一个不同的模块,而不在一
2、个模块中实现多个设备驱动,从而实现良好的伸缩性和扩展性。三、字符设备字符设备是个能够象字节流 比如文件)一样拜望的设备,由字符设备驱动程序来实现这种特性。通过 /dev 下的字符设备文件来拜望。字符设备驱动程序通常至少需要实现 open 、close 、read 和 write等系统调用所对应的对该硬件进行操作的功能函数。应用程序调用 system call系统调用),例如: read 、write ,将会导致操作系统执行上层功能组件的代码,这些代码会处理内核的一些内部 事务,为操作硬件做好预备,然后就会调用驱动程序中实现的对硬件进 行物理操作的函数,从而完成对硬件的驱动,然后返回操作系统上层
3、功 能组件的代码,做好内核内部的善后事务,最终返回应用程序。由于应用程序必需使用 /dev 目录下的设备文件 来代表。任何网络事务都要经过一个网络接口,即一个能够和其它主机交换数据 的设备。通常接口代表一个硬件设备 如网卡 ,但也可能是个纯软件设备。内核和网络驱动程序间的通讯完全不同于内核和字符设备以及块设备驱动程序之间的通信,内核调用一套和数据包传输相关的函数。六、设备文件和设备驱动设备文件是文件系统上的一个节点,是一种特殊的文件,叫做设备文件。每个设备文件在用户空间代表了一个设备。设备文件一般存在 /dev 目录下,用 mknod命令创建。 设备文件有主、次设备号与其关联。设备文件是用户应
4、用程序和设备驱动的接口。应用程序一般只能通过设备文件来使用设备驱动的功能。字符和块设备驱动必需有相应的设备文件来对应。很明显,操作系统内部不行能用设备文件名来与物理设备及其驱动进行绑定。其实,操作系统内部是用设备号来与物理设备及其驱动进行绑定的。习惯上,用主设备号与驱动进行关联,用次设备号与具有相同驱动的不同物理设备关联时,由于设备文件 /dev/ttyS0 有一个设备号与其关联,因此操作系统可以获知应用程序想操控的设备的设备号,而操作系统内部又将设备号与物理设备及其驱动进行了绑定,因此操作系统就可以知道应当调用哪一个驱动去把握哪一个设备。当然这一切的前提是,操作系统内部要将设备号与物理设备及
5、其驱动进行绑定,那么操作系统内部是用什么手段完成这种绑定关系的了?实际上,在操作系统内部存在一个结构体链表就是上图中的 Char device list,以后称它为设备链表),链表的每个节点代表 一个绑定关系 也就是说:节点至少含有 2 个字段, 1 个用于记录设备号,另1 个用于记录查找驱动的信息,通常是一个指向驱动函数结构体的指针)。那么是谁生成节点并将它链入链表的了?当然是驱动程序! 七、构造和运行模块1、Kernel Module的特点模块只是先注册自己以便服务于将来的某个请求,然后就马上终止。模块可以是实现驱动程序,文件系统,或者其他功能。加载模块后,模块运行在内核空间,和内核链接为
6、一体。2、模块与内核的接口函数 除掉 read 、write等功能函数)生成节点并将它链入设备链表这个操作由驱动中的函数实现,这些函数什么时机运行了?当然最合适的时机是内核加载模块insmod 模块)的时候。函数 init_module:内核加载模块的时候调用。主要功能是:为以后使用模块里的函数和变量预先做预备函数 cleanup_module :模块的其次个入口点,内核在模块即将卸载之前调用它。3、操作模块相关的命令insmod:加载模块。后面参数是模块文件名。# insmod /lib/modules/hello.ko Hello, worldrmmod:卸载模块。后面参数是模块名称。#
7、rmmod helloGoodbye, cruel worldlsmod:列出当前内核使用的模块。或者查看 /proc/modules文件。可编辑资料 - - - 欢迎下载精品名师归纳总结depmod:扫描 /lib/modules/目录下的全部内核模块,从而给内核模块生成依靠文件。o 生成/lib/modules/modules.dep文件,其中是当前运行内核的版本号modprobe:依据 modules.dep 文件探测并加载内核模块。只需要给出模块名称,自动查找适合的模块文件,并进行加载。留意和insmod 的不同之处。o 可以自动查找模块文件并加载。o 自动查找并加载依靠的模块。#ca
8、t /lib/modules/2.6.22.6/modules.dep/lib/modules/s3c24xx_buttons.ko: /lib/modules/leds.ko/lib/modules/leds.ko:# lsmodModuleSizeUsed byNottainted# modprobe s3c24xx_buttonsleds initializedbuttons initialized# lsmodModuleSizeUsed byNottainteds3c24xx_buttons59440leds# rmmod leds35921 s3c24xx_buttonsrmmod
9、: leds: Resource temporarily unavailable# rmmod s3c24xx_buttonsbuttons driver unloaded# lsmodModuleSizeUsed byNottaintedleds35920# rmmod ledsleds driver unloaded# lsmodModuleSizeUsed byNottainted# insmod s3c24xx_buttonss3c24xx_buttons: Unknown symbol ledoffs3c24xx_buttons: Unknown symbol ledoninsmod
10、: cannot insert /lib/modules/s3c24xx_buttons.ko: Unknown symbol in module -1: No such file or directorymodinfo :查看模块文件的基本信息可编辑资料 - - - 欢迎下载精品名师归纳总结dennisdennis-desktop:/work/studydriver/buttons$ modinfo s3c24xx_buttons.kofilename:s3c24xx_buttons.kolicense:GPLdescription:S3C2410/S3C2440 BUTTON Driver
11、 author:YangZhuE-mail: scyz depends:vermagic:2.6.22.6 mod_unload ARMv4 4、内核模块的编译方法内核源码树:指的是内核源代码tar包解压缩后形成的目录 包含其下级全部目录和文件)已编译内核源码树:指的是已经成功生成过内核的内核源码树即:已经成功执行过 make uImage 的内核源码树)驱动大多都编译为模块, 2.6 内核中要想编译模块,必需先存在已经成功编译了的内核源码树 即:已编译内核源码树),且该源码树编译出来的内核就是该模块即将运行在其上的内核。编译方法 1:编写 Makefile : obj-m := hello.
12、o编译命令: make C 内核源码树目录 M=pwd modules 。例如:dennisdennis-desktop:/work/studydriver/examples/misc-modules$ make -C /work/system/linux-2.6.22.6/ M=pwd modules对该 make命令的说明:要想编译内核模块,只需要在内核源码树的顶层目录下输入make modules 来编译 Makefile中的 modules 目标即可,剩下的事情,由内核构造系统全权替我们处理。但由于目前不处于内核源码树的顶层目录,并且当前目录下的Makefile 也没有 modules
13、 目标,因此使用 -C 参数来告知 make程序需要在执行之前切换到/work/system/linux-2.6.22.6/目录。此外,由于模块的源代码在当前目录 中,不在内核源码树中,因此需要使用M变量该变量是内核构造系统的变量) 告知内核构造系统,编译模块所需的源代码以及Makefile在当前目录,KERNELDIR .= /work/system/linux-2.6.22.6 PWD := $shell pwd可编辑资料 - - - 欢迎下载精品名师归纳总结modules: modules_install: clean:$MAKE -C $KERNELDIR M=$PWD modules
14、$MAKE -C $KERNELDIR M=$PWD modules_install rm -rf *.o * core .depend .*.cmd *.ko可编辑资料 - - - 欢迎下载精品名师归纳总结*.mod.c .tmp_versions.PHONY: modules modules_install clean可编辑资料 - - - 欢迎下载精品名师归纳总结else endifobj-m := hello.o可编辑资料 - - - 欢迎下载精品名师归纳总结编译命令: make对该 Makefile的说明:当 make时,由于变量 KERNELRELEA尚SE未赋值,因此 ifeq
15、$KERNELRELEASE为,真,于是变量 KERNELDIR被赋值为内核源码树目录/work/system/linux-2.6.22.6,变量 PWD被赋值为当前目录/work/studydriver/examples/misc-modules,然后执行找到的第 1 个目标modules,从而执行命令make -C /work/system/linux-2.6.22.6 M=/work/studydriver/examples/misc-modules modules,而当该命令执行以调用内核构造系统的时候,内核构造系统会为变量KERNELRELEA赋SE值,从而它不再为空,从而当前目录下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux设备驱动程序简介 Linux 设备 驱动程序 简介
限制150内