个人对kobject的一点研究(1)
来源:互联网 发布:航拍拼图软件 编辑:程序博客网 时间:2024/05/18 01:16
在LINUX中最让人不解的大概就是/sys下面的内容了
下面首先让我们来创建一个简单的platform设备,并从这个设备的视角进行深入,在此篇文章的深入过程中,我们只看kobeject的模型
我所使用的内核版本号为2.6.26,操作系统的内核版本号为2.6.27-7,暂未发现2.6.27-7与2.6.26的重大不同
首先写一个简单的模块
#include <linux/platform_device.h>
#include <linux/init.h>
#include <linux/module.h>
static int __init test_probe(struct platform_device *pdev)
{
int err = 0;
return err;
}
static int test_remove(struct platform_device *pdev)
{
return 0;
}
static struct platform_device test_device = {
.name = "test_ts",
.id = -1,
};
static struct platform_driver test_driver = {
.probe = test_probe,
.remove = test_remove,
.driver = {
.name = "test_ts",
.owner = THIS_MODULE,
},
};
static int __devinit test_init(void)
{
platform_device_register(&test_device);
return platform_driver_register(&test_driver);
}
static void __exit test_exit(void)
{
platform_device_unregister(&test_device);
platform_driver_unregister(&test_driver);
}
module_init(test_init);
module_exit(test_exit);
MODULE_AUTHOR("zwolf");
MODULE_DESCRIPTION("Module test");
MODULE_LICENSE("GPL");
MODULE_ALIAS("test");
接下来是makefile
#Makefile
obj-m:=test.o
KDIR:=/lib/modules/2.6.27-7-generic/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
KDIR中的目录请改为各位实际运行中的内核目录
make之后进行模块的加载 sudo insmod ./test.ko
现在到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很直观的说明了设备在这个目录下,便于大家查找
下面首先让我们来创建一个简单的platform设备,并从这个设备的视角进行深入,在此篇文章的深入过程中,我们只看kobeject的模型
我所使用的内核版本号为2.6.26,操作系统的内核版本号为2.6.27-7,暂未发现2.6.27-7与2.6.26的重大不同
首先写一个简单的模块
#include <linux/platform_device.h>
#include <linux/init.h>
#include <linux/module.h>
static int __init test_probe(struct platform_device *pdev)
{
int err = 0;
return err;
}
static int test_remove(struct platform_device *pdev)
{
return 0;
}
static struct platform_device test_device = {
.name = "test_ts",
.id = -1,
};
static struct platform_driver test_driver = {
.probe = test_probe,
.remove = test_remove,
.driver = {
.name = "test_ts",
.owner = THIS_MODULE,
},
};
static int __devinit test_init(void)
{
platform_device_register(&test_device);
return platform_driver_register(&test_driver);
}
static void __exit test_exit(void)
{
platform_device_unregister(&test_device);
platform_driver_unregister(&test_driver);
}
module_init(test_init);
module_exit(test_exit);
MODULE_AUTHOR("zwolf");
MODULE_DESCRIPTION("Module test");
MODULE_LICENSE("GPL");
MODULE_ALIAS("test");
接下来是makefile
#Makefile
obj-m:=test.o
KDIR:=/lib/modules/2.6.27-7-generic/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
KDIR中的目录请改为各位实际运行中的内核目录
make之后进行模块的加载 sudo insmod ./test.ko
现在到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下的连接是为了分类查找
画了张目录图,如下,绿色框的为连接文件,绿色线条为连接的对象
题外话:我自身对于这样的分类不是很喜欢,臃肿 重复 而且信息也不好规划,希望在以后的版本能对sys进行大的改造
现在来看另两个图,也就是构成sys的核心kobject,首先第一个是我去掉了连接部分的内容 也就是绿色线条的目录图
第二个是组成这个目录图的核心,kobject图,我也叫他层次图
不看大号绿色箭头右边的内容的话是不是发现两个架构相同?
对的,kobject的层次决定了目录的结构
kobeject图很大,但也不要担心,里面的内容其实不多,基础框架涉及3个主要结构kset kobject和ktype
在说明test_ts的注册之前,先让我们看一下sys下的两个基础目录bus,devices
- 个人对kobject的一点研究(1)
- 个人对kobject的一点研究[1]
- 个人对kobject的一点研究
- 个人对kobject的一点研究
- 个人对kobject的一点研究
- 个人对kobject的一点研究(2)
- 个人对kobject的一点研究(3)
- 个人对kobject的一点研究(4)
- 个人对kobject的一点研究(5)
- 个人对kobject的一点研究(6)
- 【转】个人对kobject的一点研究
- 个人对kobject的一点研究
- 个人对kobject的一点研究
- 个人对kobject的一点研究
- 个人对kobject的一点研究
- 个人对kobject的一点研究[2]
- 个人对kobject的一点研究[3]
- 个人对kobject的一点研究
- sizeof
- 为您解读CSS优先级
- unix系统中带缓存的I/O和不带缓存的I/O的区别
- freeswitch 高性能
- spring 注解问题
- 个人对kobject的一点研究(1)
- 怎么样使用wrap加密package body
- 如何正确导入jar包
- linux c 连接Oracle 10g 数据库
- SQLite Drop Column
- json
- C++补习
- 在TableViewCell里面放一个自定义Label
- VC----如何自动获取本机IP地址?