Heng30的博客
搜索 分类 关于 订阅

如何将驱动添加到内核源码树?

2025-02-10

大多数时候我们都不需要将内核驱动添加到内核源码中,可以通过insmod命令在需要的时候自己手动安装驱动。不过将驱动添加到源码树中有下面的好处:

  • 可以通过make menuconfig来管理驱动,所以可以将该驱动编译为内置驱动,就不需要手动安装
  • 可以将驱动和内核源码一起分发给下游用户,方便驱动分发

下面来看一下具体是怎么操作。

准备一个hello.c驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int __init hello_init(void) {
    printk(KERN_INFO "Hi, hello!\n");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye, hello!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("your-name");
MODULE_VERSION("v0.0.1");
MODULE_DESCRIPTION("A simple hello kernel module");

将上面的hello.c文件移动到源码的drivers/char目录下。当然你也可以放到其他的驱动目录下。

编辑Kconfig文件

Kconfig文件和make menuconfig配置相关,可以通过图形来管理驱动。编辑drivers/char/Kconfig,在endmenu之前添加下面内容:

config HELLO
        tristate "HELLO DRIVER"
        default y
        help
          hello driver

config HELLO是驱动配置名称,后面编辑Makefile时会用到。

tristate表示这个驱动有3个选项,分别为:不启动编译到内核编译为单独模块

default有3个值:n, y, m。与tristate进行对应。

help是驱动的描述信息,可以在make menuconfig中查看。

编辑Makefile文件

drivers/char/Makefile中添加obj-$(CONFIG_HELLO) += hello.o。就会在编译字符设备驱动时一起编译hello驱动。注意这里不会单独编译成hello.ko驱动,而是会和其他字符设备驱动一起编译成一个built-in.a静态库。

最后回到内核源码根目录,执行make命令重新编译内核,可以看到编译hello驱动的过程。如果想修改驱动编译方式,可以运行make menuconfig进行设置。具体在Device Drivers->Character devices->HELLO DRIVER选项中。希望对你有所帮助。