Linux设备驱动之设备模型(2)

kset和subsystem关系:
一个子系统subsystem, 其实只是一个附加了个读写信号量的kset的包装,反过来就是说每个 kset 必须属于一个子系统。根据subsystem之间的成员关系建立kset在整个层级中的位置。
子系统常常使用宏直接静态定义:

/* 定义一个struct subsystem name_subsys 并初始化kset的type及hotplug_ops */ decl_subsys(name, struct kobj_type *type,struct kset_hotplug_ops *hotplug_ops); 操作函数

初始化

/* 初始化kobject内部结构 */ void kobject_init(struct kobject *kobj); /* 设置name */ int kobject_set_name(struct kobject *kobj, const char *format, ...); /* 先将kobj->kset指向要添加的kset中,然后调用会将kobject加入到指定的kset中 */ int kobject_add(struct kobject *kobj); /* kobject_register = kobject_init + kobject_add */ extern int kobject_register(struct kobject *kobj); /* 对应的Kobject删除函数 */ void kobject_del(struct kobject *kobj); void kobject_unregister(struct kobject *kobj); /* 与kobject类似的kset操作函数 */ void kset_init(struct kset *kset); kobject_set_name(&my_set->kobj, "The name"); int kset_add(struct kset *kset); int kset_register(struct kset *kset); void kset_unregister(struct kset *kset);

Tip: 初始化前应先使用memset将kobj清零;初始化完成后引用计数为1

引用计数管理

/* 引用计数加1并返回指向kobject的指针 */ struct kobject *kobject_get(struct kobject *kobj); /* 当一个引用被释放, 调用kobject_put递减引用计数,当引用为0时free这个object */ void kobject_put(struct kobject *kobj); /* 与kobject类似的kset操作函数 */ struct kset *kset_get(struct kset *kset); void kset_put(struct kset *kset);

释放

当引用计数为0时,会调用ktype中的release,因此可以这样定义release回调函数: void my_object_release(struct kobject *kobj) { struct my_object *mine = container_of(kobj, struct my_object, kobj); /* Perform any additional cleanup on this object, then... */ kfree(mine); } /* 查找ktype */ struct kobj_type *get_ktype(struct kobject *kobj);

subsystem相关

decl_subsys(name, type, hotplug_ops); void subsystem_init(struct subsystem *subsys); int subsystem_register(struct subsystem *subsys); void subsystem_unregister(struct subsystem *subsys); struct subsystem *subsys_get(struct subsystem *subsys); void subsys_put(struct subsystem *subsys); Low-Level Sysfs Operations kobject和sysfs关系

kobject是实现sysfs虚拟文件系统背后的机制。sysfs中的每一个目录都对应内核中的一个kobject。将kobject的属性(atrributes)导出就会在sysfs对应的目录下产生由内核自动生成的包含这些属性信息的文件。只需简单的调用前面所提到的kobject_add就会在sysfs中生成一个对应kobject的入口,但值得注意的是:

这个入口总会以目录呈现, 也就是说生成一个入口就是创建一个目录。通常这个目录会包含一个或多个属性文件(见下文)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14652.html