Linux设备文件浅析.doc

Linux设备文件浅析.doc

ID:53289593

大小:66.00 KB

页数:5页

时间:2020-04-03

Linux设备文件浅析.doc_第1页
Linux设备文件浅析.doc_第2页
Linux设备文件浅析.doc_第3页
Linux设备文件浅析.doc_第4页
Linux设备文件浅析.doc_第5页
资源描述:

《Linux设备文件浅析.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、linux下的文件分为常规文件和设备文件”常规文件一定在某一个设备上被存储,不论这个设备是真实的还是虚拟的,这里的设备是linux中vfs层中的设备,也就是前面所说的设备文件中的设备,vfs层的设备分为字符设备和块设备,字符设备可以类比为一个fifo的队列,无论读还是写都必须顺序进行,而块设备就可以随机进行读写,常规的文件一般都在块设备上被存储,包括设备文件本身也在一个块设备上被存储着,可以说vfs层解决了这种混乱,它提供给上面的操作者一个十分统一的接口,实际上vfs下面十分不雅,败絮其中吗?等你看了linux源

2、代码就不会这么认为了#linux内核是分层次的,vfs仅仅是其中的一个罢了,即使下面很乱也不是很无序的乱,总体看来是很乱,那是因为你混合看所有设备那当然混乱,因为字符设备和块设备的管理方式就不同,如果理一下思路就会很自然的想到在vfs接口下面有三条线,一条是常规文件,一条是字符设别文件,另一条就是块设备文件。linux用很好的数据结构组织了两类设备文件,对于字符设备比较简单,就是将所有的字符设备都置于一个map中,就是cdev_map,所有的字符设备在注册的时候都会加入这个map:intregister_chrd

3、ev(unsignedintmajor;constchar★name,structfile_operations*fops){structchar_device_struct*cd;structcdev*cdev;char*s;interr=-ENOMEM;cd=_register_chrdev_region(major/0,256,name);cdev=cdev_alloc();if(Icdev)gotoout2;cdev->owner=fops->owner;cdev->ops=fops;strcpy(cde

4、v->kobj.name,name);for(s=strchr(cdev->kobj.name,/);s;s=strchr(sf/))*s=err=cdev_add(cdev,MKDEV(cd->major,0),256);cd->cdev=cdev;returnmajor?0:cd->major;}注意这个map并不是一个字符设备的链表,而是一个hash表,这个map主要作用就是和2.6内核的新的设备模型联系,也就是和kobject联系Jinux中真正将所有的字符设备连成链表的是上面函数里面的char_devi

5、ce_struct结构体,很早以前写过一篇《谈谈Iinux2.6内核的驱动框架》中讲到驱动的两条线索,其中以kobject连接起来的第一条线索直取用户空间其实就是SJ了这里的这个map在这个map将把任务交给了vfs的接口。hash组织的kobj.map效率非常高,其实这里的hash函数很简单,就是设备号和255相除取余,将hash值相等的kobject用next字段连接成一个链表,然后在需要查找某些值的时候通过hash找到链表然后遍历链表通过一个回调函数进行精确比对最终找到需要的结构:structkobj_ma

6、p{structprobe{structprobe*next;dev_tdev;unsignedlongrange;structmodule*owner;kobj_probe_t勺et;〃这就是那个精确比对的回调函数,这个创意在于将比对策略一起放入了hash节点中z这样可以灵活实现不同的比对策略。int(*lock)(dev_tzvoid*);void*data;}*probes[255];//255个hash桶structrw_semaphore*sem;};每当打开一个字符设备时,从这个map中得到一个cde

7、v结构体,而cdev中有一个file_operations字段,在默认的open函数中,用这个file.operations字段替换字符设备的默认的file_operations字段,然后从此用户就可以用这个file_operations来操作字符设备了,这就是"狸猫换太子’了。对于块设备远远比字符设备复杂,但是看起来要比字符设备有层次感,块设别也有一个前面的hash表,只不过它里面映射的不是简单的vfs层的块设备了,而是更为底层通用块设备,就是gendisk,为何要这样?就是因为块设备可以利用缓存,这在linu

8、x中是很重要的,可以大大提高效率,因此必须在真正的块设备层上面提供一个统一的缓存管理的层次,最好和常规文件的缓存管理统一用一套机制,这样的结果就是block-device层次,其实block.device是一个vfs和gendisk之间的粘结层,可以为统一缓存管理机制提供更加统一的接口(gendisk很底层,不适合做这件事),为了和常规文件一致的管理缓存就必须一套和常规文

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

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

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