drivers/base/bus.c:bus_register() ;
include/linux/kobject.h
#define decl_subsys(_name,_type,_hotplug_ops) \
struct subsystem _name##_subsys = { \
.kset = { \
.kobj = { .name = __stringify(_name) }, \
.ktype = _type, \
.hotplug_ops =_hotplug_ops, \
} \
}
static struct sysfs_ops bus_sysfs_ops = {
.show = bus_attr_show,
.store = bus_attr_store,
};
static struct kobj_type ktype_bus = {
.sysfs_ops = &bus_sysfs_ops,
};
decl_subsys(bus, &ktype_bus, NULL);
subsys_set_kset(bus, bus_subsys);
#define subsys_set_kset(obj,_subsys) \
(obj)->subsys.kset.kobj.kset = &(_subsys).kset
解析:
struct kobject {
char * k_name; 指向设备名称的指针
char name[KOBJ_NAME_LEN]; 设备名称
struct kref kref; 对象引用计数
struct list_head entry; 挂接到所在kset中去的单元
struct kobject * parent; 指向父对象的指针
struct kset * kset; 所属kset的指针
struct kobj_type * ktype; 指向其对象类型描述符的指针
struct dentry * dentry; sysfs文件系统中与该对象对应的文件节点路径指针
};
struct kset {
struct subsystem * subsys; 所在的subsystem的指针
struct kobj_type * ktype; 指向该kset对象类型描述符的指针
struct list_head list; 用于连接该kset中所有kobject的链表头
struct kobject kobj; 嵌入的kobject
struct kset_hotplug_ops * hotplug_ops; 指向热插拔操作表的指针
};
Kset数据结构还内嵌了一个kobject对象(由kobj域表示),所有属于这个kset 的kobject对象的parent
域均指向这个内嵌的对象。
(obj)->subsys.kset ; //与总线bus相关的子系统集合
(obj)->subsys.kset.kobj ; //与总线bus相关的子系统集合对象的父对象
(obj)->subsys.kset.kobj.kset ; //与总线bus相关的子系统集合对象的父对象所属集合{相当于bus的父kset指向bus_subsys的kset}
阅读(1337) | 评论(0) | 转发(0) |