[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;
};

●其中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);
};

●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; 互斥访问信号量
};

可以看出,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);

四、设备、驱动、总线

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

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

posted @ 2022-08-16 21:02  周末不下雨  阅读(36)  评论(0编辑  收藏  举报