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 函数的作用是在调用热插拔脚本之前将参数添加到环境变量中。
热插拔 国嵌实例 kset.rar