Try   HackMD

2024q1 Homework6 (integration)

contributed by < max890808 >

自我檢查清單

  • 自己的實體電腦運作 GNU/Linux

  • 閱讀〈Linux 核心模組運作原理〉並對照 Linux 核心原始程式碼 (v6.1+),解釋 insmod 後,Linux 核心模組的符號 (symbol) 如何被 Linux 核心找到 (使用 List API)、MODULE_LICENSE 巨集指定的授權條款又對核心有什麼影響 (GPL 與否對於可用的符號列表有關),以及藉由 strace 追蹤 Linux 核心的掛載,涉及哪些系統呼叫和子系統?

解釋 insmod 後,Linux 核心模組的符號 (symbol) 如何被 Linux 核心找到 (使用 List API)

使用 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_rcufind_exported_symbol_in_section 來查找模組的符號。

MODULE_LICENSE 巨集指定的授權條款又對核心有什麼影響 (GPL 與否對於可用的符號列表有關)

include/linux/module.h 中可以找到以下說明

/*
 * The following license idents are currently accepted as indicating free
 * software modules
 *
 *	"GPL"				[GNU Public License v2]
 *	"GPL v2"			[GNU Public License v2]
 *	"GPL and additional rights"	[GNU Public License v2 rights and more]
 *	"Dual BSD/GPL"			[GNU Public License v2
 *					 or BSD license choice]
 *	"Dual MIT/GPL"			[GNU Public License v2
 *					 or MIT license choice]
 *	"Dual MPL/GPL"			[GNU Public License v2
 *					 or Mozilla license choice]
 *
 * The following other idents are available
 *
 *	"Proprietary"			[Non free products]
 *
 * Both "GPL v2" and "GPL" (the latter also in dual licensed strings) are
 * merely stating that the module is licensed under the GPL v2, but are not
 * telling whether "GPL v2 only" or "GPL v2 or later". The reason why there
 * are two variants is a historic and failed attempt to convey more
 * information in the MODULE_LICENSE string. For module loading the
 * "only/or later" distinction is completely irrelevant and does neither
 * replace the proper license identifiers in the corresponding source file
 * nor amends them in any way. The sole purpose is to make the
 * 'Proprietary' flagging work and to refuse to bind symbols which are
 * exported with EXPORT_SYMBOL_GPL when a non free module is loaded.
 *
 * In the same way "BSD" is not a clear license information. It merely
 * states, that the module is licensed under one of the compatible BSD
 * license variants. The detailed and correct license information is again
 * to be found in the corresponding source files.
 *
 * There are dual licensed components, but when running with Linux it is the
 * GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL
 * is a GPL combined work.
 *
 * This exists for several reasons
 * 1.	So modinfo can show license info for users wanting to vet their setup
 *	is free
 * 2.	So the community can ignore bug reports including proprietary modules
 * 3.	So vendors can do likewise based on their own policies
 */
#define MODULE_LICENSE(_license) MODULE_FILE MODULE_INFO(license, _license)

對於模組中使用 EXPORT_SYMBOL_GPL 標記的符號,當一個非自由模組被載入時,核心會拒絕綁定這些符號,從而確保這些符號僅被自由(GPL 授權)模組所使用。這個機制旨在保證核心僅與符合自由軟件定義的模組進行交互。

藉由 strace 追蹤 Linux 核心的掛載,涉及哪些系統呼叫和子系統?

execve : 執行指定的程式
brk(NULL) : 獲取 data segment 最後一個位址
access : 檢查使用者是否有檔案的權限
openat : 打開檔案並回傳 directory file descriptor ,如果 dirfd 設置為 AT_FDCWD ,則 pathname 是相對於當前工作目錄的路徑