温馨提示×

linux drivers如何编译

小樊
42
2026-09-12 12:27:38
栏目: 智能运维

在 Linux 下“编译驱动”通常分几种场景,下面按最常见、最实用的方式给你讲清楚。


一、前提条件

1. 安装编译依赖

# 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

二、最简单:编译一个“外部内核模块(.ko)”

这是最常见驱动编译方式(不重新编译整个内核)

1. 写一个简单的驱动示例

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");

2. 编写 Makefile

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

3. 编译

make

成功后会生成:

hello.ko

4. 加载 / 卸载驱动

sudo insmod hello.ko
dmesg | tail
sudo rmmod hello

三、编译“内核自带驱动”(如网卡、USB)

方法 1:只编译某个驱动模块

cd /lib/modules/$(uname -r)/build
sudo make M=drivers/usb/serial

方法 2:使用 menuconfig

cd linux-source-dir
make menuconfig
make modules
make modules_install

四、编译“整个内核 + 驱动”(不常用)

make defconfig
make menuconfig
make -j$(nproc)
make modules_install
make install

⚠️ 慎用于生产环境


五、常见问题

1. 报错:Missing kernel headers

sudo apt install linux-headers-$(uname -r)

2. 版本不匹配

  • 驱动和内核必须同版本
  • 不要用 A 内核头文件编译 B 内核模块

3. 签名问题(Secure Boot)

sudo mokutil --disable-validation

六、总结一句话

Linux 驱动 = 内核模块(.ko)
编译靠 make + linux-headers


如果你愿意,可以告诉我:

  • 字符设备 / 网络驱动 / USB / PCI
  • 自己写驱动 还是 编译已有驱动
  • 用的 Ubuntu / CentOS / 嵌入式(ARM)

我可以直接给你对应示例和 Makefile

0