/*整理于2012.11.29于广工大 */
先说说sysfs
sysfs文件系统是一个处于内存中的虚拟文件系统,它为我们提供了kobject对象层次结构的视图。帮助用户可以以一个简单文件系统的方式来观察系统中各种设备的拓扑结构。
借助属性对象,kobject可用导出文件的方式,将内核变量提供给用户读取或写入。
sysfs的诀窍是把kobject对象与目录项紧密联系起来,这点是通过kobject中的dentry(directory entry)字段实现的。
dentry结构体表示目录项,通过连接kobject到指定的目录项上,无疑方便的将kobject映射到该目录上。
kobject其实已经形成了一棵树了——就是我们心爱的对象模型体系。
sysfs的根目录下包含了七个子目录:block、bus、class、devices、firmware、module和power。
block目录下的每个子目录都对应着系统中的一个块设备。反过来,每个目录下又都包含了该块设备的所有分区。
bus目录提供了一个系统总线视图。
class目录包含了以高层功能逻辑组织起来的系统设备视图。
devices目录是系统中设备拓扑结构视图,它直接映射出了内核中设备结构体的组织层次。
firmware目录包含一些诸如ACPI、EDD、EFI等低层子系统的特殊树。
power目录包含了系统范围的电源管理数据。
sysfs组织结构,进入sysfs目录中。有block bus class dev devices firmware fs kernel module power这些目录。
具体代表看名字差不多就可以看出。在层次结构上,假如有一个设备A。将有一个名称为A的目录。A设备是在B总线上。
那A设备应该在bus目录下的B总线下。A设备肯定会有设备的属性(ktype),例如是音频设备则应该有音量属性,
则音量属性将在A设备目录下有个音量属性文件。在使用设备时,如果要改变音量大小,则可以写属性文件入音量指。
得到音量大小时,可以读取属性文件中的音量值。
入正题,kobject.
Kobject是Linux 2.6引入的新的设备管理机制,在内核中由struct kobject表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基本结构。
上层结构例如device,device_driver,bus_type都嵌入了一个kobject,这相当于面向对象程序设计机制中的继承机制。
kobject 结构为一些大的数据结构和子系统提供了基本的对象管理,避免了类似机能的重复实现。这些机能包括
- 对象引用计数.
- 维护对象链表(集合).
- 对象上锁.
- 在用户空间的表示.
kobject结构定义:
struct kobject {
const char *name;/*名称*/
struct list_head entry;/*用于链入所属的kset的链表*/
struct kobject *parent;/*父object*/
struct kset *kset;/*所属kset*/
struct kobj_type *ktype;/*所属ktype*/
struct sysfs_dirent *sd;/*sysfs中的目录项*/
struct kref kref;/*生命周期(引用计数)管理*/
unsigned int state_initialized:1;/*标记:初始化*/
unsigned int state_in_sysfs:1;/*标记:在sysfs中*/
unsigned int state_add_uevent_sent:1;/*标记:已发出KOBJ_ADD uevent*/
unsigned int state_remove_uevent_sent:1;/*标记:已发出的KOBJ_REMOVE uevent*/