subsystem内核对象子系统(2.6.21)


所属类别:Linux

文章作者:niutao.linux

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


一、定义:subsystem被定义在/linux/include/linux/kobject.h中,原型为:176struct subsystem { 177

struct kset

kset;
178

struct rw_semaphore

rwsem;
179};

注:要说明的是这个结构在2.6.21以后的linux内核版本中就不存在了。可以看出,subsystem与kset的区别就是多了一个信号量,所以在后来的代码中,subsystem已经完全被kset取缔了。二、作用:

Subsystem是一系列管理kset的集合,描述系统中某一类设备子系统,如block_subsys表示所有的块设备,对应于sysfs文件系统中的block目录。类似的,devices_subsys对应于sysfs中的devices目录,描述系统中所有的设备。每个kset必须属于某个subsystem,通过设置kset结构中的subsys域指向指定的subsystem可以将一个kset加入到该subsystem。所有挂接到同一subsystem的kset共享同一个rwsem信号量,用于同步访问kset中的链表。
三、操作:
1、subsystem_init()函数:/linux/lib/kobject.c 614void subsystem_init(struct subsystem * s)
615{
616

init_rwsem(&s->rwsem);
617

kset_init(&s->kset);
618}由代码可见它是负责初始化subsystem对象的信号量和ket的。具体对kset域的初始化是初始化kset的kobject域kobj,双向循环链表域list,自旋锁域list_lock,具体参见/linux/lib/kobject.c中kset_init()函数。
2、subsystem_register()函数:/linux/lib/kobject.c 629int subsystem_register(struct subsystem * s)
630{
631

int error;
632
633

if (!s)
634

return -EINVAL;
635
636

subsystem_init(s);
637

pr_debug("subsystem %s: registering\n",s->kset.kobj.name);
638
639

if (!(error = kset_add(&s->kset))) {
640

if (!s->kset.subsys)
641

s->kset.subsys = s;
642

}
643

return error;
644}如果subsystem对象s为空则返回无效参数错误(-EINVAL),否则调用subsystem_init()初始化s,打印注册subsystem对象信息,调用kset_add()函数(/linux/lib/kobject.c)将s的kset域添加到kset层次,如果成功(error=0),则检查s->kset的subsys(在2.6.21以前的kset结构中有subsystem类型成员subsys)域是否为空,为空则将s只为其值。到此完成subsystem对象的注册。
3、subsystem_unregister()函数:/linux/lib/kobject.c 646void subsystem_unregister(struct subsystem * s)
647{
648

if (!s)
649

return;
650

pr_debug("subsystem %s: unregistering\n",s->kset.kobj.name);
651

kset_unregister(&s->kset);
652}

在注销subsystem对象s时,如果其为空,则返回。否则打印卸载信息,然后调用kset_unregister()函数注销s->kset。实际上kset_unregister()函数也只是调用kobject_unregister()函数注销s->kset->kobj。4、subsystem_get()和subsystem_put()函数:/linux/include/linux/kobject.h252static inline struct subsystem * subsys_get(struct subsystem * s) 253{
254

return s ? container_of(kset_get(&s->kset),struct subsystem,kset) : NULL;
255}
256
257static inline void subsys_put(struct subsystem * s)
258{
259

kset_put(&s->kset);
260}

此两个函数也是定义在/linux/lib/kobject.c中,用于增加和减少对subsystem对象的引用计数。实际上相当于直接调用kset_get()和kset_put()函数。

相关信息

· 女人洗澡真麻烦,每个女人都自恋

· 理解SQL Server的SQL查询计划(1)

· 一个查询扩展名的例子

· js中的escape及unescape函数的php实现代码








....

1572 100198