LINUX设备驱动模型在2.4和2.6之间有非常大的变化。感觉最大的变化就是2.6中加入了一些面相对象的方法进行管理设备驱动,其实在LINUX中早就使用了该方法。
为了有一个全面的了解,今天特意理清了一下思路,为下一步进入分析打下基础。LINUX使用类似UINX方式管理设备驱动,把设备当作文件来看待,只是当针对设备进行操作时,会调用对应的设备驱动中的操作。这里主要是了解一下LINUX如何处理用户对驱动的使用的。牵涉到虚拟文件系统,其主要包含几个结构和结构对于的操作。主要如下:
1.super_block(超级块对象) 和对于的操作super_operations
2.inode(索引节点对象)和对应的操作inode_operations,该结构了包含了驱动程序用到的主设备号和次设备号,以及对于设备指针。
3.dentry(目录项对象)和dentry_operations,这个结构在写驱动时基本上没有涉及。
4.file(文件对象)和file_operations,相信这个我们大家都非常熟悉,写驱动的主要工作就是使用该文件对象对应的操作,在2.4版本基本就是这样。
另外还有一个结构就是cdev
有关代码就主要其中在fs目录下。可以去看看,但是不要走的太远,有个了解就可以了。
接下来就要分析设备驱动模型了,其实就是几个结构和将这连在一起的操作。主要有一下结构:
1.bus_type,描述总线的结构
2.class,设备分类结构,就是将属于某种类型的设备在一起管理,像所有的各种输入设备,就被统一规划为输入类。
3.device,具体或者虚拟的设备描述结构
4.device_driver,对于的设备驱动程序结构
该部分代码主要在drvier/base下面。
为了方面管理这些结构,又产生几个新的结构
1.kobject
2.kset,该结构为kobject一个集合,描述一类设备。
这两个结构的主要代码在lib中。
最后为了在用户空间可以获得有关设备信息和属性,又产生了sysfs文件系统,该文件系统是一个虚拟的文件系统,如同/proc,其在RAM空间中创建。我们可以通过该文件系统获得有关设备的信息。
这里主要了就是实现上面所讲到的虚拟文件系统中要求实现的接口,另外为了用户在获取设备对于的属性时需要实现各种包含attribut结构的属性操作。如bus_type,class,device等对于的结构属性结构,以及对于的显示和保存操作。
该部分代码有一部已经包含在drvier/base下面了,也就无需再阅读过多的代码,我们也不必过于追究sysfs的实现(代码在fs/sysfs下面),不然就走的太远了,当然有兴趣也可以阅读一下。
最后结合一下Documentation/driver-model和kobject.txt来进行辅助阅读,并可以看看samples下面的kobjects使用例程来理解有关kobject和kset的使用。当然还需要结合实际的驱动代码来进行理解,并试着去动手写一写,这也是我接下来将要做的事情。
以上只是一个大概的理解,肯定存在理解上的错误,希望以后能够理会的更清楚点。
linux驱动模型分析总括
最新推荐文章于 2024-08-23 17:44:29 发布