Linux设备模型分析之kobject


内核版本:2.6.36

一、kobject应用举例
Linux设备模型最基本的组成元素是kobject,我们先来看一个kobject的应用例子,该程序在Ubuntu 10.10, 2.6.32-38-generic-pae内核上调试通过。
  1.  1#include <linux/device.h>  
  2.  2#include <linux/module.h>  
  3.  3#include <linux/kernel.h>  
  4.  4#include <linux/init.h>  
  5.  5#include <linux/string.h>  
  6.  6#include <linux/sysfs.h>  
  7.  7#include <linux/stat.h>  
  8.  8  
  9.  9MODULE_AUTHOR("haoyu");  
  10. 10MODULE_LICENSE("Dual BSD/GPL");  
  11. 11  
  12. 12void kobject_release(struct kobject *kobject);  
  13. 13ssize_t kobject_attr_show(struct kobject *kobject, struct attribute *attr,char *buf);  
  14. 14ssize_t kobject_attr_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count);  
  15. 15  
  16. 16struct attribute kobject_attr1 = {  
  17. 17    .name = "kobject_attr1",  
  18. 18    .mode = S_IRWXUGO,  
  19. 19};  
  20. 20  
  21. 21struct attribute kobject_attr2 = {  
  22. 22    .name = "kobject_attr2",  
  23. 23    .mode = S_IRWXUGO,  
  24. 24};  
  25. 25  
  26. 26static struct attribute *kobject_def_attrs[] = {  
  27. 27    &kobject_attr1,  
  28. 28    &kobject_attr2,  
  29. 29    NULL,  
  30. 30};  
  31. 31  
  32. 32  
  33. 33struct sysfs_ops kobject_sysfs_ops =  
  34. 34{  
  35. 35    .show = kobject_attr_show,  
  36. 36    .store = kobject_attr_store,  
  37. 37};  
  38. 38  
  39. 39struct kobj_type ktype =  
  40. 40{  
  41. 41    .release = kobject_release,  
  42. 42    .sysfs_ops = &kobject_sysfs_ops,  
  43. 43    .default_attrs = kobject_def_attrs,  
  44. 44};  
  45. 45  
  46. 46void kobject_release(struct kobject *kobject)  
  47. 47{  
  48. 48    printk("kobject release.\n");  
  49. 49}  
  50. 50  
  51. 51ssize_t kobject_attr_show(struct kobject *kobject, struct attribute *attr,char *buf)  
  52. 52{  
  53. 53    printk("kobject attribute show.\n");  
  54. 54    if(strcmp(attr->name, "kobject_attr1") == 0)  
  55. 55        printk("kobject_attr1.\n");  
  56. 56    else if(strcmp(attr->name, "kobject_attr2") == 0)  
  57. 57        printk("kobject_attr2.\n");  
  58. 58    else  
  59. 59        printk("no this attribute.\n");  
  60. 60  
  61. 61    sprintf(buf,"%s\n",attr->name);  
  62. 62    return strlen(attr->name) + 2;  
  63. 63}  
  64. 64  
  65. 65ssize_t kobject_attr_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count)  
  66. 66{  
  67. 67    printk("kobject attribute store.\n");  
  68. 68    if(strcmp(attr->name, "kobject_attr1") == 0)  
  69. 69        printk("kobject_attr1.\n");  
  70. 70    else if(strcmp(attr->name, "kobject_attr2") == 0)  
  71. 71        printk("kobject_attr2.\n");  
  72. 72    else  
  73. 73        printk("no this attribute.\n");  
  74. 74  
  75. 75    printk("buf = %s\n",buf);  
  76. 76    return count;  
  77. 77}  
  78. 78  
  79. 79struct kobject kobj;  
  80. 80static int kobject_test_init(void)  
  81. 81{  
  82. 82    printk("kboject test init.\n");  
  83. 83    kobject_init_and_add(&kobj,&ktype,NULL,"kobject_test");  
  84. 84    return 0;  
  85. 85}  
  86. 86  
  87. 87static void kobject_test_exit(void)  
  88. 88{  
  89. 89    printk("kobject test exit.\n");  
  90. 90    kobject_del(&kobj);  
  91. 91}  
  92. 92  
  93. 93module_init(kobject_test_init);  
  94. 94module_exit(kobject_test_exit);  
该模块执行过程如下图所示:
  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容