0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

linux设备模型数据结构分析

麦辣鸡腿堡 来源:LoyenWang 作者:LoyenWang 2023-09-28 14:44 次阅读

数据结构

图片

2.1 kobject

  • kobject代表内核对象,结构体本身不单独使用,而是嵌套在其他高层结构中,用于组织成拓扑关系;
  • sysfs文件系统中一个目录对应一个kobject

看看结构体吧:

struct kobject {
	const char		*name;                  /* 名字,对应sysfs下的一个目录 */
	struct list_head	entry;               /* kobject中插入的 list_head结构,用于构造双向链表 */
	struct kobject		*parent;            /* 指向当前kobject父对象的指针,体现在sys中就是包含当前kobject对象的目录对象 */
	struct kset		*kset;                    /* 当前kobject对象所属的集合 */
	struct kobj_type	*ktype;            /* 当前kobject对象的类型 */
	struct kernfs_node	*sd;              /* VFS文件系统的目录项,是设备和文件之间的桥梁,sysfs中的符号链接是通过kernfs_node内的联合体实现的 */
	struct kref		kref;                     /* kobject的引用计数,当计数为0时,回调之前注册的release方法释放该对象 */
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
	struct delayed_work	release;
#endif
	unsigned int state_initialized:1;                /* 初始化标志位,初始化时被置位 */
	unsigned int state_in_sysfs:1;                  /* kobject在sysfs中的状态,在目录中创建则为1,否则为0 */
	unsigned int state_add_uevent_sent:1;      /* 添加设备的uevent事件是否发送标志,添加设备时向用户空间发送uevent事件,请求新增设备 */
	unsigned int state_remove_uevent_sent:1;  /* 删除设备的uevent事件是否发送标志,删除设备时向用户空间发送uevent事件,请求卸载设备 */
	unsigned int uevent_suppress:1;              /* 是否忽略上报(不上报uevent) */
};

2.2 kset

  • kset是包含多个kobject的集合;
  • 如果需要在sysfs的目录中包含多个子目录,那需要将它定义成一个kset
  • kset结构体中包含struct kobject字段,可以使用该字段链接到更上一层的结构,用于构建更复杂的拓扑结构;
  • sysfs中的设备组织结构很大程度上根据kset组织的,/sys/bus目录就是一个kset对象,在Linux设备模型中,注册设备或驱动时就将kobject添加到对应的kset中;
struct kset {
	struct list_head list;        /* 包含在kset内的所有kobject构成一个双向链表 */
	spinlock_t list_lock;
	struct kobject kobj;       /* 归属于该kset的所有的kobject的共有parent */
	const struct kset_uevent_ops *uevent_ops;    /* kset的uevent操作函数集,当kset中的kobject有状态变化时,会回调这个函数集,以便kset添加新的环境变量或过滤某些uevent,如果一个kobject不属于任何kset时,是不允许发送uevent的 */
} __randomize_layout;

2.3 ktype

  • kobj_type用于表征kobject的类型,指定了删除kobject时要调用的函数,kobject结构体中有struct kref字段用于对kobject进行引用计数,当计数值为0时,就会调用kobj_type中的release函数对kobject进行释放,这个就有点类似于C++中的智能指针了;
  • kobj_type指定了通过sysfs显示或修改有关kobject信息时要处理的操作,实际是调用show/store函数;
struct kobj_type {
	void (*release)(struct kobject *kobj);     /* 释放kobject对象的接口,有点类似面向对象中的析构 */
	const struct sysfs_ops *sysfs_ops;        /* 操作kobject的方法集 */
	struct attribute **default_attrs;
	const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
	const void *(*namespace)(struct kobject *kobj);
};


struct sysfs_ops {      /* kobject操作函数集 */
	ssize_t	(*show)(struct kobject *, struct attribute *, char *);
	ssize_t	(*store)(struct kobject *, struct attribute *, const char *, size_t);
};


/* 所谓的attribute就是内核空间和用户空间进行信息交互的一种方法,例如某个driver定义了一个变量,却希望用户空间程序可以修改该变量,以控制driver的行为,那么可以将该变量以sysfs attribute的形式开放出来 */
struct attribute {
	const char		*name;
	umode_t			mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
	bool			ignore_lockdep:1;
	struct lock_class_key	*key;
	struct lock_class_key	skey;
#endif
};

可以看一下kobject创建的时候,与ktype的关系,这样理解起来更顺:

图片

  • kobject在创建的时候,默认设置kobj_type的值为dynamic_kobj_ktype,通常kobject会嵌入在其他结构中来使用,因此它的初始化跟特定的结构相关,典型的比如struct devicestruct device_driver
  • /sys文件系统中,通过echo/cat的操作,最终会调用到show/store函数,而这两个函数的具体实现可以放置到驱动程序中;

2.4 结构关系

为了更形象的说明这几个结构体的关系,再来一张图:

图片

  • kset既是kobject的集合,本身又是一个kobject,进而可以添加到其他的集合中,从而就可以构建成复杂的拓扑结构,满足/sys文件夹下的文件组织需求;

如果只看kset/kobject的数据结构组织,可能还是会迷惑,它怎么跟Linux的设备模型相关?这时就不得不提到Linux内核中一个很精妙的存在container_of,它可以通过成员变量的地址来获取所在结构的地址信息。前文提到过kobject/kset结构本身不会单独使用,通常都是会嵌套在其他结构中,既然kobjcet/kset能组织成拓扑结构,那么包含它们的结构同样可以构建这个关系,因为可以通过container_of就可以找到结构体的首地址。

图片

  • 结构体A、B、C、D、E同样可以构建拓扑结构关系;
  • struct devicestruct device_driver结构体中都包含了struct kobject,而struct bus_type结构体中包含了struct kset结构,这个也就对应到前文提到的设备和驱动都添加到总线上,由总线来负责匹配;
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4982

    文章

    18286

    浏览量

    288479
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206737
  • 设备
    +关注

    关注

    2

    文章

    4172

    浏览量

    69267
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47689
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39900
收藏 人收藏

    评论

    相关推荐

    数据结构与算法分析(Java版)(pdf)

    数据结构与算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java数据结构和算法中文第二
    发表于 12-20 21:22

    数据结构与算法分析

    数据结构与算法分析
    发表于 06-05 10:46

    C#数据结构和算法分析_ 魏宝刚

    数据结构与算法分析》描述了各种类型的数据结构,包括线性表、树、堆、图,以及查找、排序等算法。自始至终将数据结构的基本原理与算法分析紧密结合
    发表于 12-15 16:46 0次下载
    C#<b class='flag-5'>数据结构</b>和算法<b class='flag-5'>分析</b>_ 魏宝刚

    什么是数据结构?为什么要学习数据结构数据结构的应用实例分析

    本文档的主要内容详细介绍的是什么是数据结构?为什么要学习数据结构数据结构的应用实例分析包括了:数据结构在串口通信当中的应用,
    发表于 09-26 15:45 14次下载
    什么是<b class='flag-5'>数据结构</b>?为什么要学习<b class='flag-5'>数据结构</b>?<b class='flag-5'>数据结构</b>的应用实例<b class='flag-5'>分析</b>

    Linux 内核数据结构:位图(Bitmap)

    除了各种链式和树形数据结构Linux内核还提供了位图接口。位图在Linux内核中大量使用。下面的源代码文件包含这些结构的通用接口。
    发表于 05-14 17:24 3235次阅读

    你知道Linux内核数据结构中双向链表的作用?

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到。我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在
    发表于 05-14 17:27 1757次阅读

    Linux0.11-进程控制块数据结构

    嵌入式Linux中文站收集整理Linux0.11版本内核学习笔记,本文分析Linux进程控制模块的数据结构
    发表于 05-15 15:22 850次阅读

    Linux设备模型分析之(一):设备模型核心

    Linux设备模型分析
    发表于 10-28 11:19 0次下载

    Linux设备模型分析之(二):设备模型的基石

    Linux设备模型分析
    发表于 10-28 11:21 0次下载

    Linux设备模型分析之(三):sysfs

    Linux设备模型分析
    发表于 10-28 11:21 0次下载

    Linux设备模型分析之(四):class

    Linux设备模型分析
    发表于 10-28 11:22 0次下载

    Linux设备模型分析之(五):uevent

    Linux设备模型分析
    发表于 10-28 11:24 0次下载

    Linux内核的链表数据结构

    Linux内核实现了自己的链表数据结构,它的设计与传统的方式不同,非常巧妙也很通用。
    的头像 发表于 03-24 11:34 596次阅读
    <b class='flag-5'>Linux</b>内核的链表<b class='flag-5'>数据结构</b>

    Linux GIC驱动数据结构分析

    数据结构分析 先来张图: GIC驱动中,使用 struct gic_chip_data 结构体来描述GIC控制器的信息,整个驱动都是围绕着该结构体的初始化,驱动中将函数指针都初始化好,
    的头像 发表于 09-28 15:18 321次阅读
    <b class='flag-5'>Linux</b> GIC驱动<b class='flag-5'>数据结构</b><b class='flag-5'>分析</b>

    Linux内核中使用的数据结构

    Linux内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树。 链表 Linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种
    的头像 发表于 11-09 14:24 206次阅读
    <b class='flag-5'>Linux</b>内核中使用的<b class='flag-5'>数据结构</b>