linux中的_init應用,含有__attribute__ 和section的意義和作用
在linux/init.h中定義如下:
#define __init__section(.init.text) __cold notrace
有些版本的核心是這樣定義的:
#define __init __attribute__ ((__section__ (".init.text"))) __cold
__attribute__
是什麼?
linux核心程式碼使用了大量的GNU C擴充套件,以致於使GNU C成為唯一能夠編譯核心的編譯器,
GNU C這些擴充套件對程式碼的優化、目的碼佈局和安全檢查提供了支援。
__attribute__
就是這些擴充套件中的一個,它主要用來宣告一些特殊的屬性,這些屬性指示
編譯器進行特定的優化和更仔細的程式碼檢查。
GNU C支援十幾個屬性,section是其中一個。
通常編譯器將函式放在.text節,變數放在.data位元組或.bss節,
使用section屬性,可以指定編譯器將函式和變數放在特定節,
那麼_init的修飾或者用_init定義的作用就是將它修飾的程式碼放在.init.text節中。
連結器可以將相同節的函式或資料放在一起,比如_init修飾的程式碼放在.init.text節裡,
初始化後可以釋放部分記憶體。
簡單來說是指示gcc把標記的資料或者函式放到指定sector。
linux中把一些啟動及初始化時候用的資料用__init標識,然後在適當的時候把它們釋放,回收記憶體。
好像這裡引出了更多的疑問,
__attribute__
是什麼
?Linux
核心程式碼使用了大量的
GNU
C
擴充套件,以至於
GNU C
成為能夠編譯核心的唯一編譯器,
GNU C
的這些擴充套件對程式碼優化、目標
程式碼佈局、
安全檢查等方面也提供了很強的支援。
而
__attribute__
就是這些擴充套件中的一個,
它主要被用來宣告一些特殊的屬性,
這些屬性主要被用來指示編譯器進行特定方面的優化和
更仔細的程式碼檢查。
GNU C
支援十幾個屬性,
section
是其中的一個,我們檢視
GCC
的手冊
可以看到下面的描述
好像這裡引出了更多的疑問,
__attribute__
是什麼
?Linux
核心程式碼使用了大量的
GNU
C
擴充套件,以至於
GNU C
成為能夠編譯核心的唯一編譯器,
GNU C
的這些擴充套件對程式碼優化、目標
程式碼佈局、
安全檢查等方面也提供了很強的支援。
而
__attribute__
就是這些擴充套件中的一個,
它主要被用來宣告一些特殊的屬性,
這些屬性主要被用來指示編譯器進行特定方面的優化和
更仔細的程式碼檢查。
GNU C
支援十幾個屬性,
section
是其中的一個,我們檢視
GCC
的手冊
可以看到下面的描述
參考:http://wenku.baidu.com/view/36e7bb24ccbff121dd368344.html
好像這裡引出了更多的疑問,
__attribute__
是什麼
?Linux
核心程式碼使用了大量的
GNU
C
擴充套件,以至於
GNU C
成為能夠編譯核心的唯一編譯器,
GNU C
的這些擴充套件對程式碼優化、目標
程式碼佈局、
安全檢查等方面也提供了很強的支援。
而
__attribute__
就是這些擴充套件中的一個,
它主要被用來宣告一些特殊的屬性,
這些屬性主要被用來指示編譯器進行特定方面的優化和
更仔細的程式碼檢查。
GNU C
支援十幾個屬性,
section
是其中的一個,我們檢視
GCC
的手冊
可以看到下面的描述