Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287449
  • 博文数量: 59
  • 博客积分: 1346
  • 博客等级: 中尉
  • 技术积分: 461
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-06 17:17
文章分类

全部博文(59)

文章存档

2012年(9)

2011年(50)

分类: LINUX

2011-01-29 15:44:02

Kobjects

kobject是一种数据结构,定义在

Kobject会在sysfs文件系统(sys目录)下面建立一个目录,这个目录下面会用文件。

因此是 sysfs 中出现的每个对象都对应一个 kobject, 它和内核交互来创建它的可见表述。

struct kobject {
    const char    * k_name;/*kobject 的名字数组(sysfs 入口使用的名字)指针;如果名字数组大小小于KOBJ_NAME_LEN,它指向本数组的name,否则指向另外分配的一个名字数组空间 */
    char            name[KOBJ_NAME_LEN];/*kobject 的名字数组,若名字数组大小不小于KOBJ_NAME_LEN,只储存前KOBJ_NAME_LEN个字符*/
    struct kref        kref;/*kobject 的引用计数*/
    struct list_head    entry;/*kobject 之间的双向链表,与所属的kset形成环形链表*/
    struct kobject        * parent;/*在sysfs分层结构中定位对象,指向上一级kset中的struct kobject kobj*/
    struct kset        * kset;/*指向所属的kset*/
    struct kobj_type    * ktype;/*负责对该kobject类型进行跟踪的struct kobj_type的指针*/
    struct dentry        * dentry;/*sysfs文件系统中与该对象对应的文件节点路径指针*/
    wait_queue_head_t    poll;/*等待队列头*/
};

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结构体设置文件名和属性等

struct kobj_type
{ void (*release)(struct kobject *); //释放对象
 struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
}; default_attr 成员列举了对每个这样类型的 kobject 被创建的属性, 并且 sysfs_ops 提供方法来实现这些属性. 我们从 default_attrs 开始, 它指向一个指向属性结构的指针数组

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); };//当用户写属性文件时,改函数用于存储用户传入的属性值

国嵌实例    kobject.rar   


 

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   

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