linux内核驱动里的bus, device, driver(一)

一个简单的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。

三个模块的依赖关系:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值