设备模型之kobject,kset及其关系

Linux2.6以后的设备驱动,都是在设备模型的基础上构建的,因此,要编写linux下的设备驱动程序,不论是usb设备,pci设备等,都需要了解设备模型。

设备模型的基础结构体主要是kobject,kset这两个结构体:

struct kobject {

   char      * k_name;

   char      name[KOBJ_NAME_LEN];

   struct kref    kref;

   struct list_head  entry;

   struct kobject    * parent;

   struct kset    * kset;

   struct kobj_type  * ktype;

   struct dentry     * dentry;

};

 

struct kset {

   struct subsystem  * subsys;

   struct kobj_type  * ktype;

   struct list_head  list;

   struct kobject    kobj;

   struct kset_hotplug_ops  * hotplug_ops;

};

 

还有一个subsys结构体,但subsys结构体跟kset差不多,就多了一个互斥访问信号量,因此,就不需要列出了,另外还有一个结构体

struct kobj_type {

   void (*release)(struct kobject *);

   struct sysfs_ops  * sysfs_ops;

   struct attribute  ** default_attrs;

 };

用来表示kobject,kset的类型。 

一个kobject结构如下图的kobject 类型部分,而一个kset结构如下图的kset 类型部分,一个kobject加入一个kset,主要是kobject结构体中的相关字段记录了对应的kset信息,①记录了kobject所对应kset,其所指向的是kset所包含的kobject的地址,②记录了kobject所对应的kset的kset指针,③记录了kobject的类型,④记录了kset所有的kobject的链子,这个链子是一个双向链表,每当有一个kobject加入到当前的kset,就会调用list_add_tail()函数,把要加入kset的kobject连入链表的结尾,最终形成一个链表。

当有另外一个kobject要加入当前的kset,其中的①②③步跟第一个加入当前kset的kobject是一样的,即把要加入的kobject的成员设置,使之指向当前的kset对应数据,而④需要把kobject添加到kset的list的尾部,下图表示了kobject b加入到kset A的图示:

当有一个kset,需要加入到当前的kset,其方法也跟一个kobject要加入到当前kset一样,即把要加入的kset中所包含的kobject的成员设置,使这些成员指向对应的kset的对应数据。而当前kset要加入另一个kset,其方式也是跟一个kset加入到当前kset一样,都是设备kset中的kobject,使kobject的成员指向要加入的kset的对应数据即可,下图显示了一个kset B加入到kset A中的图示。

一个简单的kset,kobject关系图如下:

时间: 2024-11-03 22:10:36

设备模型之kobject,kset及其关系的相关文章

内核设备模型从kobject到子系统

   内核设备模型 目的:表示设备和设备在系统中的拓扑关系 优点:1减少内核代码量,2可以统一查看所有设备状态和所连接的总线,3可以联系好设备和其对应的驱动,或者驱动对应的设备.4可以按类型分类,可以沿着叶子节点方向向根节点访问来保证正确关闭设备电源(先关目的节点的所有子节点,再关闭该节点) 设备模型的样子: 已经被用数据结构抽象了一遍.用户的角度可以从sys目录鸟瞰内核中的设备模型关系 通常sys下打开的 一级目录是不同的类型的子系统, ----------------------------

linux设备模型之kobject

kobject 结构 在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的 一个目录.从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C 语言并没有面向对象的语法,所以一般是把kobject内嵌到其他结构体里来实现类似的 作用,这里的其他结构体可以看作是kobject的派生类.Kobject为Linux设备模型提 供了很多有用的功能,比如引用计数,接口抽象,父子关系等等.引用计数本质上就 是利用kref实现的. 另外,Lin

Linux 设备模型之 kobject 内嵌结构

问题描述:前文我们知道了/sys是包含内核和驱动的实施信息的,用户可以通过 /sys 这个接口,用户通过这个接口可以一览内核设备的全貌.本文将从Linux内核的角度来看一看这个设备模型是如何构建的. 1.kobject 结构 在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录.从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C语言并没有面向对象的语法,所以一般是把kobject内嵌到其他结构体里来实现类似的作用,这

设备模型的基础---kobject,kset

设备模型的基础是kobject,kset,kobj_type.kobject本身并没有什么意义,真正有用的地方在于嵌入了kobject的结构体(对象),kobject可以看成是一个最小单元,sysfs的层次结构中的元素都是由kobject构成. kset与kobject的关系:kset会包含一类的kobject对象(内核链表串起来),而这些对象对应在sysfs中就是同一级的各个子目录,每一个kobject对象有自己的属性,这些属性就对应于各自子目录的文件.如此,就会构成一个有层次的组织结构.ks

Linux 设备模型之 (kobject、kset 和 Subsystem)(二)

问题描写叙述:前文我们知道了/sys是包括内核和驱动的实施信息的,用户能够通过 /sys 这个接口.用户通过这个接口能够一览内核设备的全貌.本文将从Linux内核的角度来看一看这个设备模型是怎样构建的. 1.kobject 结构 在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject相应sysfs里的一个文件夹. 从面向对象的角度来说.kobject能够看作是全部设备对象的基类,由于C语言并没有面向对象的语法,所以通常是把kobject内嵌到其它结构体里来实现类似的

Linux内核系列设备模型(一) Kobject与Kset

1.Kobject Kobject是设备驱动模型的核心结构,它使所有设备在底层都有统一的接口.在内核注册的kobject对象都会对应sysfs文件系统中的一个目录(目录名称有Kobject结构中k_name指定) struct kobject {     const char        * k_name; // 指向设备名称的指针     char            name[KOBJ_NAME_LEN]; // 设备名称     struct kref        kref; //引

20150223 IMX257 设备驱动模型之Kobject(一)

20150223 IMX257 设备驱动模型之Kobject(一) 2015-02-23 李海沿 接下来我们开始涉及设备驱动模型,从简入深,我们先写一个驱动,实现的功能就是在sys目录下建立一个目录和一个属性文件,可读可写. 所以今天的任务就是把这个程序搞定,只要把这几个结构体了解,知道有这个结构体就够了,很晚了,剩下的我们交给明天吧. 一.结构体参数解释 1. kobject kobject是设备驱动模型的基础.sysfs是基于kobject建立起来的. struct kobject{ con

20150225 IMX257 设备驱动模型之Kobject(三)

20150225 IMX257 设备驱动模型之Kobject(三) 2012-02-25 李海沿 刚才我们整理了一大批乏味的知识点,但是相信大家已经大概的了解了sysfs 的原理了. 这里我们趁热打铁,将前面我们那个似懂非懂的kobject程序一步拿下. 我们这个程序的目的是,在sys目录下面创建一个kboject_test目录和一个名为kobject_test的属性文件,我们可以使用cat去读取其文件名. 前面虽然解释了kobject程序的大概工作流程,这次我们再次详细的说明一下其工作流程,然

Linux设备模型——设备驱动模型和sysfs文件系统解读

本文将对Linux系统中的sysfs进行简单的分析,要分析sysfs就必须分析内核的driver-model(驱动模型),两者是紧密联系的.在分析过程中,本文将以platform总线和spi主控制器的platform驱动为例来进行讲解.其实,platform机制是基于driver-model的,通过本文,也会对platform机制有个简单的了解. 内核版本:2.6.30 1. What is sysfs? 个人理解:sysfs向用户空间展示了驱动设备的层次结构.我们都知道设备和对应的驱动都是由内