一个简单的linux内核bus, device, driver之间关系的代码。将一个名为zldeviceName的设备,一个名为zldriverName的驱动挂在一个名为zlbusName的总线上。/sys文件系统中体现其关系。
mybus.c内容如下
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zl");
struct bus_type zl_bus = {
.name = "zlbusName", //this string will be show as /sys/bus/zlbus
};
EXPORT_SYMBOL(zl_bus);
int test_init(void)
{
int ret = 0;
bus_register(&zl_bus);
printk("zlbus_init!\n");
return ret;
}
void test_exit(void)
{
bus_unregister(&zl_bus);
printk("zlbus_exit!\n");
}
module_init(test_init);
module_exit(test_exit);
mydev.c内容如下
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zl");
extern struct bus_type zl_bus;
struct device zl_device_struct = {
.init_name = "zldeviceName", //this string will be show as /sys/devices/zldeviceName
.bus = &zl_bus,
};
int test_init(void)
{
int ret = 0;
device_register(&zl_device_struct);
printk("zlDev_init!\n");
return ret;
}
void test_exit(void)
{
device_unregister(&zl_device_struct);
printk("zlDev_exit!\n");
}
module_init(test_init);
module_exit(test_exit);
mydri.c内容如下
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zl");
extern struct bus_type zl_bus;
struct device_driver zl_driver_struct = {
.name = "zldriverName", //this string will be show as /sys/bus/zlbus/drivers/zldriverName
.bus = &zl_bus,
};
int test_init(void)
{
int ret = 0;
driver_register(&zl_driver_struct);
printk("zlDri_init!\n");
return ret;
}
void test_exit(void)
{
driver_unregister(&zl_driver_struct);
printk("zlDri_exit!\n");
}
module_init(test_init);
module_exit(test_exit);
Makefile内容如下
KERNEL = /lib/modules/$(shell uname -r)/build
default:
make -C $(KERNEL) M=$(shell pwd) modules
clean:
make -C $(KERNEL) M=$(shell pwd) modules clean
obj-m += mybus.o mydev.o mydri.o
执行make命令后,生成mybus.ko、mydev.ko、mydri.ko三个模块文件
对比插入模块前:
插入mybus.ko、mydev.ko模块后
再插入mydri.ko模块后
插入mybus.ko模块后:
1.在/sys/bus/目录下有zlbusName目录生成,
2.在/sys/bus/zlbusName/下有devices,drivers两个目录
插入mydev.ko模块后:
1.有/sys/devices/zldeviceName目录生成。
2.有/sys/bus/zlbusName/devices/zldeviceName链接文件生成。
/sys/bus/zlbusName/devices/zldeviceName -> ../../../devices/zldeviceName
3.以上zldeviceName目录下有power目录,及uevent,subsystem文件出现。
4.其中subsystem -> ../../bus/zlbusName
插入mydev.ko模块后:
1.在/sys/bus/zlbusName/drivers目录下有zldriverName目录生成。
2./sys/bus/zlbusName/drivers/zldriverName目录下有bind,unbind,uevent文件及zldeviceName出现。
3.其中zldeviceName -> ../../../../devices/zldeviceName。
三个模块的依赖关系: