Linux 设备模型--- Kobject

Sysfs 文件系统:

" sysfs is a ram-based filesystem initially based on ramfs. 

It provides a means to export kernel data stuctures,their attributes,and the linkages between them to userspace."

让用户知道内核数据结构,属性,以及之间的关系.


Linux2.6 内核引入了 sysfs 文件系统,sysfs 被看成是与 proc 同类别的文件系统,

sysfs 把连接在系统上的 设备和总线 组织成分级的文件 ,使用户空间可以访问到.


Sysfs 被加载在 /sys/ 目录下,

sys 下的子目录:

1,Block: 在系统中发现的每个块设备在该目录下对应一个子目录。

          每个子目录中又包含一些属性文件,它们描述了这个块设备的各方面属性,比如:设备大小,

          (loop 块设备是使用文件来模拟的.)
2,Bus :在内核中注册的每条总线在该目录下对应一个子目录,

          如:ide pci scsi usb pcmcia.

          其中每个总线目录又包含两个子目录:devices 和drivers  ,

          devices 目录包含了在整个系统中发现的属于该总线类型的设备.

          drivers 目录包含了注册到该总线的所有驱动.

3,Class : 将设备按照 功能 进行分类,如  /sys/class/net/ 目录下包含了所有网络接口.

4, Devices :包含系统所有等待设备.

5, Kernel :内核中的配置参数.

6, Module : 系统中所有模块信息.


Kobject :

Kobject 实现了基本的 面向对象管理机制 , 是构成 Linux2.6设备模型的核心结构 .

Kobject 与 sysfs 文件系统紧密相连,在内核中注册的每个 Kobject 对象对应sysfs 文件系统中的一个目录.


Kobject 结构:

[cpp]  view plain  copy
  1. struct kobject {  
  2.   
  3.          const char                  *name;    /* kobject名称 */  
  4.   
  5.          struct list_head        entry;     /* 用于链入所属的kset的链表 */  
  6.   
  7.          struct kobject           *parent;   /* 指向kobject的父对象 */  
  8.   
  9.          struct kset                 *kset;     /* 所属kset */  
  10.   
  11.          struct kobj_type       *ktype;   /* 所属ktype */  
  12.   
  13.          struct sysfs_dirent  *sd;      /* sysfs中的目录项 */  
  14.   
  15.          struct kref                  kref;       /* 提供引用计数 */  
  16.   
  17.          unsigned intstate_initialized:1;  /* 标志:初始化 */  
  18.   
  19.          unsigned intstate_in_sysfs:1;   /* 标志:在sysfs中 */  
  20.   
  21.          unsigned intstate_add_uevent_sent:1;     /* 标志:已发出KOBJ_ADDuevent */  
  22.   
  23.          unsigned intstate_remove_uevent_sent:1;/* 标志:已发出KOBJ_REMOVE uevent */  
  24.   
  25.          unsigned intuevent_suppress:1;     /* 标志:禁止发出uevent*/  
  26.   
  27. };  

Kobject 操作:

[cpp]  view plain  copy
  1. void Kobject_init (struct Kobject * kobj)   初始化 Kobject  结构;  
  2. void Kobject_add (struct Kobject * kobj)  将 Kobject  对象注册到 Linux 系统;  
  3. int Kobject _init_and_add ( struct Kobject * kobj,struct kobj_type * ktype, struct Kobject  * parent , const char * fmt , ...) 初始化并注册;  
  4. void Kobject_del (struct Kobject  * kobj)   从 Linux 系统中删除 Kobject  对象.  
  5. struct Kobject * Kobject_get (struct Kobject * kobj)  将Kobject  对象引用计数加 1 ,同时返回该对象指针;  
  6. void Kobject_put ( struct Kobject * kobj)  将 Kobject  对象应用计数减 1 ,如果引用计数将为 0, 则调用 release 方法释放 Kobject  对象;  


struct  kobj_type :

Kobject 的  ktype  成员是一个 指向 kobj_type  结构的  指针 ,该结构中记录了 Kobject  对象的一些属性.

[cpp]  view plain  copy
  1. struct kobj_type  
  2. {  
  3.     void (*release) ( struct kobject * kobj);  
  4.     struct sysfs_ops *sysfs_ops;  
  5.     struct attribute ** default_attrs;  
  6. };  

release:

用于释放 kobject 占用的资源,当 kobject 的引用计数为 0 时,被调用.


struct  attribute :

struct  attribute (属性) :对应于 kobject 的目录下的一个文件,Name 成员就是文件名.

[cpp]  view plain  copy
  1. struct  attribute  
  2. {  
  3.     char * name;   /*  属性文件名  */  
  4.     struct module *owner;  
  5.     mode_t   mode ;  /*  属性的保护位  */  
  6. }  

struct  sysfs_ops :

[cpp]  view plain  copy
  1. struct  sysfs_ops  
  2. {  
  3.     ssize_t (*show) ( struct kobject *, struct attribute *, char *) ;  
  4.     ssize_t (*store) ( struct kobject *, struct attribute *, const char *,size_t) ;  
  5. };  
show  :当用户 属性文件时,该函数被调用,该函数将属性值 存入 buffer   中返 回给用户态 .

store :当用户属性文件时,该函数被调用,用于存储用户传入的属性值.

下面是实例代码 kobject.c 文件:

[cpp]  view plain  copy
  1. #include <linux/device.h>  
  2. #include <linux/module.h>  
  3. #include <linux/kernel.h>  
  4. #include <linux/init.h>  
  5. #include <linux/string.h>  
  6. #include <linux/sysfs.h>  
  7. #include <linux/stat.h>  
  8.    
  9. MODULE_AUTHOR("David Xie");  
  10. MODULE_LICENSE("Dual BSD/GPL");  
  11.    
  12. void obj_test_release(struct kobject *kobject);  
  13. ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf);  
  14. ssize_t kobj_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count);  
  15.    
  16. struct attribute test_attr = {  
  17.         .name = "kobj_config",  
  18.         .mode = S_IRWXUGO,  
  19. };  
  20.    
  21. static struct attribute *def_attrs[] = {  
  22.         &test_attr,  
  23.         NULL,  
  24. };  
  25.    
  26.    
  27. struct sysfs_ops obj_test_sysops =  
  28. {  
  29.         .show = kobj_test_show,  
  30.         .store = kobj_test_store,  
  31. };  
  32.    
  33. struct kobj_type ktype =   
  34. {  
  35.         .release = obj_test_release,  
  36.         .sysfs_ops=&obj_test_sysops,  
  37.         .default_attrs=def_attrs,  
  38. };  
  39.    
  40. void obj_test_release(struct kobject *kobject)  
  41. {  
  42.         printk("eric_test: release .\n");  
  43. }  
  44.    
  45. ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf)  
  46. {  
  47.         printk("have show.\n");  
  48.         printk("attrname:%s.\n", attr->name);  
  49.         sprintf(buf,"%s\n",attr->name);  
  50.         return strlen(attr->name)+2;  
  51. }  
  52.    
  53. ssize_t kobj_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count)  
  54. {  
  55.         printk("havestore\n");  
  56.         printk("write: %s\n",buf);  
  57.         return count;  
  58. }  
  59.    
  60. struct kobject kobj;  
  61. static int kobj_test_init()  
  62. {  
  63.         printk("kboject test init.\n");  
  64.         kobject_init_and_add(&kobj,&ktype,NULL,"kobject_test");  
  65.         return 0;  
  66. }  
  67.    
  68. static int kobj_test_exit()  
  69. {  
  70.         printk("kobject test exit.\n");  
  71.         kobject_del(&kobj);  
  72.         return 0;  
  73. }  
  74.    
  75. module_init(kobj_test_init);  
  76. module_exit(kobj_test_exit);  

代码测试效果:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值