核心初始化優化巨集 ,初始化順序, init,

2021-06-06 16:00:25 字數 2111 閱讀 8591

核心使用了大量不同的巨集來標記具有不同作用的函式和資料結構。如巨集__init 、__devinit 等。這些巨集在include/linux/init.h 標頭檔案中定義。編譯器通過這些巨集可以把**優化放到合適的記憶體位置,以減少記憶體占用和提高核心效率。

下面是一些常用的巨集:

·   __init ,標記核心啟動時使用的初始化**,核心啟動完成後不再需要。以此標記的**位於.init.text 記憶體區域。它的巨集定義是這樣的:

·     

#define _ _init    _ _attribute_ _ ((_ _section_ _ (".text.init")))

·   __exit ,標記退出**,對於非模組無效。

·   __initdata ,標記核心啟動時使用的初始化資料結構,核心啟動完成後不再需要。以此標記的**位於.init.data 記憶體區域。

·   __devinit ,標記裝置初始化使用的**。

·   __devinitdata ,標記初始化裝置資料結構的函式。

·   __devexit ,標記移除裝置時使用的**。

·   ***_initcall ,一系列的初始化**,按降序優先順序排列。

初始化**的記憶體結構

_init_begin              -------------------

|  .init.text       | ---- __init

|-------------------|

|  .init.data       | ---- __initdata

_setup_start            |-------------------|

|  .init.setup      | ---- __setup_param

__initcall_start        |-------------------|

|  .initcall1.init  | ---- core_initcall

|-------------------|

|  .initcall2.init  | ---- postcore_initcall

|-------------------|

|  .initcall3.init  | ---- arch_initcall

|-------------------|

|  .initcall4.init  | ---- subsys_initcall

|-------------------|

|  .initcall5.init  | ---- fs_initcall

|-------------------|

|  .initcall6.init  | ---- device_initcall

|-------------------|

|  .initcall7.init  | ---- late_initcall

__initcall_end          |-------------------|

|                   |

|    ... ... ...    |

|                   |

__init_end              -------------------

初始化**的特點是:在系統啟動執行,且一旦執行後馬上退出記憶體,不再占用記憶體。

對於驅動程式模組來說,這些優化標記使用的情況如下:

·   通過module_init() 和module_exit() 函式呼叫的函式就需要使用__init 和__exit 巨集來標記。

·   pci_driver 資料結構不需標記。

·   probe() 和remove() 函式應該使用__devinit 和__devexit 標記,且只能標記probe() 和remove()

·   如果remove() 使用__devexit 標記,則在pci_driver 結構中要用__devexit_p(remove) 來引用remove() 函式。

·   如果你不確定需不需要新增優化巨集則不要新增。

補充:例如,如果要在驅動中使用i2c或者spi匯流排,那麼他們的初始化常常會被賦值為subsys_initcall()等

zz:

核心初始化優化巨集 ,初始化順序, init,

來自 http www.17xie.com read 54054.html 核心使用了大量不同的巨集來標記具有不同作用的函式和資料結構。如巨集 init devinit 等。這些巨集在include linux init.h 標頭檔案中定義。編譯器通過這些巨集可以把 優化放到合適的記憶體位置,以減少...

核心初始化優化巨集 ,初始化順序, init,

來自 核心使用了大量不同的巨集來標記具有不同作用的函式和資料結構。如巨集 init devinit 等。這些巨集在include linux init.h 標頭檔案中定義。編譯器通過這些巨集可以把 優化放到合適的記憶體位置,以減少記憶體占用和提高核心效率。下面是一些常用的巨集 init 標記核心啟動...

核心初始化優化巨集 ,初始化順序, init,

核心使用了大量不同的巨集來標記具有不同作用的函式和資料結構。如巨集 init devinit 等。這些巨集在include linux init.h 標頭檔案中定義。編譯器通過這些巨集可以把 優化放到合適的記憶體位置,以減少記憶體占用和提高核心效率。下面是一些常用的巨集 init 標記核心啟動時使用...