昨天我們了解了 Linux 的 Booting 流程,Kernel 如何從零開始啟動。
今天,我們要實際動手撰寫一個 Kernel Module(核心模組),看看怎麼在 Linux 核心裡新增程式碼,並觀察它的運作。
這也是學習 Kernel 開發的重要第一步
Kernel Module 是一段可以在系統運行中動態載入或移除的程式碼,常用來:
insmod <module.ko>
:載入模組
rmmod <module.ko>
:移除模組
lsmod
:查看已載入模組
dmesg
:查看 Kernel 日誌
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Hello World Kernel Module");
static int __init hello_init(void) {
printk(KERN_INFO "Hello, Kernel! Module loaded.\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, Kernel! Module unloaded.\n");
}
module_init(hello_init);
module_exit(hello_exit);
說明:
hello_init():模組載入時執行
hello_exit():模組移除時執行
printk():在 Kernel 日誌輸出訊息
makefile:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
make
載入模組:
sudo insmod hello.ko
查看 Kernel 日誌:
dmesg | tail
移除模組:
sudo rmmod hello
#include <linux/moduleparam.h>
static int myval = 42;
module_param(myval, int, 0644);
MODULE_PARM_DESC(myval, "An integer parameter");
載入時可傳值:
sudo insmod hello.ko myval=100
實作簡單字元裝置驅動
在 QEMU 測試不同 Kernel 版本下的模組行為
今天我們學會了:
Kernel Module 是什麼,為什麼要用
如何寫最簡單的 Hello World Kernel Module
如何編譯、載入、移除模組
觀察 Kernel 日誌,理解模組與 Kernel 的互動
下一步,可以進一步探索 System Call 或 Kernel Debug,將你的模組開發技能提升到更高階