1.Linux设备驱动程序简介

上传人:m**** 文档编号:487100180 上传时间:2023-06-18 格式:DOC 页数:12 大小:239KB
返回 下载 相关 举报
1.Linux设备驱动程序简介_第1页
第1页 / 共12页
1.Linux设备驱动程序简介_第2页
第2页 / 共12页
1.Linux设备驱动程序简介_第3页
第3页 / 共12页
1.Linux设备驱动程序简介_第4页
第4页 / 共12页
1.Linux设备驱动程序简介_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《1.Linux设备驱动程序简介》由会员分享,可在线阅读,更多相关《1.Linux设备驱动程序简介(12页珍藏版)》请在金锄头文库上搜索。

1、Linux设备驱动程序简介The System Call InterfaceConcurrency rnulli tasking帕 hrciiungcondmfICotinectivtlyVirtual memoryTtyi & device accessi *- Pmcan managenenlf Memory ;mafiagBmmsuixsyamsFiles and din:iheVFSMums snpigmcntdcfNetwork tubsyitefTidrnncuIBlocfc dfiviceiIF dnvsnI I| Momoryrnsfugar QQruiiiiniSMn吊 su

2、pp&tTinitenwcy Dirts & CDi Conwtei. Network efcFinterlacesI 如 IriM 欣岀 Eltefumdl 細Lin uxKernel系统架构图、驱动程序的特点是应用和硬件设备之间的一个软件层。这个软件层一般在内核中实现设备驱动程序的作用在于提供机制,而不是提供策略,编写访问硬件的内 核代码时不要给用户强加任何策略o机制:驱动程序能实现什么功能。o策略:用户如何使用这些功能。、设备驱动分类和内核模块设备驱动类型。Linux系统将设备驱动分成三种类型o字符设备o块设备o网络设备内核模块:内核模块是内核提供的一种可以动态加载功能单元来扩展内核 功

3、能的机制,类似于软件中的插件机制。这种功能单元叫内核模块。通常为每个驱动创建一个不同的模块,而不在一个模块中实现多个设备驱 动,从而实现良好的伸缩性和扩展性。三、字符设备字符设备是个能够象字节流(比如文件)一样访问的设备,由字符设备驱 动程序来实现这种特性。通过/dev下的字符设备文件来访问。字符设备 驱动程序通常至少需要实现 open、close、read和write等系统调用所对 应的对该硬件进行操作的功能函数。*应用程序调用systemcall (系统调用),例如:read、write,将会导致 操作系统执行上层功能组件的代码,这些代码会处理内核的一些内部事 务,为操作硬件做好准备,然后

4、就会调用驱动程序中实现的对硬件进行物 理操作的函数,从而完成对硬件的驱动,然后返回操作系统上层功能组件 的代码,做好内核内部的善后事务,最后返回应用程序。因为应用程序必须使用/dev目录下的设备文件(参见open调用的第1个 参数),所以该设备文件必须事先创建。谁创建设备文件呢?大多数字符设备是个只能顺序访问的数据通道,不能前后移动访问指针, 这点和文件不同。比如串口驱动,只能顺序的读写设备。然而,也存在和 数据区或者文件特性类似的字符设备,访问它们时可前后移动访问指针。 例如framebuffer设备就是这样一个设备,应用程序可以用mma或lseek 访问图象的各个区域。四、块设备-块设备通

5、常是按照块为单位来访问数据,比如一块为512字节。*块设备也是通过/dev目录下的文件系统节点来访问。块设备和字符设备 的区别仅仅在于内核内部管理数据的方式, 也就是内核和驱动程序的接口 不同。块设备除了给内核提供和字符设备一样的接口外,还提供了专门面向块设备的接口,块设备的接口必须支持挂装文件系统,通过此接口,块设备能够容纳文件系统,因此应用程序一般通过文件系统来访问块设备上的内 容。*文件系统可能是除驱动程序外Linux系统中最重要的模块类型,与块设备 驱动程序联系紧密。五、网络设备驱动和网络接口*网络设备驱动不同于字符设备和块设备,不在/dev下以文件节点为代表,而是通过单独的网络接口(

6、ethO、eth1)来代表。任何网络事务都要经过一个网络接口,即一个能够和其它主机交换数据的 设备。通常接口代表一个硬件设备(如网卡),但也可能是个纯软件设备。内核和网络驱动程序间的通讯完全不同于内核和字符设备以及块设备驱 动程序之间的通信,内核调用一套和数据包传输相关的函数。六、设备文件和设备驱动设备文件是文件系统上的一个节点,是一种特殊的文件,叫做设备文件。 每个设备文件在用户空间代表了一个设备。设备文件一般存在/dev目录下,用mknod命令创建。设备文件有主、次 设备号与其关联。设备文件是用户应用程序和设备驱动的接口。 应用程序一般只能通过设备 文件来使用设备驱动的功能。字符和块设备驱

7、动必须有相应的设备文件来对应。很明显,操作系统内部不可能用设备文件名来与物理设备及其驱动进行绑定。 其 实,操作系统内部是用设备号来与物理设备及其驱动进行绑定的。 习惯上,用主 设备号与驱动进行关联,用次设备号与具有相同驱动的不同物理设备关联 (例如: 2个硬盘)。denni sde nni s-desktop:$ls-l/dev/sda-cbrw-rw-Irootdisk 8,02010-04-1313:38/dev/sdabrw-rw-1rootdiskbrw-rw-1rootdisk8,162010-04-1313:38/dev/sdb8,32 2010-04-1313:38/dev/s

8、dc当用户程序运行open(/dev/ttyS0, )时,因为设备文件/dev/ttyS0有一个设 备号与其关联,因此操作系统可以获知应用程序想操控的设备的设备号,而操作系统内部又将设备号与物理设备及其驱动进行了绑定,因此操作系统就可以知道 应该调用哪一个驱动去控制哪一个设备。当然这一切的前提是,操作系统内部要将设备号与物理设备及其驱动进行绑定,那么操作系统内部是用什么手段完成这 种绑定关系的呢?实际上,在操作系统内部存在一个结构体链表 (就是上图中的 Chardevicelist ,以后称它为设备链表),链表的每个节点代表一个绑定关系(也 就是说:节点至少含有2个字段,1个用于记录设备号,另

9、1个用于记录寻找驱 动的信息,通常是一个指向驱动函数结构体的指针)。那么是谁生成节点并将它 链入链表的呢?当然是驱动程序! 七、构造和运行模块1、KernelModule 的特点模块只是先注册自己以便服务于将来的某个请求,然后就立即结束。模块可以是实现驱动程序,文件系统,或者其他功能。*加载模块后,模块运行在内核空间,和内核链接为一体。2、模块与内核的接口函数(除掉read、write等功能函数)生成节点并将它链入设备链表这个操作由驱动中的函数实现,这些函数什么时机运行呢?当然最合适的时机是内核加载模块(in smod模块)的时候。函数init_module :内核加载模块的时候调用。主要功能

10、是:为以后使用 模块里的函数和变量预先做准备函数cleanup_module :模块的第二个入口点,内核在模块即将卸载之前 调用它。3、操作模块相关的命令* insmod:加载模块。后面参数是模块文件名。#i nsmod/lib/modules/hello.koHello,world rmmod卸载模块。后面参数是模块名称#rmmodhello Goodbye,cruelworld lsmod :列出当前内核使用的模块。或者查看/proc/modules文件。 depmod 扫描 /lib/modules/目录下的所有内核模块,从而给内核模块生成依赖文件。o 生成 /lib/modules/v

11、kernelversio n/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:#lsmodModule#modprobes3c24xx_butt onsl

12、eds in itializedbutt onsin itialized#lsmodModules3c24xx_butto nsleds#rmmodledsrmmod:leds:Resourcetemporarily un available#rmmods3c24xx_butt onsbutt on sdriver uni oaded#lsmodModuleleds#rmmodledsledsdriver uni oaded#lsmodModule#in smods3c24xx_butt onss3c24xx_butt on s:U nknown symbolledoffs3c24xx_but

13、t on s:U nknown symbolled onin smod:ca nn oti nsert/lib/modules/s3c24xx_butt on s.ko:U nknown symboli nm odule(-1):Nosuchfileordirectory5944 0SizeSizeUsedbyUsedby3592 1s3c24xxSize Usedby 3592 0Size UsedbyNottai ntedNottai ntedbutt onsNottai ntedNottai ntedbutt on s.ko file name:s3c24xx butt on s.ko*

14、 modinfo :查看模块文件的基本信息denni sde nni s-desktop:/work/studydriver/butt on s$mod in fos3c24xx_lice nse: descripti on: author: depe nds: vermagic:GPLS3C2410/S3C2440BUTTONDriver2.6.22.6mod unloadARMv4YangZhu E-mail:4、内核模块的编译方法内核源码树:指的是内核源代码tar包解压缩后形成的目录(包含其下级所有目 录和文件)已编译内核源码树:指的是已经成功生成过内核的内核源码树(即:已经成功执行过makeulmage的内核源码树)驱动大多都编译为模块,2.6内核中要想编译模块,必须先存在已经成功编译了 的内核源码树(即:已编译内核源码树),且该源码树编译出来的内核就是该模 块即将运行在其上的内核。编译方法1:* 编写 Makefile : obj-m:=hello.o* 编译命令:make- C内核源码树目录 M=pwdmoduleso例如:denn isde nn is-desktop:/work/study

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号