在 Linux 下“编译驱动”通常分几种场景,下面按最常见、最实用的方式给你讲清楚。
# Ubuntu / Debian
sudo apt update
sudo apt install build-essential linux-headers-$(uname -r)
# CentOS / RHEL
sudo yum install kernel-devel kernel-headers gcc make
⚠️ 驱动必须和当前运行内核版本匹配
查看内核版本:
uname -r
这是最常见驱动编译方式(不重新编译整个内核)
hello.c
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, kernel!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, kernel!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
obj-m += hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
make
成功后会生成:
hello.ko
sudo insmod hello.ko
dmesg | tail
sudo rmmod hello
cd /lib/modules/$(uname -r)/build
sudo make M=drivers/usb/serial
cd linux-source-dir
make menuconfig
make modules
make modules_install
make defconfig
make menuconfig
make -j$(nproc)
make modules_install
make install
⚠️ 慎用于生产环境
sudo apt install linux-headers-$(uname -r)
sudo mokutil --disable-validation
Linux 驱动 = 内核模块(.ko)
编译靠make + linux-headers
如果你愿意,可以告诉我:
我可以直接给你对应示例和 Makefile。