设备驱动基础0:设备模型之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关系图如下:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值