之前的都是直接复制,稍微翻译了一下,不过代码太乱,没有头绪,这里简化一下看看能否有一点头绪
int __init devices_init(void)
{
devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);
dev_kobj = kobject_create_and_add("dev", NULL);
sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj);
sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);
}
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
system_kset = kset_create_and_add("system", NULL, &devices_kset->kobj);
}
int __init classes_init(void)
{
class_kset = kset_create_and_add("class", NULL, NULL);
}
int __init firmware_init(void)
{
firmware_kobj = kobject_create_and_add("firmware", NULL);
}
int __init hypervisor_init(void)
{
hypervisor_kobj = kobject_create_and_add("hypervisor", NULL);
}
struct kset *kset_create_and_add(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
kset = kset_create(name, uevent_ops, parent_kobj);
error = kset_register(kset);
}
static struct kset *kset_create(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
kset->kobj.ktype = &kset_ktype;
return kset;
}
static struct kset *kset_create(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
retval = kobject_set_name(&kset->kobj, "%s", name);
}
int kset_register(struct kset *k)
{
kset_init(k);
err = kobject_add_internal(&k->kobj);
kobject_uevent(&k->kobj, KOBJ_ADD);
}
static int kobject_add_internal(struct kobject *kobj)
{
error = create_dir(kobj);
}
static int create_dir(struct kobject *kobj)
{
error = sysfs_create_dir_ns(kobj, kobject_namespace(kobj));
}
int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
{
kn = kernfs_create_dir_ns(parent, kobject_name(kobj), S_IRWXU | S_IRUGO | S_IXUGO, kobj, ns);
}
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
const char *name, umode_t mode,
void *priv, const void *ns)
{
rc = kernfs_add_one(&acxt, kn);
}
int kernfs_add_one(struct kernfs_addrm_cxt *acxt, struct kernfs_node *kn)
{
ret = kernfs_link_sibling(kn);
}
static int kernfs_link_sibling(struct kernfs_node *kn)
{
rb_link_node(&kn->rb, parent, node);
}
看刚开始那几个devices_kset 、bus_kset 、class_kset 的parent都是NULL,所以在/sys目录下生成了devices、bus和class三个文件夹,而system_kset的parent为&devices_kset->kobj,所以在devices目录下生成了system目录