__init和__exit

在linux內核中,所有標識爲__init的函數在連接的時候都存放在.init.text這個區段內,此外,所有的__init函數在區段.initcall.init中還保存了一份函數指針,在初始化時內核會通過這些函數指針調用這些__init函數,並在初始化完成後釋放init區段(包括.init.text,.initcall.init等),這樣可以將該函數佔用的內存釋放出來。

 

__exit修飾詞標記函數只在模塊卸載時使用。如果模塊被直接編進內核或內核不允許卸載模塊。被此標記的函數將被簡單地丟棄。

 

__init和__exit標記函數,__initdata和__exitdata標記數據。

此宏定義可知標記後的函數與數據其實是放到了特定的(代碼或數據)段中。

 

原始定義在include/linux/init.h

#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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章