内核笔记](七)——内核对象(Kernel object)机制

简介: 内核笔记](七)——内核对象(Kernel object)机制

零、什么是内核


何为内核:

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);


四、设备、驱动、总线


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

0a2653c851af460fa595bd959398a8f1.png

相关文章
|
29天前
|
机器学习/深度学习 Web App开发 编解码
论文精度笔记(四):《Sparse R-CNN: End-to-End Object Detection with Learnable Proposals》
Sparse R-CNN是一种端到端的目标检测方法,它通过使用一组可学习的稀疏提议框来避免传统目标检测中的密集候选框设计和多对一标签分配问题,同时省去了NMS后处理步骤,提高了检测效率。
39 0
论文精度笔记(四):《Sparse R-CNN: End-to-End Object Detection with Learnable Proposals》
|
30天前
|
机器学习/深度学习 人工智能 编解码
论文精度笔记(一):《ZERO-SHOT DETECTION WITH TRANSFERABLE OBJECT PROPOSAL MECHANISM》
本论文提出了一种零样本检测方法,通过引入可转移的对象候选机制来关联类别间的共现关系,并使用所有类的置信度分布进行对象置信度预测,以提高对未见类别物体的检测性能。
31 3
论文精度笔记(一):《ZERO-SHOT DETECTION WITH TRANSFERABLE OBJECT PROPOSAL MECHANISM》
|
28天前
|
编解码 人工智能 文件存储
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
YOLOv7是一种新的实时目标检测器,通过引入可训练的免费技术包和优化的网络架构,显著提高了检测精度,同时减少了参数和计算量。该研究还提出了新的模型重参数化和标签分配策略,有效提升了模型性能。实验结果显示,YOLOv7在速度和准确性上超越了其他目标检测器。
46 0
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用1
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用1
49 0
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用1
|
6月前
|
JavaScript 前端开发 Java
编程笔记 html5&css&js 073 JavaScript Object数据类型
编程笔记 html5&css&js 073 JavaScript Object数据类型
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用2
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用2
46 0
|
前端开发
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置1
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置1
45 0
|
前端开发
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置3
前端学习笔记202306学习笔记第四十一天-Es6-object.defineProperty监听属性的访问和设置3
50 0
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用4深度拷贝
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用4深度拷贝
39 0
|
前端开发
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用3
前端学习笔记202306学习笔记第四十天-Es6-object.assign的使用3
37 0
下一篇
无影云桌面