在 CentOS 上编译(内核)驱动,通常步骤如下。下面以 CentOS 7 / CentOS 8 为例,原理也适用于 Stream 版本。
sudo yum groupinstall "Development Tools" -y
sudo yum install kernel-devel kernel-headers -y
⚠️ 注意:
kernel-devel的版本必须和 当前运行内核 完全一致
查看当前内核:
uname -r
例如:
3.10.0-1160.el7.x86_64
则必须安装:
kernel-devel-3.10.0-1160.el7.x86_64
示例(最简字符驱动 hello.c):
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, CentOS driver!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, CentOS driver!\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
dmesg | tail
missing kernel headerssudo yum install kernel-headers
uname -r
rpm -qa | grep kernel-devel
不一致时重启到对应内核,或安装对应 kernel-devel
如果启用了 Secure Boot:
.komokutil 导入自定义密钥sudo dnf groupinstall "Development Tools"
sudo dnf install kernel-devel kernel-headers
其余步骤相同。
如果你有:
.tar.gz 驱动可以直接贴出来,我可以帮你针对性分析。