与设备驱动程序模型相关的特殊文件系统叫作 sysfs ,通常挂载在 /sys
目录下,该目录下的子孙文件夹表示设备或者驱动程序,文件表示设备或者驱动的属性。
设备驱动程序模型的核心数据结构是 kobject 。设备驱动模型通过 kobject 来维护各个组件之间的层次关系和引用计数等属性。
/* kobject.h */
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; // 引用计数
...
}
kobject 一般通过嵌入到其他结构体的方式来使用,这点类似于OO中的“继承”,kobject相当于嵌入结构体的父类。kernel 实现中有很多地方使用这样的处理方式,例如说链表结构 list_head
。将 kobject 视为任何设备/驱动程序结构体的的顶级父类能够更好地理解整个模型。
struct uio_map {
struct kobject kobj;
struct uio_mem *mem;
};
如果我们想从一个已知的 kobject 对象推测出其 embed 的结构体,可以使用 container_of
宏:
container_of(kobj_pointer, type, member)