在核心裡經常可以看到__init, __devinit這樣的語句,這都是在init.h中定義的巨集, gcc在編譯時會把被修飾的內容放到這些巨集所代表的section中。
#define __init __section(.init.text) __cold notrace
#define __initdata __section(.init.data)
#define __initconst __section(.init.rodata)
#define __exitdata __section(.exit.data)
#define __exit_call __used __section(.exitcall.exit)
其典型用法如下:
static int __init ***_drv_init(void)
之所以加入這樣的巨集,原因有兩個
1、一部分核心初始化機制依賴它。如kernel將初始化要執行的init函式,分為7個級別,core_initcall, postcore_initcall, arch_initcall, subsys_initcall, fs_initcall, device_initcall, late_initcall。這7個級別優行列級遞減,即先執行core_initcall,最後執行late_initcall。通過使用文中提到的巨集, gcc會將初始化**按下面結構安排。
在核心初始化時,從__initcall_start到__initcall_end之間的initcall被執行一次。
2、提高系統效率
初始化**的特點是:在系統啟動時執行,且一旦執行馬上退出記憶體,不再占用記憶體。
init巨集作用
init 巨集告訴編譯器如果這個模組被編譯到核心則把這個函式放到 init.text 段,這樣當函式初始化完成後這個區域可以被清除掉以節約系統記憶體。kenrel啟動時看到的訊息 freeing unused kernel memory k freed 同它有關。初始化函式是有返回值的,只有在初始化...
Linux驅動 init 巨集呼叫的先後順序
在 linux 核心 裡,到處充滿了 init 巨集 這些巨集先後順序如何呢?下面以 2.6.21 核心作為例子。在linux init.h 裡,有這樣一段 define pure initcall fn define initcall 0 fn,1 define core initcall fn ...
核心初始化優化巨集 init,
核心使用了大量不同的巨集來標記具有不同作用的函式和資料結構。如巨集 init devinit等。這些巨集在include linux init.h標頭檔案中定義。編譯器通過這些巨集可以把 優化放到合適的記憶體位置,以減少記憶體占用和提高核心效率。下面是一些常用的巨集 init,標記核心啟動時使用的初...