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


 

__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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM