一、sysfs文件系统下的每个目录对应于一个kobj,kset是kobj的封装,内嵌了一个kobj,其代表kset自身,ktype代表属性操作集,但由于通用性,因此把ktype单独剥离出来,kobj,kset,ktype成为了各个驱动模型最底层的关联元素,并由此形成了sys下的各种拓扑结构。
二、关于kobject
首先看一下kobject的原型
- struct kobject {
- const char *name; //名字
- struct list_head entry; //连接到kset建立层次结构
- struct kobject *parent; //指向父节点,面向对象的层次架构
- struct kset *kset;
- struct kobj_type *ktype; //属性文件
- struct sysfs_dirent *sd;
- struct kref kref; //引用计数
- unsigned int state_initialized:1; //初始化状态...
- unsigned int state_in_sysfs:1;
- unsigned int state_add_uevent_sent:1;
- unsigned int state_remove_uevent_sent:1;
- unsigned int uevent_suppress:1;
- };
分析一下kobject的初始化过程
初始化函数为
- ---int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, //参数为kobject和属性结构体
- struct kobject *parent, const char *fmt, ...)
- {
- va_list args;
- int retval;
- kobject_init(kobj, ktype);
- va_start(args, fmt);
- retval = kobject_add_varg(kobj, parent, fmt, args);
- va_end(args);
- return retval;
- }
- ---void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
- {
- char *err_str;
- if (!kobj) { //kobj为NULL错误退出
- err_str = "invalid kobject pointer!";
- goto error;
- }
- if (!ktype) { //ktype为NULL错误退出
- err_str = "must have a ktype to be initialized properly!/n";
- goto error;
- }
- if (kobj->state_initialized) { //如果初始化状态为1报错
- /* do not error out as sometimes we can recover */
- printk(KERN_ERR "kobject (%p): tried to init an initialized "
- "object, something is seriously wrong./n", kobj);
- dump_stack();
- }
- kobject_init_internal(kobj); //初始化kobj
- kobj->ktype = ktype; //关联obj和ktype
- return;
- error:
- printk(KERN_ERR "kobject (%p): %s/n", kobj, err_str);
- dump_stack();
- }
- -------static void kobject_init_internal(struct kobject *kobj)
- {
- if (!kobj)
- return;