当前位置: 首页 > news >正文

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

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


kset与kobject基本介绍

  • 一、前言
  • 二、kobject、kset和设备的关系
    • 2.1 kset 结构体
    • 2.2 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设备框架中就是通过该成员来管理每一个设备的。

struct device {struct kobject kobj;......
};

2.1 kset 结构体

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

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 结构体定义:

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 文件系统中,集合和设备创建的目录结构。
请添加图片描述

相关文章:

  • Vue3 + TypeScript + Element Plus + el-input 输入框列表按回车聚焦到下一行
  • 【微信小程序】4、SpringBoot整合WxJava生成小程序码
  • CDN加速导致CLS升高图片托管服务器的3个选择标准!
  • 解密 Spring MVC:从 Tomcat 到 Controller 的一次完整请求之旅
  • Java求职者面试:Spring AI、MCP、RAG、向量数据库与Embedding模型技术解析
  • 世事无两全
  • 串口DMA + 环形缓冲,共用缓冲区
  • 使用Trace分析Android方法用时
  • Pyenv 跟 Conda 还有 Poetry 有什么区别?各有什么不同?
  • 在使用 HTML5 的 <video> 标签嵌入视频时,有时会遇到无法播放 MP4 文件的问题
  • python打卡day54@浙大疏锦行
  • 黑马教程强化day5-2
  • 【Node.js 的底层实现机制】从事件驱动到异步 I/O
  • 什么是Flink
  • 红队攻防渗透技术实战流程:信息打点-主机架构蜜罐识别WAF识别端口扫描协议识别服务安全
  • Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量
  • JVM 内存模型与垃圾回收机制全解析:架构、算法、调优实践
  • Minio 基于 bearer_token 监控
  • 【AI作画】用comfy ui生成漫画风图画
  • python调用 powershell 执行dir 并获取每行的length列属性值
  • 电商网站建设与运行/公司网站费用
  • 用织梦做网站调用乱码/上海最新新闻事件今天国内
  • wordpress 友言/徐州关键词优化排名
  • 网站建设项目策划/柳州今日头条新闻
  • 青岛模板建站多少钱/yandex引擎搜索入口
  • 山东网站建设开发维护/关键词调价工具哪个好