内核的很多模块都使用了面向对象的思想。kobject就是一个典型的例子。
kobject是kernel object,是所有设备类的基类,类似于各类framework框架中的base object基类的概念。
C语言中通过在自己的结构体中嵌入kobject,来实现对kobject的继承。
每个kobject,都包含了自己的ktype,表示kobject的type,或者说子类的类型。
ktype定义了kobject基类的虚函数接口,这些虚函数由子类来实现,这里定义了类似构造及虚构函数的接口, sysfs的ops。
kset是一个kobject的集合,kset可以将kobject平行组织,kset自身也是一个kobject(通过内嵌kobject实现的子类),kobject可以通过parent指针来纵向组织,这样kobject及kset实现了一个树状结构。
sysfs通过文件系统,将kset(实际也是一种kobject)、kobject组成的拓扑结构展示了出来,并提供了对各类kobject进行操作的接口。
kobject基类的好处,就是可以将系统中各种各样类别的设备组织在一起,并将所有object公共的功能,分层实现在继承链路中各级基类中,比如我们看到的sysfs、ref count、uevent等功能。
- /include/linux/kobject.h // kobject base class interface
- /lib/kobject.c // kobject base class implementation
kobject_name
get name
kobject_set_name
set name
kobject_init
init kobject
kobject_add
add kobject to parent
kobject_del
remove kobject from parent
kobject_move
move kobject to another parent
kobject_get
ref count +1
kobject_put
ref count -1
kobject_get_ownership
kobject_get_path
get path from kobject chain
kobject_namespace
kset_get
kset_put
kset_find_obj
kobject_uevent