contributed by < padaray
>
1. 撰寫 hello.c 程式碼
透過 module_init 和 module_exit 函式,該模組初始化和卸載時,會執行該函式有連接函式
2. 撰寫 Makefile 後執行
obj-m 告知生成一個 hello.o 檔,並且將其視為模組,clean 只是方便刪除檔案所使用
指定在 /lib/modules/uname -r/build
目錄進行編譯,M=pwd
在當前目錄尋找 module 的 code,modules
會將生成的 .ko 檔案視為核心的模組
但我測試結果顯示,沒有加 modules 也可以正常執行。
因此我進入 /lib/modules/6.5.0-26-generic/build
,查看 Makefile :
執行 make 後,會吃到 all:modules。若是下 modules 指令則會進到 modules: modules_prepare,執行的程式碼會限縮在 modules_prepare,讓程式執行更快
3. 掛載核心模組
insmod 會將指定的 .ko 檔載入到正在運行的核心中,為其分配一個記憶體空間,核心會呼叫模組的初始化函式 module_init
,初始化完畢該模組功能即可正常使用
查看 message,確認模組是否有掛載成功
成功後結果如下:
4. 卸載核心模組
成功後結果如下:
問題1 :尚未安裝 gcc-12,造成 not found error
解決方法如下:
問題2 :module verification failed
在執行 $ sudo dmesg
後顯示以下模組驗證失敗,原因是 Secure Boot 被啟用,需要停止 Secure Boot 或添加簽章,我選擇第一種
解決方法如下:
MODULE_LICENSE
這個巨集的說明。EXPORT_SYMBOL_GPL
不會綁定 symbols ( 第三點進行說明 )深入探討:
a. MODULE_LICENSE
:
我對於 MODULE_LICENSE 的理解是,確認你所撰寫的模組是照著核心的 license 規範,但僅僅加上一行 MODULE_LICENSE("GPL")
不代表你真的有照著規範走,並沒有機制去驗證,因此這比較像是一個自我聲明,最後透過維護人員來確認。另外如果是 Proprietary
的類型,代表該模組使用、修改都需要付錢。
b. EXPORT_SYMBOL_GPL
: