Linux设备模型的基础框架是基于 , kset 和 三个基础数据结构实现的。这篇主要分析这三个基础数据结构的做用,以及相互之间的关系。node
1,:数据结构
{
const char *name; // 该的名字,用于 sysfs 文件系统下的文件夹名字
entry; // 同类型 链表节点
*; // 指向父节点 kset 的
kset *kset; // 同类型的集合
*ktype; // 的属性操做方法,以及 方法
sd; / sysfs entry */ // 该 在sysfs文件系统下的节点
kref kref; // 引用计数
#ifdef
;
#endif
int :1;
int :1;
int t:1;
int sent:1;
int :1;
};框架
是最基础的数据结构,从上述字段定义中,能够看出这个结构包含以下功能:dom
(1)引用计数功能。一个可能表明一个总线,设备或驱动等,这些实例在内核空间可能会被多个调度实体或对象指针引用,所以用一个引用计数结构 kref 来记录当前有多少对象引用该 ,当 kref 的引用计数减为0时,内核接口自动调用用户指定的接口销毁该对象。kref 数据结构的本质就是一个类型的对象,内核提供了 () 和 () 两个接口用于对引用计数自增和自减:ui
kref {
;
};atom
{
refs; // 本质上就是一个 类型的字段
} ;spa
接口:指针
void ( kref *kref)
{
(&kref->); // kref 自增
}对象
int ( kref kref, void ()( kref *kref))
{
if (t(&kref->)) { // kref 自减
(kref); // 若是减完以后为0,释放该 kref 对象
1;
}
0;
}blog
(2)链表组织结构功能。多个对象连接在一个kset下java 数据结构,造成一个循环双向链表。字段entry是双向链表节点,kset指向该所属的kset,通常指向kset中的。
(3)sysfs接口。一个表示sysfs文件系统中的一个目录,方便用户在用户态访问内核态数据结构。字段sd表示该在sysfs中的入口项,name表示表示的目录名称java 数据结构,ktype表示该目录的操做接口,包含对象的接口,以及该目录下属性文件的读写接口。
2,kset:
kset {
list; // 用于链接该kset下全部的链表节点
;
kobj; // 一个kset本质上也是一个
const *; // 内核事件上报用户态接口,通常用于驱动的热插拔事件上报
} ;
一个kset表示全部同类型的的集合。kset内部经过包含一个,用来同其下挂的全部组成一个双向循环链表。同时其下挂的全部的都指向kset中包含的这个。是内核事件上报用户态机制,多用于设备和驱动的热插拔事件上报。
3,:
{
void ()( kobj); // 同类型对象的释放接口
const *; // 属性文件的读写接口
**; // 的属性
const ons ()( *kobj);
const void ()( *kobj);
void ()( kobj, uid, gid);
};
一个主要用来定义的属性文件的读写接口,以及对象的释放操做。
2,经过上述分析,咱们能够画出 ,kset 和 之间的关系:
3,总结一下:/kset一般用于其余对象结构的内置结构java 数据结构-Kernel 设备模型基础框架kobject,如设备和驱动数据结构一般都包含一个结构,实现引用计数,设备层次结构和sysfs操做等。