设备模型二(Kobject, Kset)

  • 前言
    设备模型的讨论基于 linux 3.2.0内核版本,其实变动都不大
  • Kobject, kset基本概念
    一般来说应该这么理解,整个linux 的设备模型是一个OO 的体系结构,总线、设备和驱动
    都是其中鲜活存在的对象,kobject 是它们的基类,所实现的只是一些公共的接口,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基本结构。类似于C++中的基类,它嵌入于更大的对象的对象中–所谓的容器–用来描述设备模型的组件。如bus,devices, drivers 都是典型的容器。这些容器就是通过kobject连接起来了,形成了一个树状结构。这个树状结构就与/sys向对应。Kset是一个特殊的Kobject(因此它也会在”/sys/“文件系统中以目录的形式出现),它用来集合相似的Kobject(这些Kobject可以是相同属性的,也可以不同属性的)。Kobject,Kset的基本关系图如下图所示:
    这里写图片描述
  • Kobject结构体表示
struct kobject {
    const char      *name;  //设备名称
    struct list_head    entry; //将一系列相同的Kobj构成链表,如上图蓝线表示
    struct kobject      *parent; //不用解释
    struct kset     *kset; //不用解释
    struct kobj_type    *ktype; //定义了该obj对象的一组sysfs文件系统相关的操作,这个变量下面分析源码时会讨论
    struct sysfs_dirent *sd; //kobj所在目录的实体 其中sd->dir.kobj指向本obj,在下面分析代码中可以看到
    struct kref     kref;
    unsigned int state_initialized:1;
    unsigned int state_in_sysfs:1;
    unsigned int state_add_uevent_sent:1;
    unsigned int state_remove_uevent_sent:1;
    unsigned int uevent_suppress:1; //这个标示如果至1, event发送不了,在后面的章节中会有介绍
};

接下来介绍几个重要的函数,并通过源码进行分析
- kobject_add_internal
说明: 此函数要做是
1.建立kobj间的关系
2.向/sys反应目录间关系
首先调用此函数前, kobj是已经初始化好的

    if (kobj->kset) {
        if (!parent)
            parent = kobject_get(&kobj->kset->kobj);
        kobj_kset_join(kobj);
        kobj->parent = parent;
    }

上面代码含义: 如果kobj有Kset但是没有parent,就把kset当做parent,之后调用kobj_kset_join将kobj加到kset的list中
其次建立目录间关系
这里写图片描述
上图大致把建立目录的关系脉络画了一下,但实际情况并没有那么不堪,等后面章节讲关于class类的时候还会用到这个图,到时候可能会进行扩充
- sysfs_create_file
说明:创建一个属性文件, 此函数的参数有两个
1.kobj –>在kobj所在的目录下创建
2.属性文件–>用来描述文件的名字与读写权限
过程:函数的过程并不复杂
1.获取kobj的目录结构 sd
2.创建一个新的目录结构new_sd,名字为第二个参数
3.建立目录关系 new_sd->parent = sd

-kobject_init_and_add
说明: 生成kobject
过程: 前提生成了kobject(可以指定kset, 名称, ktype)
1.调用kobject_add_internal函数

-kobject_create_and_add
说明:kobject_init_and_add大致类似, 唯一不同的是调用此函数不用提前malloc kobject,不能指定 kset
过程:1.kobject_create函数调用,此函数malloc了一个koj, 赋默认的ktype结构
2.调用kobject_add函数—>kobject_add_internal
这些函数的说明是为了铺垫之后章节例子中的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值