歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux設備模型分析之kobject

Linux設備模型分析之kobject

日期:2017/3/1 10:24:19   编辑:Linux編程

內核版本: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);
該模塊執行過程如下圖所示:


			
Copyright © Linux教程網 All Rights Reserved