设备模型的核心部分就是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下的连接是为了分类查找