• [21天学习挑战赛——内核笔记](七)——内核对象(Kernel object)机制



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

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

    零、什么是内核

    何为内核:
    1、内核是操作系统最基本的部分。
    2、内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础, 它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
    3、现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来, 使之常驻内存,并对他们进行保护。
    也就是说:内核是操作系统进行管理的一块区域(内存),对于应用程序是不可见的。

    一、什么是内核对象

    内核对象(kernel object)是操作系统为一些系统级的对象(像进程,线程,信号量)维护的一些数据结构。这些数据构保存了与系统级对象相关的系统级信息。例如:所有内核对象都会保存该对象的引用计数。进程对象会保存进程ID。文件对象会保存当前字节偏移量,共享模式,打开模式等。操作系统中所有内核对象对是保存在一块内存空间中,系统上所有的进程都共享这一块内存空间。内核对象使用计数器, 当计数器减为0时,内核释放此内核对象资源。一般创建内核对象都有SECURITY_ATTRIBUTES(安全属性)这个参数,传NULL使用默认安全属性。

    二、内核对象机制主要数据结构

    Kobject是内核对象机制中最基本的数据结构,在最初的设计构思中,仅仅是想将其作为-一个引用计数器。

    随着时间的推移,kobjects 的作用越来越大。该结构-般不独立存在,它总是被包含在上层数据结构中,包含kobject 的.上层数据结构通过内核对象来描述与其他数据结构之间的关系。看看kobject的处理函数,就会发现他们其实是为其他对象提供服务的,从另一个角度来说,kobject 跟自身利益没什么关系,它仅仅为高层对象与设备模型提供纽带,用面向对象的方法,kobjects 可以看作是顶层,其他类都由该抽象类派生的。

    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;
    #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
           struct delayed_work     release;
    #endif
           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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    ●其中parent表示父对象,诸如总线和设备就是父子关系。
    ●而sd则与sysfs的目录项进行关联,简而言之就是每一 个kobject都对应着一 个sysfs 下面的目录。
    ●至于kref主要是对该对象的引|用进行计数管理。
    ●对ktype的类型kobj_ type进行展开

    三、sysfs_ops

    sysfs_ops的内容为两个函数指针,store对应用户对文件写操作的回调函数,show对应用户读文件的回调函数,这两个函数一般有开发者来决定执行什么操作,这个接口实现了用户与内核数据的交互。

    struct kobj_type {
           void (*release)(struct kobject *kobj);
           const struct sysfs_ops *sysfs_ops;
           struct attribute **default_attrs;    /* use default_groups instead */
           const struct attribute_group **default_groups;
           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);
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ●sysfs_ ops这是打开sysfs文件对象后的操作接口集合
    ●default_ _groups表示对象的属性信息\

    如果說kset 是管理kobject 的集合,同理,subsystem 就是管理kset 的集合。它描述系统中某一类设备子系统,如block subsys表示所有的块设备,对应于sysfs文件系统中的block目录。类似的,devices subsys对应于sysfs中的devices目录,描述系统中所有的设备。Subsystem由struct subsystem数据结构描述,定义为:

    struct subsystem {
    struct kset kset; 内嵌的kset对象
    struct rw semaphore rwsem; 互斥访问信号量
    };
    
    • 1
    • 2
    • 3
    • 4

    可以看出,subsystem与kset的区别就是多了一个信号量,所以在后来的代码中,subsystem已经完全被kset取缔了。

    每个kset属于某个subsystem,通过设置kset结构中的subsys域指向指定的subsystem可以将一个kset加入到该subsystem。所有挂接到同一subsystem的kset共享同一个rwsem信号量,用于同步访问kset中的链表。
    相关函数
    subsystem有一组类似的函数,分别是:

    void subsystem_init(struct subsystem *subsys);
    int subsystem_register(struct subsystem *subsys);
    void subsystem_unregister(struct subsystem *subsys);
    struct subsystem *subsys_get(struct subsystem *subsys)
    void subsys_put(struct subsystem *subsys);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    四、设备、驱动、总线

    设备、驱动、总线对象会由kobjectkset延伸出来,如下图:

    参考文章:
    RK3399平台开发系列讲解(内核入门篇)1.9、Linux的设备驱动管理之内核对象(Kernel object)机制
    什么是内核对象
    内核对象理解
    linux sysfs文件系统
    linux内核sysfs详解

  • 相关阅读:
    基于SSM的零食商店管理系统
    Python学习笔记(九)——常用内置函数
    odoo16 安装及学习
    面试官:完全背包都不会,是你自己走还是我送你?
    【算法合集】学习算法第六天(贪心篇)
    数字经济加速落地,能为中小企业带来什么?
    TikTok ERP系统,TikTok 批量上架产品工具
    2024全国水科技大会:【协办单位】山东文远环保科技股份有限公司
    makefile的基础使用
    Linux常用命令
  • 原文地址:https://blog.csdn.net/m0_52592798/article/details/126373180