Linux 核心管理與驅動程式編譯指南
Linux 核心(Kernel)管理與驅動程式編譯是高級 Linux 開發與系統管理的關鍵技能。本篇將介紹如何編譯核心、開發與編譯驅動程式,並提供詳細的指令與測試方式。
目錄
準備核心編譯環境
首先,確保系統具備編譯核心與驅動程式所需的工具。
安裝必要的套件
sudo dnf install -y gcc make flex bison elfutils-libelf-devel openssl-devel ncurses-devel bc git perl
檢查系統核心版本
uname -r
下載與配置 Linux 核心
下載官方核心源碼
cd /usr/src/
sudo git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git linux-kernel
cd linux-kernel
複製當前系統的核心配置
cp -v /boot/config-$(uname -r) .config
make oldconfig
自訂核心配置(可選)
make menuconfig
編譯與安裝 Linux 核心
編譯核心
make -j$(nproc)
安裝核心模組
sudo make modules_install
安裝核心
sudo make install
更新 GRUB 並重啟
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
驅動程式基礎概念
驅動程式類型
- 字元設備驅動(Character Device)
- 區塊設備驅動(Block Device)
- 網路驅動(Network Driver)
核心模組管理指令
- 列出已載入的模組:
lsmod
- 載入模組:
sudo insmod module.ko
- 卸載模組:
sudo rmmod module
- 查詢模組資訊:
modinfo module.ko
編寫與編譯簡單驅動程式
建立 hello_world.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");
MODULE_AUTHOR("Linux Expert");
MODULE_DESCRIPTION("A Simple Hello World Kernel Module");
建立 Makefile
obj-m := hello_world.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.mod.* *.o *.symvers *.order
編譯驅動程式
make
載入與卸載驅動程式
載入驅動模組
sudo insmod hello_world.ko
驗證驅動是否載入
lsmod | grep hello_world
查看核心日誌輸出
dmesg | tail -20
卸載驅動模組
sudo rmmod hello_world
進階驅動開發
開發字符設備驅動
- 註冊
cdev
設備 - 設定
file_operations
結構 - 設定
/dev
入口
開發 PCI 驅動
- 掃描 PCI 設備
lspci -nn
- 使用
pci_register_driver()
註冊驅動
開發 USB 驅動
- 掃描 USB 設備
lsusb
- 設定
usb_driver
結構
驅動程式除錯與測試
啟用核心除錯模式
sudo dmesg -n 7
使用 gdb
偵錯核心模組
gdb vmlinux
使用 ftrace
追蹤函數調用
sudo mount -t debugfs nodev /sys/kernel/debug
echo function > /sys/kernel/debug/tracing/current_tracer
cat /sys/kernel/debug/tracing/trace
結語
本篇提供了 Linux 核心管理與驅動程式編譯的完整指南,包括核心編譯、驅動開發、載入與除錯技巧。透過這些技術,您可以深入理解 Linux 核心並開發高效能驅動模組。