设备模型-kobject详解

/*整理于2012.11.29于广工大 */

 

先说说sysfs

 

      sysfs文件系统是一个处于内存中的虚拟文件系统,它为我们提供了kobject对象层次结构的视图。帮助用户可以以一个简单文件系统的方式来观察系统中各种设备的拓扑结构。

 

      借助属性对象,kobject可用导出文件的方式,将内核变量提供给用户读取或写入。

 

      sysfs的诀窍是把kobject对象与目录项紧密联系起来,这点是通过kobject中的dentrydirectory entry)字段实现的。

      dentry结构体表示目录项,通过连接kobject到指定的目录项上,无疑方便的将kobject映射到该目录上。

      kobject其实已经形成了一棵树了——就是我们心爱的对象模型体系。

 

      sysfs的根目录下包含了七个子目录:blockbusclassdevicesfirmwaremodulepower

 

      block目录下的每个子目录都对应着系统中的一个块设备。反过来,每个目录下又都包含了该块设备的所有分区。

 

      bus目录提供了一个系统总线视图。

 

      class目录包含了以高层功能逻辑组织起来的系统设备视图。

 

      devices目录是系统中设备拓扑结构视图,它直接映射出了内核中设备结构体的组织层次。

 

      firmware目录包含一些诸如ACPIEDDEFI等低层子系统的特殊树。

 

      power目录包含了系统范围的电源管理数据。

 

 

      sysfs组织结构,进入sysfs目录中。有block bus class dev devices firmware fs kernel module power这些目录。

      具体代表看名字差不多就可以看出。在层次结构上,假如有一个设备A。将有一个名称为A的目录。A设备是在B总线上。

      A设备应该在bus目录下的B总线下。A设备肯定会有设备的属性(ktype),例如是音频设备则应该有音量属性,

      则音量属性将在A设备目录下有个音量属性文件。在使用设备时,如果要改变音量大小,则可以写属性文件入音量指。

      得到音量大小时,可以读取属性文件中的音量值。

 

      入正题,kobject.

 

KobjectLinux 2.6引入的新的设备管理机制,在内核中由struct kobject表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基本结构。

 

      上层结构例如device,device_driver,bus_type都嵌入了一个kobject,这相当于面向对象程序设计机制中的继承机制。

      

      kobject 结构为一些大的数据结构和子系统提供了基本的对象管理,避免了类似机能的重复实现。这些机能包括

      - 对象引用计数.

      - 维护对象链表(集合).

      - 对象上锁.

      - 在用户空间的表示.

 

kobject结构定义:

 

      struct kobject {

             const char              *name;/*名称*/

             struct list_head        entry;/*用于链入所属的kset的链表*/

             struct kobject          *parent;/*object*/

             struct kset             *kset;/*所属kset*/

             struct kobj_type        *ktype;/*所属ktype*/

             struct sysfs_dirent     *sd;/*sysfs中的目录项*/

             struct kref             kref;/*生命周期(引用计数)管理*/

             unsigned int state_initialized:1;/*标记:初始化*/

             unsigned int state_in_sysfs:1;/*标记:在sysfs*/

             unsigned int state_add_uevent_sent:1;/*标记:已发出KOBJ_ADD uevent*/

             unsigned int state_remove_uevent_sent:1;/*标记:已发出的KOBJ_REMOVE uevent*/

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值