字符设备驱动框架.docx

字符设备驱动框架.docx

ID:34324611

大小:619.29 KB

页数:13页

时间:2019-03-05

字符设备驱动框架.docx_第1页
字符设备驱动框架.docx_第2页
字符设备驱动框架.docx_第3页
字符设备驱动框架.docx_第4页
字符设备驱动框架.docx_第5页
资源描述:

《字符设备驱动框架.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux中设备分类:按照对设备的访问方式可分为以下三类:1.字符设备(chardevice)(1)例如:键盘、鼠标、串口、帧缓存等;(2)通过/dev/下的设备节点访问;以字节为单位访问;(3)一般只支持顺序访问;(特例:帧缓存framebuffer)(4)无缓冲。2.块设备(blockdevice)(1)例如:磁盘、光驱、flash等;(2)以固定大小为单位访问:磁盘以扇区(512B)为单位;flash以页为单位。(3)支持随机访问;(4)有缓冲(减少磁盘IO,提高效率)。3.网络设备(networkdevice)(1)无设备文件(节点);(2)应用层通过s

2、ocket接口访问网络设备(报文发送和接收的媒介)。设备驱动在内核中的结构:1.VFS虚拟文件系统作用:向应用层提供一致的文件访问接口,正是由于VFS的存在,才可以将设备以文件的方式访问。2.虚拟文件系统,存在于内存中,不在磁盘上,掉电丢失。例如:/proc、/sys、/tmp。13设备号:1.作用:唯一地标识一个设备;2.类型:dev_tdevno;即32位无符号整型;3.组成:31主设备号major2019次设备号minor0(1)主设备号:用于区分不同类型(按功能划分)的设备;(2)此设备号:用于区分相同类型的不同设备。注意:相同类型的设备(主设备号相同)

3、可以使用同一个驱动。4.构建设备号:intmajor=250;intminor=0;(1)dev_tdevno=(major<<20)

4、minor;不建议使用;(2)利用宏来构建:dev_tdevno=MKDEV(major,minor);注意:我们可以通过文件$(srctree)/documentation/device.txt来查看内核对设备号的分配情况。(1)该文本中的有对应设备文件的设备号是已经被申请过的,我们不可以重复使用(申请);(2)从中可以看出,我们在编写驱动程序时可以使用的主设备号范围为240~254,为了方便记忆,通常使用250作为主设备号。

5、字符设备驱动框架:驱动:作用,为应用层提供访问设备的接口(对设备发的各种操作)。一、申请设备号1.构建设备号:dev_tdevno=MKDEV(major,minor);2.申请设备号:(1)动态申请:alloc_chrdev_region;(2)静态申请:register_chrdev_region。13(1)静态申请设备号的优缺点:优点:可以提前创建设备文件;缺点:有可能会发成冲突,导致申请失败。(2)register_chrdev_region函数详解:注意:①最后一个参数是设备名称。且在/proc/devices下会有关于当前系统已经注册成功的设备信息;

6、②申请设备号应在加载函数中实现;同时,在卸载函数中我们也要调用unregister_chrdev_region来释放设备号。一、实现操作集合structfile_operations{……}structfile_operations{structmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar__user*,size_t,l

7、off_t*);unsignedint(*poll)(structfiel*,poll_table*);int(*fasync)(int,structfile*,int);long(*unlock_ioctl)(structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*release)(structinode*,structfile*);int(*flush)(struc

8、tfile*,fl_owner_tid);int(*lock)(structfile*,int,structfile_lock*);……};除owner成员外,其他成员均是对文件进行相关操作的函数指针。131.对设备的大多数操作函数都有参数structfile*filp;2.在起始阶段我们可以先定义一个空的操作集合:structfile_operations{.owner=THIS_MODULE};注意:(1)可以看出宏THIS_MODULE代表结构体structmodule的起始地址;(2)我们可以通过“.=<……>,”

9、语法来给结构体指定成员赋

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。