分类: LINUX
2008-07-23 11:14:00
一、定义:
subsystem被定义在/linux/include/linux/kobject.h中,原型为:
struct { struct ; struct ; }; |
注:要说明的是这个结构在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
void (struct * ) { (&->); (&->); } |
由代码可见它是负责初始化subsystem对象的信号量和ket的。具体对kset域的初始化是初始化kset的
kobject域kobj,双向循环链表域list,自旋锁域list_lock,具体参见/linux/lib/kobject.c中kset_init()函数。
2、subsystem_register()函数:/linux/lib/kobject.c
int (struct * ) { int ; if (!) return -; (); ("subsystem %s: registering\n",->..); if (!( = (&->))) { if (!->.) ->. = ; } return ; } |
如果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
void (struct * ) { if (!) return; ("subsystem %s: unregistering\n",->..); (&->); } |
在注销subsystem对象s时,如果其为空,则返回。否则打印卸载信息,然后调用kset_unregister()函数注
销s->kset。实际上kset_unregister()函数也只是调用kobject_unregister()函数注销s->kset->kobj。
4、subsystem_get()和subsystem_put()函数:/linux/include/linux/kobject.h
static struct * (struct * ) { return ? ((&->),struct ,) : ; } static void (struct * ) { (&->); } |
此两个函数也是定义在/linux/lib/kobject.c中,用于增加和减少对subsystem对象的引用计数。实际上相当于直
接调用kset_get()和kset_put()函数。