文件系统

与设备驱动程序模型相关的特殊文件系统叫作 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)