论坛网站用的虚拟主机,wordpress视频主题吾爱破解,人力外包项目发布平台,公司网站制作导航系列文章目录 Linux设备框架#xff1a;kset与kobject基本介绍 [link] Linux设备框架#xff1a;kset与kobject源码分析 [link] kset与kobject基本介绍 一、前言二、kobject、kset和设备的关系2.1 kset 结构体2.2 kobject 结构体 三、总结 一、前言
Linux 设备模型如同一座拥…系列文章目录 Linux设备框架kset与kobject基本介绍 [link] Linux设备框架kset与kobject源码分析 [link] kset与kobject基本介绍 一、前言二、kobject、kset和设备的关系2.1 kset 结构体2.2 kobject 结构体 三、总结 一、前言
Linux 设备模型如同一座拥有众多楼层总线和房间设备的摩天大楼由内部主体kset、kobject和外部装饰sysfs文件系统构成。
kset和kobject是大楼主体的承重柱、横梁或者墙体构成整座大楼框架组织各楼层、房间。kobject连接各房间、楼层的通道kset则对各楼层、房间按功能类型划分区域。sysfs文件系统是连接摩天大楼内外的纽带它将摩天大楼内部各楼层、房间之间的层次关系展示给外面的世界用户空间的程序同时向外界提供了与大楼内部互动通道。
在驱动开发过程中很多驱动开发者初遇 Linux 设备模型中的kset、kobject时觉得非常的抽象难以理解。担心会因对其理解不透彻而影响驱动开发的困感。
其实对于顾客来说在平常的逛街购物过程中摩天大楼外部装饰sysfs文件系统和内部的楼层、房间总线、设备、驱动才是最常接触的。熟悉了楼层功能、房间布局就能在大楼中熟练的完成购物活动顾客无需在意隐藏在内部的承重住、横梁kset、kobject是怎么设计的这些一点也不影响逛街购物。
同理在驱动开发过程中驱动开发人员掌握了总线、设备、驱动就能完成驱动开发任务。而内核中的 kset 和 kobject 是被封装在内部的一套管理设备的机制。执行总线、设备的相关的接口函数自动会完成kset 和 kobject层级的操作。因此暂时对 kset 和 kobject 的不理解也无需担心会影响驱动开发。
二、kobject、kset和设备的关系
Linux 设备框架引入集合的概念用来管理同类型设备。所有同类设备通过链表组织在一起形成一个集合。下面是设备结构体包含了 kobject 成员Linux设备框架中就是通过该成员来管理每一个设备的。
struct device {struct kobject kobj;......
};2.1 kset 结构体
kset 的结构体比较简单如下所示。它拥有 list 和 kobject 成员Linux设备框架通过前者来管理集合中的所有设备用后者来管理相关联的集合。
struct kset {struct list_head list;spinlock_t list_lock;struct kobject kobj;const struct kset_uevent_ops *uevent_ops;
} __randomize_layout;其中list成员是设备链表的头节点kobj成员是用来管理集合的kobject对象和device中的kobject对象作用一样。
2.2 kobject 结构体
Kobject 的每一项成员都和设备管理框架相关以下给出了 kobject 结构体定义
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;......
};const char *name kobject 对象的名称如果其拥有者是kset则表示kset实例的名字如果其拥有者是device则表示设备的名字。如果该 kobject 对象的拥有者加入到内核那么在sysfs文件系统中会创建一个以该名字命名的目录。 struct list_head entry 用来将该 kobject 对象的拥有者通过该成员以链表的形式被管理。 struct kobject *parent; 该成员指向该 kobject 对象拥有者的父对象构建了各拥有者之间的层级关系。在sysfs文件系统中该层级关系以 kobject 对象名字命名的目录间的层级关系呈现。 struct kset *kset; 指向该 kobject 对象拥有者的所属集合即kset实例表示该拥有者属于哪个集合。 struct kobj_type *ktype 定义了 kobject 对象的一组 sysfs 文件系统相关的操作函数和属性。其中属性由内部成员struct attribute **default_attrs表示同样该属性也会反映到sysfs文件系统中以文件的形式在 kobject 对象名字命名的目录下呈现。 通过该成员让 C 中的 struct 数据类型具备了C中 class 类型的某些特点这里体现了基于C语言面向对象设计思想。各上层对象通过继承 kobject 的方式拥有 ktype不同的 kobject 对象继承者会有不同的 ktype用以体现不同拥有者的特质差异。 struct kernfs_node *sd 用来指向该 kobject 对象在sysfs 文件系统中对应目录的实例即以 kobject 对象名字命名的目录。 struct kref kref 该成员用来表示 kobject 对象对象拥有者的引用计数其核心数据是一原子型变量。内核通过该成员追踪kobject 对象的生命周期。
三、总结
Linux 设备框架中将同类型的设备归类为一个集合一个集合中拥有一个 kset 实例和若干设备且以链表的形式管理。Kset 实例通过 kset.list 成员成为链表头节点各设备通过 device.kobj.entry 成员以子节点身份挂在链表上。同样父子关系的集合通过 kset.kobj.parent 连接在一起。