linux kset subsystem 3.10内核,(7)-Linux设备模型(Kobject、Kset、热插拔、sysfs)

default_attr 结构

struct attribute {

char *name;          // (Kobject目录下面)属性文件名

struct module *owner;

mode_t mode;                 // 属性

};

struct sysfs_ops *sysfs_ops;结构

struct sysfs_ops { ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buffer);//当用户读属性文件时,改函数将属性值存入buffer中并还回用户态 ssize_t (*store)(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size); };//当用户写属性文件时,改函数用于存储用户传入的属性值

kset 上的操作

ksets 有类似于kobjects初始化和设置接口:

Kset是具有相同类型的Kobject的集合,在sys中体现为一个目录。因此Kobject是Kset的子目录。且当Kset下面的Kobject目录或者Kset目录发生改变时,就产生了热插拔事件,热插拔函数被执行

void kset_init(struct kset *kset);

int kset_add(struct kset *kset);

int kset_register(struct kset *kset);//注册Kset

void kset_unregister(struct kset *kset);

/*管理 ksets 的引用计数:*/

struct kset *kset_get(struct kset *kset);

void kset_put(struct kset *kset);

/* kset 也有一个名字,存储于嵌入的 kobject,因此设置它的名字用:*/

kobject_set_name(&my_set->kobj, "The name");

例如:struct kset kset_p;

kobject_set_name(&kset_p.kobj,"kset_p");

struct Kset结构中包含了struct kset_uevent_ops 处理热插拔事件的函数

例如    kset_p.uevent_ops = &uevent_ops;  //定义处理热插拔事件的操作集合

ksets 还有一个指针指向 kobj_type 结构来描述它包含的 kobject,这个类型优先于 kobject 自身中的 ktype 。因此在典型的应用中, 在 struct kobject 中的 ktype 成员被设为 NULL, 而 kset 中的ktype是实际被使用的。

在新的内核里, kset 不再包含一个子系统指针struct subsystem * subsys, 而且subsystem已经被kset取代。

热插拔事件产生

一个热插拔事件是一个从内核空间发送到用户空间的通知, 表明系统配置已经改变. 无论 kobject 被创建或删除,都会产生这种事件。热插拔事件会导致对 /sbin/hotplug 的调用, 它通过加载驱动程序, 创建设备节点, 挂载分区或其他正确动作响应事件。

热插拔事件的实际控制是通过一套存储于 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, char **envp,

int num_envp, char *buffer, int buffer_size);

};

可以在 kset 结构的uevent_ops 成员中找到指向kset_uevent_ops结构的指针。

若在 kobject 中不包含指定的 kset , 内核将通过 parent 指针在分层结构中进行搜索,直到发现一个包含有kset的 kobject ; 接着使用这个 kset 的热插拔操作。

kset_uevent_ops 结构中的三个方法作用如下:

(1) filter 函数让 kset 代码决定是否将事件传递给用户空间。如果 filter 返回 0,将不产生事件。

(2) 当调用用户空间的热插拔程序时,相关子系统的名字将作为唯一的参数传递给它。name 函数负责返回合适的字符串传递给用户空间的热插拔程序。

(3)热插拔脚本想得到的任何其他参数都通过环境变量传递。uevent 函数的作用是在调用热插拔脚本之前将参数添加到环境变量中。

热插拔 国嵌实例rar.gif kset.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值