linux设备模型之kobject、kset和kobj_type

kojbect

设备模型的核心部分就是kobject,它由structobject表示。Kobject类似于java语言的对象object类,提供诸如引用计数、名称和父指针等字段,可以创建对象的层次结构。

         其结构如下:

         struct kobject {

              constchar            *name;

              structlist_head    entry;

              structkobject              *parent;

              structkset            *kset;

              structkobj_type   *ktype;

              structsysfs_dirent      *sd;

              structkref            kref;

              unsignedint state_initialized:1;

              unsignedint state_in_sysfs:1;

              unsignedint state_add_uevent_sent:1;

              unsignedint state_remove_uevent_sent:1;

              unsignedint uevent_suppress:1;

};

  • name:该kobject的名字,会作为文件名出现在对应的sysfs中
  • entry:链表元素,用于将该kobject链接到它所属的kset的链表中。
  • parent:指向该对象的父对象
  • kset:如果该对象属于一个kset,则指向所属的kset
  • ktype:包含了类型信息,包括该对象的操作函数指针以及销毁该对象时的释放函数
  • sd:该对象对应的sysfs节点数据结构
  • kref:引用计数

几个比特域的含义是正如名字所示,分别表示kobject是否初始化了,是否在sysfs中,是否发送过KOBJ_ADD消息,是否发送过KOBJ_REMOVE消息,是否禁止发送uevent

kobject的初始化一般来说需要经过如下几个步骤:

1)     首先将整个kobject清空(使用memset函数);

2)     初始化kobjectparentkset字段,调用kobject_set_name设置kobject的名字,这个名字是sysfs入口使用的名字;

3)     调用kobject_init函数初始化kobject,这里需要提供一个kobj_type变量。kobject_init函数会增加kobject的引用计数。

以上的多步操作也可以有kobject_create()自动处理,它返回一个新分配的kobject。多数情况下应该使用kobject_create及其相关的辅助函数。

 

ktype

kobject对象被关联到一种特殊的类型,即ktypekernel object type的缩写)。ktypekobj_type结构体表示,其定义如下:

struct kobj_type {

       void (*release)(struct kobject*kobj);

       const struct sysfs_ops*sysfs_ops;

       struct attribute**default_attrs;

       const structkobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);

       const void*(*namespace)(struct kobject *kobj);

};

  • ktype用来表示一类kobject的公共内容,主要包括了对该kobject进行操作相关的函数指针信息。每个kobject都要有一个对应的kobj_type结构,在kobject_init或者kobject_init_and_add调用时给出。   
  • release:函数指针,该类kobject的销毁函数。
  • sysfs_ops:包含了如何实现kobject的属性信息的函数指针
  • default_attrs:默认属性链表,这些属性会在这类kobject创建时自动被创建

kset

         ket是kobject对象的集合体。把它看成一个容器,可将所有相关的kobject对象置于同一个位置。ktype描述相关类型kobject所共有的特性,而kset把kobject集中到一个集合中,具有相同ktype的kobject可以被分组到不同的kset。就是说在linux内核中,只有少数一些的ktype,却有多个kset。

         kobject中的kset之中指向相应的kset集合。kset集合有kset结构体表示,定义如下:

         structkset {

                  struct list_head list;

                  spinlock_t list_lock;

                  struct kobject kobj;

                  const struct kset_uevent_ops*uevent_ops;

};

  • list:子kobject链表
  • list_lock:保护链表的自旋锁
  • kobj:kset内嵌的kobject,kset的子kobject的parent会指向它。
  • uevent_ops:该kset的uevent(user event)操作函数集,用于处理集合中kobject对象的热插拔操作,提供一种与用户空间热插拔信息进行通信的机制。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值