Linux

關於linux核心外部模組建構過程的一些問題

  • July 5, 2015

用於建構外部模組的 Linux 核心文件頁面(https://www.kernel.org/doc/Documentation/kbuild/modules.txt)這樣說:

> > === 2. 如何建構外部模組 > > >

要建構外部模組,您必須有一個可用的預建構核心,其中包含建構中使用的配置和標頭檔。此外,核心必須是在啟用模組的情況下建構的。如果您使用的是發行版核心,您的發行版將為您執行的核心提供一個包。

另一種方法是使用“make”目標“modules_prepare”。這將確保核心包含所需的資訊。該目標僅作為一種簡單的方法而存在,可以為建構外部模組準備核心原始碼樹。

我的問題如下:

  1. >

要建構外部模組,您必須有一個可用的預建構核心,其中包含建構中使用的配置和標頭檔

“預建核心”是指編譯後的二進制映像(通常命名為 vmlinux/vmlinuz)嗎?為什麼需要二進製圖像?難道配置文件、標頭檔和編譯器就夠了嗎?

  1. >

要建構外部模組,您必須有一個可用的預建構核心**,其中包含建構中使用的配置和標頭檔**。

如果預建核心是指二進制映像,那麼“包含配置和標頭檔”是什麼意思?我可以理解需要“包含配置和標頭檔”的原始碼樹,但是在二進制的情況下,這些文件只是用於生成指令對嗎?那麼“包含”是什麼意思呢?“預建構核心”是指建構核心的整個原始碼樹嗎?

  1. >

此外,核心必須在建構時啟用了模組

他們是指這裡的“製作模組”步驟還是有所不同?

  1. >

如果您使用的是發行版核心,您的發行版將為您執行的核心提供一個包。

我想他們在這裡指的是 kernel-devel 包,它提供了在核心建構過程中使用的標頭檔和配置文件。那是對的嗎?

  1. >

另一種方法是使用“make”目標“modules_prepare”。這將確保核心包含所需的資訊。

這是什麼意思?這是否意味著如果我們在源目錄中執行“make modules_prepare”,我們不需要建構核心二進製文件就可以建構外部模組?

廣告 1. 和 2. 核心映像稱為 vmlinux,沒錯,但這並不是您在建構外部模組時真正需要的。需要的是來自這個核心的配置和標頭檔。

ad 3. 要建構內部或外部模組,您需要在此核心中支持可載入模組,當然,您希望建構模組,因此核心必須配置為啟用 _modules

核心由配置程序之一配置,可幫助您在.config核心原始碼樹或$KBUILD_OUTPUT路徑中創建文件,以進行樹外建構。

ad 4. 你在哪裡找到這樣的包或它們如何命名取決於你的發行版,但我認為它通常被稱為kernel-devel. 我實際上不知道,因為我多年來一直使用自己的核心樹。

ad 5. 是的,您實際上不需要核心二進製文件來編譯外部模組,但是您取消了下面的註釋

注意:即使設置了 CONFIG_MODVERSIONS,“modules_prepare”也不會建構 Module.symvers;因此,需要執行完整的核心建構以使模組版本控制工作。

我認為大多數核心都使用 CONFIG_MODVERSIONS。你可以在你的.config文件中看到這個

$ grep MODVERSIONS .config
CONFIG_MODVERSIONS=y

這意味著,您建構的模組僅適用於您建構它的核心版本和配置。

所以你可以為那個核心和核心版本建構一個模組,但是你不能在沒有那個核心和核心版本的情況下執行它。

這就是為什麼您可以在沒有完整核心原始碼樹的情況下為分發核心建構外部模組的原因,如果您安裝核心配置和標頭檔,則建構分發核心是使用的。

實際上,大多數時候您只想為執行系統的核心建構一個外部模組。如果您自己建構了核心,則從核心原始碼樹中,您將已經擁有與該核心匹配的核心配置和標頭檔。

如果您執行發行版核心,則必須從發行版中安裝該文件。

引用自:https://unix.stackexchange.com/questions/213947