萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

嵌入式 Linux 核心開發:__init 與 __exit 宏深度解析

定義與來源

__init、__exit 宏定義於 include/linux/init.h,標記核心或模組的初始化與退出函數;__initdata、__exitdata 標記對應資料區域。

#define __init __attribute__ ((__section__ (".init.text")))
#define __initdata __attribute__ ((__section__ (".init.data")))
#define __exitdata __attribute__ ((__section__(".exit.data")))
#define __exit_call __attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
#ifdef MODULE
#define __exit __attribute__ ((__section__(".exit.text")))
#else
#define __exit __attribute_used__ __attribute__ ((__section__(".exit.text")))
#endif

核心原理

透過 GCC __attribute__ 機制,將標記的函數與資料放置於特定 ELF 區段(.init.text、.init.data、.exit.text 等),實現記憶體分區管理與釋放。

__init 標記的函數

僅在系統初始化期間使用。模組載入完成後,核心自動回收這些函數佔用的記憶體,釋放初始化階段不再需要的程式碼空間。

__exit 標記的函數

僅在模組卸載時調用。靜態編譯進核心時不會被調用;若核心編譯未包含該模組,則直接丟棄,不佔用最終映像空間。

__initdata 與 __exitdata

標記初始化與退出階段所需資料結構,同樣歸類到特定區段並在適當時機釋放。

copyright © 萬盛學電腦網 all rights reserved