第十七章 设备与模块

设备与模块

1. 设备类型

在所有类Unix系统中设备也被当做文件对待,称作设备文件。而且成了几类:块设备、字符设备、网络设备、伪设备等。

  • 块设备blkdev:可以寻址、可以随机访问、以块为单位,如硬盘。
  • 字符设备cdev:不可寻址、顺序访问,如键盘、鼠标。
  • 网络设备:通过一个物理适配器和一种特定协议提供对网络的访问。

2. 模块

linux是”Monolithic kernel“,但是Linux内核是模块化组成的,组成动态加载模块,内核运行时动态加载或删除模块。

linux内核采用kbuild构建系统,搜索”Kbuild分析.pdf“,一份很好的学习资料。

make构建系统

内核模块例子

3. 设备模型

设备模型提供了一个独立的机制专门表示设备,描述其在系统中的拓扑结构,优点:

  • 代码重复最小化
  • 提供诸如引用计数这样的统一机制
  • 列举系统中所有设备,观察它们的状态,链接的总线
  • 将系统中的全部设备结构以树的形式展现
  • 联系设备和驱动
  • 将设备按类型归类
  • 可以沿设备树的叶子向其根方向遍历,以保证正确顺序关闭设备电源

kobject
设备模型的核心部分是kobject(kenel object)结构,定义在linux/kobject.h,kobject提供了引用计数、名称和父指针等字段,可以创建对象的层次结构,sysfs文件系统就是kobject的展现形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct kobject {
const char *name;
struct list_head entry;
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct kernfs_node *sd; /* sysfs directory entry */
struct kref kref;
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
struct delayed_work release;
#endif
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};

kref
kref结构体实现了引用计数机制,定义在linux/kref.h

3. sysfs

sysfs文件系统是只在内存中的虚拟文件系统,它提供了kobject对象层次结构的视图。帮助用户观察系统中各设备的拓扑结构,借助属性对象,kobject可以导出文件的方式,将内核变量提供给用户读取或写入。

拓展阅读: