资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第一章Linux设备驱动程序简介Linux Kernel系统架构图、驱动程序的特点* 是应用和硬件设备之间的一个软件层。* 这个软件层一般在内核中实现* 设备驱动程序的作用在于提供机制,而不是提供策略,编写访问硬件的内核代码时 不要给用户强加任何策略。机制:驱动程序能实现什么功能。策略:用户如何使用这些功能。、设备驱动分类和内核模块* 设备驱动类型。Linux系统将设备驱动分成三种类型。字符设备。块设备。网络设备*内核模块:内核模块是内核提供的一种可以动态加载功能单元来扩展内核功能的机 制,类似于软件中的插件机制。这种功能单元叫内核模块。.通常为每个驱动创建一个不同的模块,而不在一个模块中实现多个设备驱动,从而 实现良好的伸缩性和扩展性。三、字符设备字符设备是个能够象字节流比如文件)一样访问的设备,由字符设备驱动程序来 实现这种特性。通过/dev下的字符设备文件来访问。字符设备 驱动程序通常至少 需要实现open、close、read和write等系统调用所对应的对该硬件进行操作的 功能函数。应用程序调用system callV系统调用),例如:read、write,将会导 致操作系统 执行上层功能组件的代码,这些代码会处理内核的一些内部 事务,为操作硬件做 好准备,然后就会调用驱动程序中实现的对硬件进 行物理操作的函数,从而完成 对硬件的驱动,然后返回操作系统上层功能组件的代码,做好内核内部的善后事 务,最后返回应用程序。*由于应用程序必须使用/dev目录下的设备文件参见open调用的第1个 参 数),所以该设备文件必须事先创建。谁创建设备文件呢?*大多数字符设备是个只能顺序访问的数据通道,不能前后移动访问指 针,这点和文 件不同。比如串口驱动,只能顺序的读写设备。然而,也 存在和数据区或者文件特性类似的字符设备,访问它们时可前后移动访问指针。例如framebuffer设备就是这样一个设备,应用程序可以用mmap或 Iseek访问图象的各个区域。四、块设备.块设备通常是按照块为单位来访问数据,比如一块为512字节。*块设备也是通过/dev目录下的文件系统节点来访问。块设备和字符设 备的区别仅仅 在于内核内部管理数据的方式,也就是内核和驱动程序的接口不同。块设备除了给内核提供和字符设备一样的接口外,还提供了专门面向块设备的接 口,块设备的接口必须支持挂装文件系统,通过此接口,块设备能够容纳文件系 统,因此应用程序一般通过文件系统来访问块设备上 的内容。文件系统可能是除驱动程序外Linux系统中最重要的模块类型,与块设备驱动程序 联系紧密。五、网络设备驱动和网络接口*网络设备驱动不同于字符设备和块设备,不在/dev下以文件节点为代 表,而是通 过单独的网络接口 ( ethO、eth1 来代表。*任何网络事务都要经过一个网络接口,即一个能够和其它主机交换数据的设备。通 常接口代表一个硬件设备(如网卡,但也可能是个纯软件设 备。内核和网络驱动程序间的通讯完全不同于内核和字符设备以及块设备驱 动程序之间 的通信,内核调用一套和数据包传输相关的函数。六、设备文件和设备驱动* 设备文件是文件系统上的一个节点,是一种特殊的文件,叫做设备文件。每个设备 文件在用户空间代表了一个设备。* 设备文件一般存在/dev目录下,用mknod命令创建。设备文件有主、次设备号与 其关联。* 设备文件是用户应用程序和设备驱动的接口。应用程序一般只能通过设备文件来使 用设备驱动的功能。字符和块设备驱动必须有相应的设备文件来对应。很明显,操作系统内部不可能用设备文件名来与物理设备及其驱动进行绑定。其实,操 作系统内部是用设备号来与物理设备及其驱动进行绑定的。习惯上,用主设备号与驱动 进行关联,用次设备号与具有相同驱动的不同物理设备关联/ 目录下的所有内核模块,从而给内核模块生成依赖文件。o 生成 /lib/modules/vker nel versi on/modules.dep 文件,其中 是当前运行内核的版本号 modprobe:根据modules.dep文件探测并加载内核模块。只需要给出模 块名称,自动寻找适合的模块文件,并进行加载。注意和 insmod的不同 之处。可以自动寻找模块文件并加载。自动寻找并加载依赖的模块。#cat /lib/modules/2.6.22.6/modules.dep/Iib/modules/s3c24xx_button s.ko: /lib/modules/leds.ko /lib/modules/leds.ko:# IsmodModuleSize Used by Nottai nted# modprobe s3c24xx_butt ons leds in itialized butt ons in itializedNot# IsmodModuleSize Used bytai nted5944035921s3c24xx_button ss3c24xx_butto ns leds# rmmod ledsrmmod: leds: Resource temporarily un available # rmmod s3c24xx_butt ons butt ons driver uni oaded # Ismod Size Used by Not Module tai nted leds35920# rmmod leds leds driver uni oaded # IsmodModuleSize Used by Nottai nted # in smod s3c24xx_butt ons s3c24xx_butt ons: Unknown symbol ledoff s3c24xx_butt ons: Unknown symbol led on in smod: cannot in sert 7lib/modules/s3c24xx button Unknowns.ko*: symbol in module (-1: No such file or directory* modinfo :查看模块文件的基本信息denni sde nni s-desktop:/work/studydriver/butt ons$ modinfo s3c24xx_butt on s.kofile name: lice nse: descriptio n:s3c24xx_butt on s.koGPL -S3C2410/S3C2440 BUTTON Driverauthor:Yan gZhu E-mail: scyz263.netdepe nds: vermagic:2.6.22.6 mod_un load ARMv44、内核模块的编译方法内核源码树:指的是内核源代码tar包解压缩后形成的目录包含其下级所有目录和文 件)已编译内核源码树:指的是已经成功生成过内核的内核源码树(即:已经成功执行过make ulmage的内核源码树)驱动大多都编译为模块,2.6内核中要想编译模块,必须先存在已经成功编译了的内核源 码树即:己编译内核源码树),且该源码树编译出来的内核就是该 模块即将运行在其 上的内核。编译方法1:* 编写 Makefile : obj-m := hello.o* 编译命令:make - C内核源码树目录M=pwd moduleso例如:denn isde nn is-desktop:/work/studydriver/examples/misc-modules$ make -C /work/system/li nux-2.6.22.6/ M=pwd modules对该make命令的解释:要想编译内核模块,只需要在内核源码树的顶层目录下输入make modules来编译Makefile中的modules目标即可,剩下的事情,由内核构造系统全权替我们 处理。但 由于目前不处于内核源码树的顶层目录,并且当前目录下的Makefile也没有modules目标,因此使用C参数来告知make程序需要在执行之前切换 到 /work/system/li nux-2.6.22.6/ 目录。此外,由于模块的源代码在当前目录 中,不在内核源码树中,因此需要使用M变量该变量是内核构造系统的变量)告知内核构造系统,编译模块所需的源代码以及Makefile在当前目录v/work/studydriver/examples/misc-modules )中来找,而且最终生成的模块ko文件也 要放在当前目录中。编译方法2:* 编写Makefile如下:ifeq 伴(KERNELRELEASE,KERNELDIR ?= /work/sys
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号