• 【打卡】【Linux的设备驱动管理之内核对象】21天学习挑战赛—RK3399平台开发入门到精通-Day15



    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
    想系统/深入学习某技术知识点…
    一个人摸索学习很难坚持,想组团高效学习…
    想写博客但无从下手,急需写作干货注入能量…
    热爱写作,愿意让自己成为更好的人…

    文章目录

    1.Kobject

    内核对象(kernel object)是将一个数据结构struct kobject作为一种公共连接部件定义到更高层的其他数据结构中去,而各个高层数据结构之间的关系通过kobject结构以不同的链表方式表示,从而形成结构紧密的上下层次关系。通过这种kobject结构,可以清晰地描述总线、设备、设备上的接口等相互间的关系,变得更有层次且方便系统管理者了解系统状况。

    在这里插入图片描述

    //kernel/include/linux/kobject.h
    struct kobject {
        const char      *name;	//在sysfs下对应的名字
        struct list_head    entry; //挂接到kset中的链表单元
        struct kobject      *parent; //所属的父kobject
        struct kset     *kset; //所属的kset
        struct kobj_type    *ktype; //所属的类型
        struct kernfs_node  *sd; /* sysfs directory entry  sysfs文件系统中文件节点的入口*/
        struct kref     kref; //对象引用计数
    #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
        struct delayed_work release;
    #endif
        unsigned int state_initialized:1; //已初始化标志位
        unsigned int state_in_sysfs:1; //已添加到sysfs标志位
        unsigned int state_add_uevent_sent:1; // add 事件已发送标志位
        unsigned int state_remove_uevent_sent:1; //remove事件已发送标志位
        unsigned int uevent_suppress:1;
    
        ANDROID_KABI_RESERVE(1);
        ANDROID_KABI_RESERVE(2);
        ANDROID_KABI_RESERVE(3);
        ANDROID_KABI_RESERVE(4);
    };
    
    struct kobj_type {
        void (*release)(struct kobject *kobj);
        const struct sysfs_ops *sysfs_ops;
        struct attribute **default_attrs;
        const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
        const void *(*namespace)(struct kobject *kobj);
        void (*get_ownership)(struct kobject *kobj, kuid_t *uid, kgid_t *gid);
    
        ANDROID_KABI_RESERVE(1);
        ANDROID_KABI_RESERVE(2);
        ANDROID_KABI_RESERVE(3);
        ANDROID_KABI_RESERVE(4);
    };
    
    struct attribute_group {
           const char             *name;
           umode_t               (*is_visible)(struct kobject *,
                                             struct attribute *, int);
           umode_t               (*is_bin_visible)(struct kobject *,
                                                struct bin_attribute *, int);
           struct attribute      **attrs;
           struct bin_attribute       **bin_attrs;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    在这里插入图片描述
    kobject通常本身并不关系它们自己,相反它们通常嵌入包含在其他结构中,感兴趣的是该结构体中的其他内容。“kobject”结构首先出现在 2.5.45 开发内核中。它最初的目的是作为一种统一管理引用计数对象的内核代码的简单方法。随着内核的不断更新升级,kobject的地位作用越来越明显,现在主要作用为如下:

    1. 内核对象的引用计数;
    2. sysfs文件系统的表示;
    3. 数据结构粘合剂:单纯的kobject什么都做不了,它只是一个基础的数据结构,可以理解成面向对象中的抽象类,所以它要放在其他的数据结构中使用(理解成其他数据结构继承kobjec),因此叫做数据结构的粘合剂;
    4. 热插拔事件处理:kobject子系统处理通知用户空间关于系统在的硬件event事件,供用户空间mdev/udev使用。

    了解kobject后,还有一个和kobject相关的重要对象叫做kset。

    2.Kset

    /**
     * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
     *
     * A kset defines a group of kobjects.  They can be individually
     * different "types" but overall these kobjects all want to be grouped
     * together and operated on in the same manner.  ksets are used to
     * define the attribute callbacks and other common events that happen to
     * a kobject.
     *
     * @list: the list of all kobjects for this kset
     * @list_lock: a lock for iterating over the kobjects
     * @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
     * @uevent_ops: the set of uevent operations for this kset.  These are
     * called whenever a kobject has something happen to it so that the kset
     * can add new environment variables, or filter out the uevents if so
     * desired.
     */
    struct kset {
        struct list_head list; //挂载kobject结构的链表
        spinlock_t list_lock; //自旋锁
        struct kobject kobj; //自身包含一个kobject结构
        const struct kset_uevent_ops *uevent_ops; //udev机制的uevent时间操作集
    
        ANDROID_KABI_RESERVE(1);
        ANDROID_KABI_RESERVE(2);
        ANDROID_KABI_RESERVE(3);
        ANDROID_KABI_RESERVE(4);
    } __randomize_layout;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在许多方面,kset 看起来像是 kobj_type 结构的扩展; kset 是相同 kobjects 的集合。但是,虽然 struct kobj_type 关注对象的类型,但 struct kset 关注聚合和集合。
    一个 kset 服务于这些功能:

    1. 它作为一个包含一组相同对象的袋子。内核可以使用 kset 来跟踪“所有块设备”或“所有 PCI 设备驱动程序”。
    2. kset 是将设备模型(和 sysfs)结合在一起的目录级粘合剂。每个 kset 都包含一个 kobject,可以设置为其他 kobject 的父级;以这种方式构建了设备模型层次结构。
    3. Ksets 可以支持 kobjects 的“热插拔”并影响热插拔事件如何报告给用户空间。
      在这里插入图片描述
      管理的基础对象kobject和kset了解完毕,那么就需要开始贴合实际,延伸出一些通用的管理类型结构,如bus,devices和driver。

    接下来将看到这些重要的结构的定义解说明.

  • 相关阅读:
    在 macOS 上的多个 PHP 版本之间切换
    类型体系与基本数据类型(第三节)
    OT算法在协同编辑器中的应用
    【2022】【论文笔记】基于Rydberg原子Antenna的——
    Python loglog()函数
    C语言中宏定义的盲区有哪些?
    【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )
    Apache POI 解析和处理Excel
    C++:map和set
    Android集成其他应用的sdk(aar)如何实现application合并
  • 原文地址:https://blog.csdn.net/qq_23327993/article/details/126450101