# Ubuntu/Debian
sudo apt update
sudo apt install -y build-essential git make gcc g++ flex bison libssl-dev \
libelf-dev bc dwarves rsync ncurses-dev
# CentOS/RHEL/Fedora
sudo yum groupinstall "Development Tools"
sudo yum install -y git make gcc g++ flex bison openssl-devel elfutils-libelf-devel \
bc dwarves rsync ncurses-devel
# 从kernel.org获取
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.4.12.tar.xz
tar xvf linux-6.4.12.tar.xz
cd linux-6.4.12
# 或从发行版仓库获取(推荐)
sudo apt install linux-source # Ubuntu/Debian
sudo yum install kernel-devel # CentOS/RHEL
# 生成默认配置
make defconfig
# 或复制当前运行内核的配置
cp /boot/config-$(uname -r) .config
make oldconfig
# 配置内核选项
make menuconfig
make -j$(nproc) # 使用所有CPU核心编译
sudo make modules_install
sudo make install
# ARM架构
sudo apt install gcc-arm-linux-gnueabihf
# AArch64架构
sudo apt install gcc-aarch64-linux-gnu
# 其他架构工具链
sudo apt install gcc-multilib
sudo apt install gdb kgdb crash systemtap
sudo apt install linux-headers-$(uname -r)
# 示例udev规则文件 /etc/udev/rules.d/99-mydevice.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", MODE="0666"
# 禁用内核地址空间随机化(便于调试)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
# 启用内核符号加载
echo 1 | sudo tee /proc/sys/kernel/kptr_restrict
~/driver-dev/
├── Makefile
├── mydriver.c
└── test/
├── test_app.c
└── Makefile
obj-m := mydriver.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
# 加载模块
sudo insmod mydriver.ko
# 查看已加载模块
lsmod | grep mydriver
# 卸载模块
sudo rmmod mydriver
# 查看内核日志
dmesg
#include <linux/printk.h>
pr_debug("Debug message\n");
pr_info("Informational message\n");
pr_warn("Warning message\n");
pr_err("Error message\n");
# 调试内核模块
gdb vmlinux /proc/kcore
# 调试用户空间测试程序
gdb ./test_app
# 启用特定文件的动态调试
echo "file mydriver.c +p" > /sys/kernel/debug/dynamic_debug/control
症状: insmod: ERROR: could not insert module mydriver.ko: Invalid module format
解决方案:
# 确保使用正确的内核头文件编译
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
症状: 无法访问设备文件
解决方案:
# 检查设备权限
ls -l /dev/mydevice
# 修改权限
sudo chmod 666 /dev/mydevice
症状: 系统死机或重启
解决方案: 1. 配置kdump收集崩溃信息 2. 使用crash工具分析vmcore 3. 启用更多调试选项重新编译内核
通过以上配置,您将拥有一个完整的Linux设备驱动开发环境。建议在虚拟机中进行开发测试,以避免主机系统不稳定。