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