1. 程式人生 > >內核中的宏定義__init、__initdata和__exit、__exitdata

內核中的宏定義__init、__initdata和__exit、__exitdata

sil 區域 聲明 ons cpu blog class bit fine

__init、__initdata和__exit、__exitdata的定義位於<kernel/include/linux/init.h>

 1 /* These are for everybody (although not all archs will actually
 2    discard it in modules) */
 3 #define __init      __section(.init.text) __cold notrace
 4 #define __initdata  __section(.init.data)
 5 #define __initconst __constsection(.init.rodata)
 6
#define __exitdata __section(.exit.data) 7 #define __exit_call __used __section(.exitcall.exit) 8 9 10 #define __exit __section(.exit.text) __exitused __cold notrace 11 12 /* For assembly routines */ 13 #define __HEAD .section ".head.text","ax" 14 #define __INIT .section ".init.text","ax" 15
#define __FINIT .previous 16 17 #define __INITDATA .section ".init.data","aw",%progbits 18 #define __INITRODATA .section ".init.rodata","a",%progbits 19 #define __FINITDATA .previous 20 21 #define __CPUINIT .section ".cpuinit.text", "ax" 22 #define __CPUINITDATA .section ".cpuinit.data", "aw" 23
#define __CPUINITRODATA .section ".cpuinit.rodata", "a" 24 25 #define __MEMINIT .section ".meminit.text", "ax" 26 #define __MEMINITDATA .section ".meminit.data", "aw" 27 #define __MEMINITRODATA .section ".meminit.rodata", "a" 28 29 /* silence warnings when references are OK */ 30 #define __REF .section ".ref.text", "ax" 31 #define __REFDATA .section ".ref.data", "aw" 32 #define __REFCONST .section ".ref.rodata", "a"

這些宏大多跟和section相關的定義

這些宏定義的作用是告訴編譯器將這些函數或者數據放入相應的section中,一般是指放置到內核鏡像的哪個位置上。內核中的內容按照分段的原則來存放。具體段的存放規則是由vmlinux.lds文件定義,它是負責把段信息告訴鏈接器的,當然我們也要在代碼中聲明屬於哪個段。 通常編譯器將函數放在.text 節,變量放在.data 或 .bss 節,使用 section 屬性,可以讓編譯器將函數或變量放在指定的節中。 在模塊加載的階段,.ko文件中的代碼和數據的加載區域是根據section來加載的。 比如:如果函數的定義中帶有__init,那麽這個函數的所有代碼會被放入.init.text的section中。 如果函數的定義中帶有__initdata,那麽這個函數的所有代碼會被放入.init.data的section中。 之所以要使用這個宏定義,其中一個原因是標記為初始化的函數和數據,表明該函數和數據僅在初始化期間使用。在模塊裝載之後,模塊裝載就會將初始化函數扔掉。這樣可以將該函數占用的內存釋放出來。

詳見:

關於__init、__initdata和__exit、__exitdata的學習筆記

內核中的宏定義__init,__initdata,__exitdata

內核中的宏定義__init、__initdata和__exit、__exitdata