contributed by < max890808
>
自己的實體電腦運作 GNU/Linux
閱讀〈Linux 核心模組運作原理〉並對照 Linux 核心原始程式碼 (v6.1+),解釋 insmod 後,Linux 核心模組的符號 (symbol) 如何被 Linux 核心找到 (使用 List API)、MODULE_LICENSE 巨集指定的授權條款又對核心有什麼影響 (GPL 與否對於可用的符號列表有關),以及藉由 strace 追蹤 Linux 核心的掛載,涉及哪些系統呼叫和子系統?
使用 strace
追蹤執行 insmod
的過程會有哪些系統呼叫被執行,可以發現會呼叫 finit_module
,接著呼叫 idempotent_init_module
該函式當中還會呼叫 init_module_from_file
,在 init_module_from_file
才真正呼叫到 load_module
。
在 kernel/module/main.c 可以找到 find_symbol
函式,其使用 List API list_for_each_entry_rcu
和 find_exported_symbol_in_section
來查找模組的符號。
在 include/linux/module.h 中可以找到以下說明
對於模組中使用 EXPORT_SYMBOL_GPL
標記的符號,當一個非自由模組被載入時,核心會拒絕綁定這些符號,從而確保這些符號僅被自由(GPL 授權)模組所使用。這個機制旨在保證核心僅與符合自由軟件定義的模組進行交互。
execve
: 執行指定的程式
brk(NULL)
: 獲取 data segment 最後一個位址
access
: 檢查使用者是否有檔案的權限
openat
: 打開檔案並回傳 directory file descriptor
,如果 dirfd
設置為 AT_FDCWD
,則 pathname 是相對於當前工作目錄的路徑