linux驱动之buses_init()
通过buses_init()分析一下kset,kobject
代码:
driver/base/bus.c
lib/kobject.c
内核启动阶段,生成/sys/bus目录
static struct kset *bus_kset;
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
...
return 0;
}
kset和kobject都代表sysfs中一个目录,kset有链表用于管理多个kobject,
kobject代表一个设备
struct kset {
//kobj挂在list链表上
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
//当kobject有事件发生时调用,用于设置环境变量或过滤事件
const struct kset_uevent_ops *uevent_ops;
};
分配一个kset并且注册,会在sysfs中生成目录,parent_kobj用于指定上级目录,
为NULL是上级目录就是/sys
struct kset *kset_create_and_add(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
struct kset *kset;
int error;
kset = kset_create(name, uevent_ops, parent_kobj);
...
error = kset_register(kset);
...
return kset;
}
动态分配kset
static struct kset *kset_create(const char *name,
const struct kset_uevent_ops *uevent_ops,