全部博文(59)
分类: LINUX
2011-01-29 15:44:02
Kobjects
kobject是一种数据结构,定义在
Kobject会在sysfs文件系统(sys目录)下面建立一个目录,这个目录下面会用文件。
因此是 sysfs 中出现的每个对象都对应一个 kobject, 它和内核交互来创建它的可见表述。
struct kobject { |
kobject 是组成设备模型的基本结构,初始它只被作为一个简单的引用计数, 但随时间的推移,其任务越来越多。现在kobject 所处理的任务和支持代码包括:
对象的引用计数 :跟踪对象生命周期的一种方法是使用引用计数。当没有内核代码持有该对象的引用时, 该对象将结束自己的有效生命期并可被删除。
sysfs 表述:在 sysfs 中出现的每个对象都对应一个 kobject, 它和内核交互来创建它的可见表述。
kobject 初始化
(1)void kobject_init(struct kobject * kobj)/初始化Kobject结构
(2)int Kobject_add(struct kobject * kobj)//讲kobject对象注册到Linux系统中去
(1)和(2)两步可以用一步代替。
int kobject_int_and_add(struct kobject * kobj,struct kobj_type *ktype, struct kobj_type *parent,const char *format,...)
//其中const char *format参数是Kobject在sys目录下的目录名,ktype下面结构体的名字
int kobject_set_name(struct kobject *kobj, const char *format, ...); //设置文件名
(3)调用struct kobj_type结构体设置文件名和属性等
default_attr 结构 struct attribute { 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); };//当用户写属性文件时,改函数用于存储用户传入的属性值 国嵌实例 kobject.rar
kset 上的操作 ksets 有类似于kobjects初始化和设置接口: Kset是具有相同类型的Kobject的集合,在sys中体现为一个目录。因此Kobject是Kset的子目录。且当Kset下面的Kobject目录或者Kset目录发生改变时,就产生了热插拔事件,热插拔函数被执行
ksets 还有一个指针指向 kobj_type 结构来描述它包含的 kobject,这个类型优先于 kobject 自身中的 ktype 。因此在典型的应用中, 在 struct kobject 中的 ktype 成员被设为 NULL, 而 kset 中的ktype是实际被使用的。
热插拔事件产生 一个热插拔事件是一个从内核空间发送到用户空间的通知, 表明系统配置已经改变. 无论 kobject 被创建或删除,都会产生这种事件。热插拔事件会导致对 /sbin/hotplug 的调用, 它通过加载驱动程序, 创建设备节点, 挂载分区或其他正确动作响应事件。
可以在 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 |