IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    techbulo发表于 2016-01-08 12:48:07
    love 0

    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连入链表的结尾,最终形成一个链表。

    kset_kobject关系

    kset_kobject关系

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

    增加一个kobject

    增加一个kobject

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

    添加一个KSET

    添加一个KSET

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

    一个简单的kset,kobject关系图

    一个简单的kset,kobject关系图



沪ICP备19023445号-2号
友情链接