linux设备驱动结构梳理
来源:互联网 发布:农村淘宝服务站 昆山 编辑:程序博客网 时间:2024/06/08 06:09
最近为了学习Android底层设备驱动而把Linux底层设备驱动复习整理了一下。
Linux设备驱动程序是一个内核模块,可以随时添加到内核和随时从内核中删除。很自然,在模块被他人使用时无法删除,因而存在一个模块被使用的计数器。
对比vxWorks/Linux/QNX/OSE等等系统的设备驱动程序,万变不离其宗,任何系统的驱动层界面应该有如下根本的东西:
1、OS系统必定有某种设备链表,并有某种挂入函数能够将一个新设备及其驱动程序挂入这个链表。
2、从OS往下看,设备必定会提供一套读写接口。
找到这两者就摸清了这个OS体系的驱动脉络,其他细节可以顺藤摸瓜找出来。对应上述1,设备及驱动挂入函数往往类似dev_register(dev_num, dev_attr)和drv_register(dev_num, drv_funcs_pointer),Linux体系的字符设备的对应函数是cdev_add()。对应上述2,驱动软件必须提供类似open/read/write/set/close之类函数,Linux把普通非网络设备当文件看待,故这类函数接口和文件操作函数接口一致。
Linux有一个设备链表,这已经足够,但是为了更好地观察和管理设备及驱动而发展了统一设备模型,其核心数据结构是kobject和kset。
每一个设备对应一个kobject结构,设备被使用的计数器也在这个结构里面。kset是一组相近设备集合的父节点结构,"a set of"在英文中是“一套”的意思,我猜测kset里面的set就是这个“套”的意思。
一组相近设备集合中每个kobject的父指针都指向其kset,而kset有个指针指向这个设备集合的第一个kobject,这个kobject的next指针指向第二个kobject,类推,所有kobject被这样的链表串接。
由于kset下属这组设备类型近似,所以kset结构链接一个kobj_type结构,在这个type结构中统一描述了组内所有设备的type情况。单个kobject内的type信息可能被忽略。
由于kset管理一组kobject,故存在将kobject添加到kset的接口,以及对应的删除接口,可能还有查询接口。
若干相近的kset组成一个驱动子系统subsystem,比如多种输入设备组成的输入子系统。
通过kset/kobject/kobj_type/subsystem等,所有设备组成了一颗设备树,这样Linux系统可以方便地查看整个系统的设备的层次和从属情况,可能还有分类统计情况。
进一步,Linux将这种树形结构对应成一个虚拟的,也即内存中的文件目录树结构,即sysfs。其中大多数目录都对应设备树,其中最深一层子目录对应一个设备,该目录中的文件对应设备的属性attr。另外sysfs还有设备的类视图class目录等,不过这些并非理解Linux设备驱动结构的关键。
Linux设备驱动程序是一个内核模块,可以随时添加到内核和随时从内核中删除。很自然,在模块被他人使用时无法删除,因而存在一个模块被使用的计数器。
对比vxWorks/Linux/QNX/OSE等等系统的设备驱动程序,万变不离其宗,任何系统的驱动层界面应该有如下根本的东西:
1、OS系统必定有某种设备链表,并有某种挂入函数能够将一个新设备及其驱动程序挂入这个链表。
2、从OS往下看,设备必定会提供一套读写接口。
找到这两者就摸清了这个OS体系的驱动脉络,其他细节可以顺藤摸瓜找出来。对应上述1,设备及驱动挂入函数往往类似dev_register(dev_num, dev_attr)和drv_register(dev_num, drv_funcs_pointer),Linux体系的字符设备的对应函数是cdev_add()。对应上述2,驱动软件必须提供类似open/read/write/set/close之类函数,Linux把普通非网络设备当文件看待,故这类函数接口和文件操作函数接口一致。
Linux有一个设备链表,这已经足够,但是为了更好地观察和管理设备及驱动而发展了统一设备模型,其核心数据结构是kobject和kset。
每一个设备对应一个kobject结构,设备被使用的计数器也在这个结构里面。kset是一组相近设备集合的父节点结构,"a set of"在英文中是“一套”的意思,我猜测kset里面的set就是这个“套”的意思。
一组相近设备集合中每个kobject的父指针都指向其kset,而kset有个指针指向这个设备集合的第一个kobject,这个kobject的next指针指向第二个kobject,类推,所有kobject被这样的链表串接。
由于kset下属这组设备类型近似,所以kset结构链接一个kobj_type结构,在这个type结构中统一描述了组内所有设备的type情况。单个kobject内的type信息可能被忽略。
由于kset管理一组kobject,故存在将kobject添加到kset的接口,以及对应的删除接口,可能还有查询接口。
若干相近的kset组成一个驱动子系统subsystem,比如多种输入设备组成的输入子系统。
通过kset/kobject/kobj_type/subsystem等,所有设备组成了一颗设备树,这样Linux系统可以方便地查看整个系统的设备的层次和从属情况,可能还有分类统计情况。
进一步,Linux将这种树形结构对应成一个虚拟的,也即内存中的文件目录树结构,即sysfs。其中大多数目录都对应设备树,其中最深一层子目录对应一个设备,该目录中的文件对应设备的属性attr。另外sysfs还有设备的类视图class目录等,不过这些并非理解Linux设备驱动结构的关键。
- linux设备驱动结构梳理
- Linux字符设备驱动结构
- linux字符设备驱动结构
- Linux字符设备驱动结构
- Linux字符设备驱动结构
- Linux字符设备驱动结构
- linux-设备驱动之device设备结构
- linux设备驱动之UART驱动结构
- Linux设备驱动之UART驱动结构
- Linux设备驱动之UART驱动结构
- Linux设备驱动之UART驱动结构
- 第六章 linux字符设备驱动结构
- Linux--字符设备驱动结构框图
- Linux设备驱动编程之结构化设备驱动程序
- Linux驱动开发学习--字符设备驱动结构
- Linux设备驱动——字符驱动各种结构体
- linux驱动:[2]字符设备驱动memdev(cdev结构解析)
- 【USB设备】AC充电驱动调用梳理
- .Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(2)
- 《Linux那些事儿之我是USB》我是U盘(17)冬天来了,春天还会远吗?(三)
- Oracle内置角色connect与resource的权限
- 步骤一:申请域名
- Current Issues and Trends in Meshing and Geometric Processing for Computational Engineering Analyses
- linux设备驱动结构梳理
- 一个不错的书籍分享网站
- 步骤二:买空间或者用自己电脑做服务器
- hdu acm steps 1.3.5
- Wireshark检测不到网卡解决方案
- Android 软件管理器的开发1
- Delphi 使用HLP文件制作系统的帮助文档
- hdu acm steps 1.3.6
- 步骤三:域名解析,收尾