在kernel/samples/kobject目录下存在一个最简单的kobject驱动事例,我们可以将它编译在模块测试。 打开内核的menuconfig界面,在Kernel hacking菜单下,找到Sample kernel code选项并选中,进入该选项,选中Buildkobject examples选项。注意,这个选项只允许编译成模块,不允许编译进内核。 保存配置后重新编译内核,在kernel/samples/kobject目录下将会生成目标文件kobject-example.ko。在开发板上加载模块,可以看到,在sys/kernel目录下新生成了kobject_example目录: - [root@x4412 kernel]# ls
- debug/ ipv4/ notes uevent_helper
- fscaps mm/ slab/ uevent_seqnum
- [root@x4412 kernel]# insmod /mnt/kobject-example.ko
- [root@x4412 kernel]# ls
- debug/ kobject_example/ slab/
- fscaps mm/ uevent_helper
- ipv4/ notes uevent_seqnum
- [root@x4412 kernel]#
复制代码 kobject_create_and_add()函数创建了该目录。在该目录下存在三个文件: - [root@x4412 kernel]# ls kobject_example/ -la
- total 0
- drwxr-xr-x 2 root root 0 Sep 28 11:38 ./
- drwxr-xr-x 7 root root 0 Sep 28 07:20 ../
- -rw-rw-rw- 1 root root 4096 Sep 28 11:41 bar
- -rw-rw-rw- 1 root root 4096 Sep 28 11:41 baz
- -rw-rw-rw- 1 root root 4096 Sep 28 11:41 foo
复制代码 它是由sysfs_create_group()函数生成的。这三个文件在程序中被定义如下: - static struct kobj_attribute baz_attribute =__ATTR(baz, 0666, b_show, b_store);
- static struct kobj_attribute bar_attribute =__ATTR(bar, 0666, b_show, b_store);
- static struct kobj_attribute foo_attribute =__ATTR(foo, 0666, foo_show, foo_store);
复制代码 从__ATTR()的参数中可以看出,三个文件的属性均为666,这和我们查看的正好吻合。另外,baz和bar两个文件共享相同的读取和写入的函数b_show和b_store,foo单独享有读取和写入函数foo_show和foo_store。可见,多个文件享有同一个读取或写入函数是完全合法的。 在linux串口终端通过cat和echo指令可以测试驱动是否能正常工作: - [root@x4412 kernel]# cd kobject_example/
- [root@x4412 kobject_example]# echo 123 > bar
- [root@x4412 kobject_example]# echo 456 > baz
- [root@x4412 kobject_example]# echo 789 > foo
- [root@x4412 kobject_example]# cat bar
- 123
- [root@x4412 kobject_example]# cat baz
- 456
- [root@x4412 kobject_example]# cat foo
- 789
复制代码 当我们卸载驱动模块后,模块卸载函数会调用kobject_put函数来减少计数,对应的设备节点将被全部释放: - [root@x4412 kernel]# ls
- debug/ kobject_example/ slab/
- fscaps mm/ uevent_helper
- ipv4/ notes uevent_seqnum
- [root@x4412 kernel]# rmmod /mnt/kobject-example.ko
- [root@x4412 kernel]# ls
- debug/ ipv4/ notes uevent_helper
- fscaps mm/ slab/ uevent_seqnum
- [root@x4412 kernel]#
复制代码 这就是最简单的sysfs设备文件系统,它彻底颠覆并淘汰了传统的devfs,成为后面linux2.6,linux2.8,linux3.0以及更高版本的设备文件系统的主流。
|