现在的位置: 首页 > 综合 > 正文

关于linux设备模型kobject,kset,ktype

2013年09月08日 ⁄ 综合 ⁄ 共 2132字 ⁄ 字号 评论关闭

 

一、sysfs文件系统下的每个目录对应于一个kobj,kset是kobj的封装,内嵌了一个kobj,其代表kset自身,ktype代表属性操作集,但由于通用性,因此把ktype单独剥离出来,kobj,kset,ktype成为了各个驱动模型最底层的关联元素,并由此形成了sys下的各种拓扑结构。

二、关于kobject

      首先看一下kobject的原型

           

  1. struct kobject {  
  2.     const char      *name;         //名字  
  3.     struct list_head    entry;         //连接到kset建立层次结构  
  4.     struct kobject      *parent;       //指向父节点,面向对象的层次架构  
  5.     struct kset     *kset;          
  6.     struct kobj_type    *ktype;        //属性文件  
  7.     struct sysfs_dirent *sd;  
  8.     struct kref     kref;          //引用计数  
  9.     unsigned int state_initialized:1;      //初始化状态...  
  10.     unsigned int state_in_sysfs:1;  
  11.     unsigned int state_add_uevent_sent:1;  
  12.     unsigned int state_remove_uevent_sent:1;  
  13.     unsigned int uevent_suppress:1;  
  14. };  

   分析一下kobject的初始化过程

   初始化函数为

          

  1. ---int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,  //参数为kobject和属性结构体  
  2.              struct kobject *parent, const char *fmt, ...)  
  3. {  
  4.     va_list args;  
  5.     int retval;  
  6.     kobject_init(kobj, ktype);     
  7.     va_start(args, fmt);  
  8.     retval = kobject_add_varg(kobj, parent, fmt, args);  
  9.     va_end(args);  
  10.     return retval;  
  11. }  
  12. ---void kobject_init(struct kobject *kobj, struct kobj_type *ktype)  
  13. {  
  14.     char *err_str;  
  15.     if (!kobj) {                        //kobj为NULL错误退出  
  16.         err_str = "invalid kobject pointer!";  
  17.         goto error;  
  18.     }  
  19.     if (!ktype) {                       //ktype为NULL错误退出  
  20.         err_str = "must have a ktype to be initialized properly!/n";  
  21.         goto error;  
  22.     }  
  23.     if (kobj->state_initialized) {   //如果初始化状态为1报错  
  24.         /* do not error out as sometimes we can recover */  
  25.         printk(KERN_ERR "kobject (%p): tried to init an initialized "  
  26.                "object, something is seriously wrong./n", kobj);  
  27.         dump_stack();  
  28.     }  
  29.     kobject_init_internal(kobj);       //初始化kobj   
  30.     kobj->ktype = ktype;            //关联obj和ktype  
  31.     return;  
  32. error:  
  33.     printk(KERN_ERR "kobject (%p): %s/n", kobj, err_str);  
  34.     dump_stack();  
  35. }  
  36. -------static void kobject_init_internal(struct kobject *kobj)  
  37. {  
  38.     if (!kobj)  
  39.         return;  

抱歉!评论已关闭.