2017-08-07 208 views
2

我看到在一些操作系統內核下面的代碼。但我不明白__section的使用方式,不知道這段代碼是什麼意思。什麼__section()意味着Linux內核源

#define KEEP_PAGER(sym) \ 
    extern const unsigned long ____keep_pager_##sym; \ 
    const unsigned long ____keep_pager_##sym \ 
     __section("__keep_meta_vars_pager") = (unsigned long)&sym 
+0

結束時,你是否嘗試過*它搜索*的代碼,看看它的聲明或任何定義的? –

+2

謝謝,明白吧。它在另一個#define中定義。我在徘徊,爲什麼它沒有包含屬性。我終於我發現以下的#define:'#定義__section(X)\t __attribute __((段(X)))' –

回答

3

它是圍繞GCC extension環繞的特定linux內核C macro definition,指定atttribute to use for an object。這是寫部分屬性定義

歷史Linux內核的一個較短的方式已經written specifically for building with the GCC compiler,並大量使用低水平擴展做具體的硬件操作和最佳化。

部分屬性專門用於確定標記與它的對象的存儲位置。 ELF binary format安排目標文件到指定的段,並使用這樣的屬性,允許程序員更精確地指定爲加標籤的物體的信息將被放置在目標對象

多年來,有許多人的工作投入到增加不同的編譯器之間的這些編譯器擴展的兼容性,以及讓Linux編譯與替代編譯器(如果你看看the linux header file where the macro is defined你會發現它充滿了各種編譯器特徵的條件指令)。像這樣的宏可以是一種有用的方式,可以爲跨越不同編譯器實現的低級功能提供可移植的內部API。

內核和內核驅動程序的C代碼是非典型關心的物理硬件實現直接的細節,並需要明確有關的方式編譯二進制輸出應用級別的C代碼很少會。

爲什麼linux內核使用命名段的一個例子是在init handling中 - 僅在啓動時使用的函數和數據被分組爲一段內存,一旦啓動完成後可以輕鬆釋放 - 您可能熟悉沿着「釋放未使用的內核內存:...」的線啓動消息對linux的啓動順序

+1

是的,這的確是一個宏觀的包裝屬性,我將展開解釋 – cms

+0

這將是爲什麼發明了你自家釀造的宏觀語言是一個壞主意。這個宏只是天真的,因爲一些其他的編譯器可能會使用的東西,比如'#pragma'內存部分,在這種情況下,該宏將無法正常工作。無論如何,Linux永遠不會在GCC以外的任何其他編譯器上工作,只是過度依賴編譯器特有的功能。 – Lundin

0

這是很難說__section到底是什麼沒有它的定義,但它可能是一個變量「一節」屬性。它用於將編譯器的地址變量放入與「bss」或「data」不同的部分。詳情請參閱GCC documentation