Linux: __init, __initdata, __exit

今天聽一個同事報告關於linux device driver,在他的報告中提到這幾個東西,其實關於這些修飾子的說明在LDD3的第二章就有出現了,節錄一下原文的說明好了,範例也是從原文中節錄


static int __init initialization_function(void)
{
/* Initialization code here */
}
module_init(initialization_function);

這個範例只是單純的要說明module載入的第一步驟,寫好module_init要被呼叫到的API,在initialization_function的前面可以看到__init。原文的解釋如下:


The __init token in the definition may look a little strange; it is a hint to the kernel that the given function is
used only at initialization time. The module loader drops the initialization function after the module is loaded, making its memory available for other uses. There is a similar tag (__initdata)for data used only during initialization

也就是加註了__init之後,就要確保該API以及被標記的data structure只會在initialize的時候被使用到一次就不會再使用了,也不可以再被其他API給呼叫到,因為該API在執行過一次之後就會從記憶體中釋放掉了,因為宣告成__init的關係,他在編譯的時候會放到特殊的區段內,因此會從記憶體中被釋放掉供其他使用,如此作可以將module作優化的動作,畢竟似乎是對記憶體的使用比較有效率的樣子,但是我想像是相機這樣的driver, 因為會有開跟關的動作,在init的部分似乎就只能簡化到註冊上platform driver吧,不然gpio的configure和register的初始化的API要是被free掉了應該就掛點了。

留言

熱門文章