2013-03-12 85 views
2

我有點驚訝的是,Linux內核模塊是如此的「脆弱」,需要重新編譯,所以經常重新編譯。在兩臺不同的機器上使用相同的源代碼樹(例如不同版本的gcc)生成不能與內核一起工作的模塊(機器A)(機器B)。什麼引發的linux內核模塊

添加一個虛擬系統調用顯然也需要重新編譯,如果我不想要一個臭名昭著的no symbol version for module_layout錯誤消息。

更令我驚訝的是,在kernel /中添加一個純粹的.c文件,它不會觸及任何ABI(即獨立函數,不會導出,使用或更新任何內部結構)。

添加在新的.c文件中的虛擬文本字符串,讓所有的模塊不變。

那麼究竟什麼是規則,這裏的原理是什麼?我很專注於x86,32位體系結構,如果這很重要的話)

+0

不是因爲它的答案只是一個猜測。基本上,模塊需要知道導出的函數駐留在內核中的哪個位置。內核是一個可以在重新編譯期間更改的模塊。如果使用完全相同的標誌編譯完全相同的代碼,則會得到相同的模塊,因此導出不會被修改。否則模塊會中斷。在實際編譯之前,文件中的註釋會被刪除,從而不會引起任何更改。 – Aneri 2013-03-12 11:11:44

+0

你的意思是說,對於坐在內核本身的表沒有符號解析? – PypeBros 2013-03-12 12:18:32

+0

不,它是在模塊與內核鏈接期間完成的。沒有運行時解析,就像在DLL中一樣。 – Aneri 2013-03-13 11:31:42

回答

1

你似乎過分關注重建內核和(可加載)模塊的編譯方面,而忘記了鏈接。我懷疑當你聲明需要「重新編譯」時,你可能會誇大其詞。

令我驚訝更是增加內核僅僅.c文件/,不碰任何ABI(即一個獨立的功能,即不出口,使用或更新任何內部結構)

當您在.C文件(又名源模塊)添加到內核,是新編譯的對象文件將需要建設使用鏈接器新的內核映像。由於沒有評估哪些全局內核符號移動或沒有移動,因此所有(可加載的)模塊將不得不用新的符號映射重建(實際上只是重新鏈接)。所有內核模塊的「重新編譯」是不必要的;只是的.o對象文件必須被改建爲使用新的內核符號映射可加載模塊。

爲確保(可加載的)模塊正在以其匹配的內核&符號映射執行,版本控制和內部版本信息在加載內核模塊時進行驗證。你所說的「脆弱」實際上是一種安全措施,以確保在特權模式下執行的代碼的完整性。

+0

感謝您的澄清,並且我應該使用「重新構建」而不是「重新編譯」,因爲我沒有檢查在這些模塊上應用了哪些步驟,只是在之前的「構建模塊」中生成的模塊會不再加載。 – PypeBros 2013-03-13 13:44:06