设备与模块
1. 设备类型
在所有类Unix系统中设备也被当做文件对待,称作设备文件。而且成了几类:块设备、字符设备、网络设备、伪设备等。
- 块设备blkdev:可以寻址、可以随机访问、以块为单位,如硬盘。
- 字符设备cdev:不可寻址、顺序访问,如键盘、鼠标。
- 网络设备:通过一个物理适配器和一种特定协议提供对网络的访问。
2. 模块
linux是”Monolithic kernel“,但是Linux内核是模块化组成的,组成动态加载模块,内核运行时动态加载或删除模块。
linux内核采用kbuild构建系统,搜索”Kbuild分析.pdf“,一份很好的学习资料。
3. 设备模型
设备模型提供了一个独立的机制专门表示设备,描述其在系统中的拓扑结构,优点:
- 代码重复最小化
- 提供诸如引用计数这样的统一机制
- 列举系统中所有设备,观察它们的状态,链接的总线
- 将系统中的全部设备结构以树的形式展现
- 联系设备和驱动
- 将设备按类型归类
- 可以沿设备树的叶子向其根方向遍历,以保证正确顺序关闭设备电源
kobject
设备模型的核心部分是kobject(kenel object)结构,定义在linux/kobject.h,kobject提供了引用计数、名称和父指针等字段,可以创建对象的层次结构,sysfs文件系统就是kobject的展现形式。
|
|
kref
kref结构体实现了引用计数机制,定义在linux/kref.h
3. sysfs
sysfs文件系统是只在内存中的虚拟文件系统,它提供了kobject对象层次结构的视图。帮助用户观察系统中各设备的拓扑结构,借助属性对象,kobject可以导出文件的方式,将内核变量提供给用户读取或写入。
拓展阅读: