Chinaunix首页 | 论坛 | 博客
  • 博客访问: 966112
  • 博文数量: 113
  • 博客积分: 7235
  • 博客等级: 少将
  • 技术积分: 2101
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 11:24
文章分类

全部博文(113)

文章存档

2013年(7)

2012年(5)

2011年(6)

2010年(8)

2009年(15)

2008年(72)

分类: LINUX

2008-07-23 11:14:00

一、定义:

subsystem被定义在/linux/include/linux/kobject.h中,原型为:


struct {

        struct              ;
        struct      ;
};

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

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

void (struct  * )
{
        (&->);
        (&->);
}
由代码可见它是负责初始化subsystem对象的信号量和ket的。具体对kset域的初始化是初始化kset
kobject
kobj,双向循环链表域list,自旋锁域list_lock,具体参见/linux/lib/kobject.ckset_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)skset域添加到kset层次,如
果成功
(error=0),则检查s->ksetsubsys(2.6.21以前的kset结构中有subsystem类型成员subsys)
域是否为空,为空则将s只为其值。到此完成subsystem对象的注册。
3subsystem_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

4subsystem_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()函数。

阅读(1474) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~