Linux设备框架:kset与kobject基本介绍

系列文章目录
Linux设备框架:kset与kobject基本介绍 [link]

Linux设备框架:kset与kobject源码分析 [link]


kset与kobject基本介绍


一、前言

Linux 设备模型如同一座拥有众多楼层(总线)和房间(设备)的摩天大楼,由内部主体(kset、kobject)和外部装饰(sysfs文件系统)构成。

kset和kobject是大楼主体的承重柱、横梁或者墙体,构成整座大楼框架,组织各楼层、房间。kobject连接各房间、楼层的通道,kset则对各楼层、房间按功能类型划分区域。sysfs文件系统是连接摩天大楼内外的纽带,它将摩天大楼内部各楼层、房间之间的层次关系展示给外面的世界(用户空间的程序),同时向外界提供了与大楼内部互动通道。

在驱动开发过程中,很多驱动开发者初遇 Linux 设备模型中的kset、kobject时,觉得非常抽象,难以理解。担心会因对其理解不透彻而影响驱动开发,因此而困感。

其实,对于顾客来说,在平常的逛街购物过程中,摩天大楼外部装饰(sysfs文件系统)和内部的楼层、房间(总线、设备、驱动)才是最常接触的。熟悉了楼层功能、房间布局就能在大楼中熟练的完成购物活动,顾客无需在意隐藏在内部的承重住、横梁(kset、kobject)是怎么设计的,这些一点也不影响逛街购物。

同理,在驱动开发过程中,驱动开发人员掌握了总线、设备、驱动,就能完成驱动开发任务。而内核中的 kset 和 kobject 是被封装在内部的一套管理设备的机制。执行总线、设备的相关的接口函数自动会完成 kset 和 kobject 层级的操作。因此,暂时对 kset 和 kobject 的不理解,也无需担心会影响驱动开发。

二、kobject、kset和设备的关系

Linux 设备框架引入集合的概念,用来管理同类型设备。所有同类设备通过链表组织在一起,形成一个集合。下面是设备结构体,包含了 kobject 成员,Linux设备框架中就是通过该成员来管理每一个设备的。

c 复制代码
struct device {
    struct kobject kobj;
    ......
};

2.1 kset 结构体

kset 的结构体比较简单,如下所示。它拥有 list 和 kobject 成员,Linux设备框架通过前者来管理集合中的所有设备,用后者来管理相关联的集合。

c 复制代码
struct kset {
    struct list_head list;
    spinlock_t list_lock;
    struct kobject kobj;
    const struct kset_uevent_ops *uevent_ops;
} __randomize_layout;

其中,list成员是设备链表的头节点;kobj成员是用来管理集合的kobject对象,和device中的kobject对象作用一样。

2.2 kobject 结构体

Kobject 的每一项成员都和设备管理框架相关,以下给出了 kobject 结构体定义:

c 复制代码
struct kobject {
    const char		   *name;
    struct list_head   entry;
    struct kobject     *parent;
    struct kset        *kset;
    struct kobj_type   *ktype;
    struct kernfs_node *sd; /* sysfs directory entry */
    struct kref        kref;
    ......
};
  • const char *name

    kobject 对象的名称,如果其拥有者是kset,则表示kset实例的名字;如果其拥有者是device,则表示设备的名字。如果该 kobject 对象的拥有者加入到内核,那么在sysfs文件系统中会创建一个以该名字命名的目录。

  • struct list_head entry

    用来将该 kobject 对象的拥有者通过该成员以链表的形式被管理。

  • struct kobject *parent;

    该成员指向该 kobject 对象拥有者的父对象,构建了各拥有者之间的层级关系。在sysfs文件系统中,该层级关系以 kobject 对象名字命名的目录间的层级关系呈现。

  • struct kset *kset;

    指向该 kobject 对象拥有者的所属集合,即kset实例,表示该拥有者属于哪个集合。

  • struct kobj_type *ktype

    定义了 kobject 对象的一组 sysfs 文件系统相关的操作函数和属性。其中,属性由内部成员struct attribute **default_attrs表示,同样该属性也会反映到sysfs文件系统中,以文件的形式在 kobject 对象名字命名的目录下呈现。

    通过该成员,让 C 中的 struct 数据类型具备了C++中 class 类型的某些特点,这里体现了基于C语言面向对象设计思想。各上层对象通过继承 kobject 的方式拥有 ktype,不同的 kobject 对象继承者会有不同的 ktype,用以体现不同拥有者的特质差异。

  • struct kernfs_node *sd

    用来指向该 kobject 对象在sysfs 文件系统中对应目录的实例,即以 kobject 对象名字命名的目录。

  • struct kref kref

    该成员用来表示 kobject 对象(对象拥有者)的引用计数,其核心数据是一原子型变量。内核通过该成员追踪kobject 对象的生命周期。

三、总结

Linux 设备框架中,将同类型的设备归类为一个集合,一个集合中拥有一个 kset 实例和若干设备,且以链表的形式管理。Kset 实例通过 kset.list 成员成为链表头节点;各设备通过 device.kobj.entry 成员以子节点身份挂在链表上。同样,父子关系的集合通过 kset.kobj.parent 连接在一起,父子关系的设备通过 device.kobj.parent 关联。详细介绍请阅读:《kset与kobject源码分析》。

1、以 devices_kset 为例一个集合的管理架构如下:

2、在 sysfs 文件系统中,集合和设备创建的目录结构。

相关推荐
豆是浪个1 小时前
Linux(Centos 7.6)命令详解:usermod
linux·运维·centos
极地星光2 小时前
网络检测:Linux下实时获取WiFi与热点状态
linux·网络
学不动CV了4 小时前
C语言32个关键字
c语言·开发语言·arm开发·单片机·算法
姜暮儿5 小时前
U盘直接拔出不在电脑上弹出有何影响
stm32·单片机·嵌入式硬件
还是奇怪5 小时前
Linux - 安全排查 3
android·linux·安全
NUZGNAW5 小时前
VMware安装Centos 7
linux·运维·centos
Another Iso5 小时前
CentOs 7 MySql8.0.23之前的版本主从复制
linux·mysql·centos
A7bert7775 小时前
【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
linux·c++·人工智能·python·yolo
筑梦之路6 小时前
linux 系统找出磁盘IO占用元凶 —— 筑梦之路
linux·运维·服务器
O。o.尊都假都7 小时前
STM32之LVGL移植
stm32·单片机·嵌入式硬件·freertos·lvgl