| 模式 | 宿主機 | 目標機 | 適用場景 |
|---|---|---|---|
| 普通 Linux 驅動開發 | 可與目標機同機 | x86_64 Linux PC/Server | 桌面/伺服器驅動、虛擬機內核開發 |
| 嵌入式 Linux 驅動開發 | x86_64 PC (交叉編譯) | ARM/MIPS/PowerPC 開發板 | 嵌入式設備、IoT、工控板卡 |
# 安裝開發工具鏈
# Debian/Ubuntu
apt-get install build-essential libncurses5-dev
# RHEL/CentOS
yum groupinstall "Development Tools"
yum install ncurses-devel
# 獲取內核源碼 (版本必須與目標機運行內核一致)
# 方式 A: 官網下載
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.200.tar.xz
# 方式 B: 發行版源碼包
apt-get install linux-source-4.19.0 # 解壓至 /usr/src/
# 方式 C: 當前運行內核源碼
# /lib/modules/$(uname -r)/build (若已安裝 kernel-devel)
cd /usr/src/linux-source-4.19.0
make oldconfig
make prepare
make scripts
hello.c:
#include
#include
static int __init hello_init(void) {
printk(KERN_ALERT "Hello World linux_driver_module\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_ALERT "Goodbye linux_driver_module\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("developer");
Makefile:
obj-m := hello.o
KDIR := /usr/src/linux-source-4.19.0
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -f *.mod.c *.mod.o *.ko *.o .*.cmd *.symvers
make # 生成 hello.ko
insmod hello.ko # 加載模組
dmesg | tail -5 # 查看內核打印
# 或 cat /proc/kmsg (需 Ctrl+C 退出)
rmmod hello # 卸載模組
# ARM 範例
apt-get install gcc-arm-linux-gnueabihf
# 或下載廠商提供的 SDK (含內核源碼、工具鏈、根文件系統)
cd /path/to/kernel-source
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 選擇:Device Drivers → 您的驅動類別 → 模組化編譯
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)
# 生成 zImage、dtb、modules/
/nfsroot,直接 make modules_install INSTALL_MOD_PATH=/nfsroot.ko 到開發板 /lib/modules/$(uname -r)/kernel/drivers/...# 開發板上
insmod /lib/modules/.../hello.ko
dmesg | tail
make,insmod 即時驗證ARCH=arm CROSS_COMPILE=...,需部署到目標板驗證MODULE_LICENSE("GPL") 否則內核標記污染