前幾天我們已經學會如何編譯 Kernel、在 QEMU 測試、了解 Booting 流程,還寫了第一個 Hello Kernel Module。
今天,我們來玩得更進階一些:讓模組可以 接收動態參數,並且在載入時改變行為,學習如何讓 Kernel 與外部互動更靈活。
Kernel 模組可以使用 module_param() 接收外部參數。
以下範例讓我們的模組接受一個名字,在載入時打印不同訊息:
hello_param.c:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Hello Kernel Module with Parameter");
static char *name = "Kernel";
module_param(name, charp, 0000);
MODULE_PARM_DESC(name, "A name to greet");
static int __init hello_init(void) {
printk(KERN_INFO "Hello, %s! Module loaded.\n", name);
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, %s! Module unloaded.\n", name);
}
module_init(hello_init);
module_exit(hello_exit);
module_param(name, charp, 0000)
:定義字串參數 nameMODULE_PARM_DESC
:描述參數用途hello_init()
與 hello_exit()
在載入與移除時分別打印訊息Makefile 與之前一樣:
obj-m += hello_param.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
載入模組時傳參數:
sudo insmod hello_param.ko name=QEMU
dmesg | tail
輸出:
[ 1234.567890] Hello, QEMU! Module loaded.
移除模組:
sudo rmmod hello_param
dmesg | tail
嘗試多個參數:整數、布林值、字串
動態控制模組行為,例如設定計數器或開關
實作簡單字元裝置,讓 User Space 與模組互動
在 QEMU 下測試不同 Kernel 版本的相容性
今天,我們讓 Kernel Module 變得更 靈活,可以透過外部參數改變行為,為後續探索 System Call Hook、字元裝置驅動 或 Kernel Debug 打下基礎