设备模型的核心部分就是kobject,下面就是它的结构体<linux/kobject.h>,

它也是设备模型的基本结构,它所处理的任务和代码也越来越多: 对象引用计数、sysfs表述、数据结构关联、热插事件处理 

 

struct kobject { 
        const char *k_name; //指向kobject名称的起始位置 
        
        char name[KOBJ_NAME_LEN]; /*如果名称长度小于KOBJ_NAME_LEN(20)字节,则kobject的名称便存放到name数组中,k_name指向数组头,如果大于,则动态分配一个足够大的缓冲区来存放kobject的名称,这是k_name指向缓冲区*/         

        struct kref kref; /*引用计数*/ 

        struct list_head entry; /*在所挂到链表的连接体*/         

        struct kobject *parent;   /*指向kobject的父对象,以此来在内核中构造一个对象层次结构,并且可以将多个对象之间的关系表现初来,这就是sysfs的真相:一个用户空间的文件系统,用来表示内核中kobject对象的层次结构*/
struct kset * kset; /*指向所属的kset*/ 
     struct kobj_type * ktype; 
     struct dentry * dentry; /*目录项, 指向dentry结构体,在sysfs中该结构体就表示这个kobject */   

};

 

 

首先写一个简单的模块

1 #include <linux/platform_device.h>                                                                                                
  2 #include <linux/init.h>
  3 #include <linux/module.h>
  4 
  5 static int __init test_probe(struct platform_device *pdev){
  6     int err = 0;
  7     return err;
  8 }
  9 
 10 static int test_remove(struct platform_device *pdev){
 11     return 0;
 12 }
 13 
 14 static struct platform_device test_device = {
 15     .name = "test_ts",
 16     .id = -1,
 17 };
 18 
 19 static struct platform_driver test_driver = {
 20     .probe = test_probe,
 21     .remove = test_remove,
 22     .driver = {
 23         .name = "test_ts",
 24         .owner = THIS_MODULE,
 25     },
 26 };
 27 
 28 static int __init test_init(void){
 29     platform_device_register(&test_device);
 30     return platform_driver_register(&test_driver);
 31 }
 32 
 33 static int __exit test_exit(void){
 34     platform_device_unregister(&test_device);
 35     platform_driver_unregister(&test_driver);
 36 }
 37 
 38 module_init(test_init);
 39 module_exit(test_exit);
 40 
 41 MODULE_AUTHOR("mine");
 42 MODULE_LICENSE("GPL");
 43 MODULE_ALIAS("test");

 

insmod后,现在到sys目录中查看我们的设备是否已经加载上了

首先是/sys/bus/platform/devices/
在devices下,每一个连接文件都代表了一个设备
ls可看见test_ts,进入test_ts,ls可发现driver这个链接文件,ls-l查看,发现这个文件是连到/sys/bus/platform/drivers/test_ts的
这里需要说明的是连接的含义,并不是driver驱动存在于test_ts这个设备中,而是test_ts使用的驱动为/sys/bus/platform/drivers/test_ts
现在换到/sys/bus/platform/drivers这个目录下
ls查看会发现这里的文件都为目录,而非连接文件,说明这是驱动真正放置的位置
现在进入test_ts目录,然后ls,发现有一个test_ts的连接文件,ls –l查看可发现该文件连接到/sys/devices/platform/test_ts下
回到/sys/bus/platform/devices/下ls –l也会发现test_ts连接到/sys/devices/platform/test_ts
为什么test_ts这个设备放置于/sys/devices/platform下,而不是/sys/bus/platform/devices下呢
我认为和直观性有关,在sys下有这么几个目录block  bus  class  dev  devices  firmware  kernel  module  fs power 
devices很直观的说明了设备在这个目录下,便于大家查找
而/sys/bus/platform/devices下的连接是为了分类查找

linux ko模块架构查看 linux kobject_linux ko模块架构查看