零、什么是内核
何为内核:
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延伸出来,如下图: