2012-07-26 18 views
4

我正在閱讀有關Linux內核開發的內容,我只是閱讀了一些我不明白的文字。下面是段落,它講述了模塊的__init和__exit宏:內置和可加載模塊的__init和__exit宏使用

這演示了內核2.2及更高版本的功能。注意init和cleanup函數定義中的變化 。 __init宏 會導致初始化函數在內置驅動程序完成而不是可加載模塊完成後被丟棄並釋放其內存。 如果您考慮init函數何時被調用,這會使 完美。

還有一個__initdata ,其工作方式與__init相似,但是對於init變量而不是 函數。

__exit宏導致在模塊內置到內核中的 以及類似 __exit的函數被忽略,對可加載模塊沒有影響。同樣,如果您考慮清理功能運行的時間,請參閱:

我明白了;宏__init會導致init函數被拋棄,並且一旦初始化函數完成內置驅動程序,就會釋放其內存。但是爲什麼?不適用於可加載模塊?我無法理解它。

我知道這是一件愚蠢的事情,但我想了一段時間,無法完全理解它。爲什麼選擇內置驅動程序,但不適用於可加載模塊?在__init中分配的變量,地址等都是必需的,對嗎?

+0

http://tldp.org/LDP/lkmpg/2.4/html/x281.htm(來自Linux內核模塊編程指南)包含有關任何人的相關內容。我認爲在這種情況下,作者對他所說的話沒有足夠的重視 - 一旦你瞭解了內核內存組織的細節,它就會變得非常有意義! – Jander 2012-07-26 14:58:56

回答

3

你是對的;即使在一個模塊中,也可能有一些函數在初始化之後真的不需要,因此原則上可以從內存中刪除。 __init對模塊沒有影響的原因更多地是關於實現的容易程度。

This answer to a question about the nature of __init對這個問題有所瞭解。本質上,內核構建系統在所有內核塊中查找所有標記爲__init的函數,並排列它們以使它們全部位於同一塊內存中。

然後,當內核啓動時,它可以一次釋放一塊內存。

這種預先排序的想法對於模塊來說效果不佳。當模塊被加載時,init代碼必須被加載,所以它不能與其他init代碼共享空間。相反,內核必須從每個模塊中挑選幾百個字節並單獨釋放它們。

但是,硬件頁面大小通常爲4KB,因此很難以小於此數量的塊來釋放內存。所以試圖釋放每個模塊中的__init功能可能比它的價值更麻煩。

+0

感謝@Jander的解釋。因此,對於預先構建的模塊 - 初始化__init的預定義內存塊將被釋放。現在有道理。但是,有沒有可加載模塊的內存清理操作?或者他們被認爲可以忽略不計。 – 2012-07-30 07:40:39

+0

不 - 據我所知,沒有這種內存清理可裝載模塊。 – Jander 2012-07-31 05:38:57