Linux设备模型之kset

Linux设备模型之kset

一个kset仅仅是需要关联的kobject的集合。对它们是否有相同的ktype没有限制,但是如果不同就要注意了。

kset有如下功能:
1. kset是包含有一组kobject的袋子,内核可以用kset跟踪所有的块设备和所有的PCI设备驱动。
2. 一个kset也是sysfs的子目录,和这个kset相关的kobject罗列在这个目录下。每个kset包含一个可以成为其他kobject父节点的kobject;顶级的sysfs就是用这种方法建立的。
3. Ksets支持kobject的热插拔,影响uevent事件通知到用户空间的行为。

用面向对象的术语描述,kset是顶层的容器类;ksets包含自己的kobject,但是这个kobject只能是kset本身管理,不应该由其他使用者操控。

kset用标准内核的链表管理。Kobject通过它的kset域指回包含它的kset。几乎所有的情况下,这些属于某个kset的kobjects在他们的父指针中包含有这个kset(严格说,是kset中嵌入的kobject)。

由于kset内部包含kobject,所有它应该动态创建,而不要静态声明或在栈上分配空间。创建新的kset使用下面接口:

struct kset *kset_create_and_add(const char *name, 
                   struct kset_uevent_ops *u,
                   struct kobject *parent);

不再使用kset的时候,调用下面函数:

void kset_unregister(struct kset *kset);

使用kset的例子可以在内核目录树中samples/kobject/kset-example.c找到。

如果kset需要控制相关kobjects的uevent的操作,可以用kset_uevent_ops来处理:

struct kset_uevent_ops { 
        int (*filter)(struct kset *kset, struct kobject *kobj);
        const char *(*name)(struct kset *kset, struct kobject *kobj); 
        int (*uevent)(struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env);
 };

filter函数允许kset阻止某个kobject发送到用户空间的uevent。如果这个函数返回0,不会发送这个uevent
name函数在uevent发送到用户空间的时候被调用,这个函数重写了kset默认的name。
默认的,这个name和kset自己的name是一样的,但是如果实现了,可以重写原来的name。
uevent函数在某个uevnet即将发送到用户空间的时候被调用,它允许更多的环境变量加到这个uevnet中。

一个可能的问题是kobject是怎么加到kset中的,没有给出实现这个功能的函数。答案是这个任务由kobject_add()函数处理。一个kobject传递到kobject_add()的时候,它的kset成员应该指向需要的kset地址,kobject_add()处理剩下的工作。

如果一个kobejct属于一个kset但是没有父kobject指针,它会被加到kset目录。但不是kset所有的成员必须在kset目录下。如果kobject添加之前显示指定了父kobject,那么这个kobject在kset中注册,但是添加到父kobject目录下。

参考文档:
/Documentation/kobject.txt

欢迎关注我的微信公众号:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值