2014-01-09 131 views
3

我最近買了一個代碼片段在Linux內核:「static int function(...)__acquires(..)__releases(...){」是什麼意思?

static int 
fb_mmap(struct file *file, struct vm_area_struct * vma) 
__acquires(&info->lock) 
__releases(&info->lock) 
{ 
... 
} 

什麼困惑我的是兩個__funtions以下"{"前右static int fb_mmap()

a).哪兩種__funtions的目的是什麼?

b).爲什麼在那個位置?

c).爲什麼他們有前綴"__"

d).還有其他類似的例子嗎?

+0

它們很可能是宏,所以在頭文件中搜索它們的定義。 –

+1

@JoachimPileborg我不記得在C語法中,你可以把任何東西放在那個位置。 – CodyChan

+0

這很可能是宏擴展到GCC擴展'__attribute__',它確實可以放在那個位置。 –

回答

7

不是所有以一對括號結尾的東西都是一個函數(call)。在這種情況下,它們是參數化的宏擴展。這些宏被定義爲內核構建樹中的

#define __acquires(x) __attribute__((context(x,0,1))) 
#define __releases(x) __attribute__((context(x,1,0))) 

include/linux/compiler.h文件。

這些擴展到屬性定義中的宏的目的是用關於函數將獲取(即鎖定)和釋放(即解鎖)哪些鎖定結構的信息來註釋函數符號。這些特別的目的是調試鎖定機制(Linux內核包含一些代碼,允許它檢測潛在的死鎖情況並報告這一點)。

https://en.wikipedia.org/wiki/Sparse

__attribute__是特定的GCC編譯器,它允許轉讓,以及關鍵字,屬性給定的符號 http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes

由於宏是在文本上擴建,之前編譯器甚至看它,結果爲您的特定片段,實際編譯器看到將是

static int 
fb_mmap(struct file *file, struct vm_area_struct * vma) 
__attribute__((context(&info->lock,0,1))) 
__attribute__((context(&info->lock,1,0))) 
{ 
… 
} 

這些宏以雙重e強調__表示它們是編譯器環境的一部分。所有以一或兩個下劃線開頭的標識符都是爲編譯器環境實現保留的。對於Linux內核來說,因爲Linux是一個操作系統內核,它沒有(因爲它根本無法使用)使用標準庫,所以很自然,定義它自己的編譯器環境定義,它是私​​有的。因此兩個下劃線表示這是編譯器環境/實現特定的東西。

+0

謝謝。足夠詳細。 – CodyChan

1

它們可能是用#define定義的宏。您應該查找這些宏的定義,並查看它們擴展到的內容。他們可能會擴展到pragma給編譯器提示;他們可能擴大到沒有給開發者或某些分析工具提示。含義可能會有所不同

+0

你可以把宏放在那個位置?我不記得在C語法中,你可以把任何東西放在那個位置上。還有什麼我可以放在那裏嗎? – CodyChan

+0

你可以把宏放在任何你想要的地方。當預處理器解析源文件時,它或多或少地執行宏的查找和替換*及其內容。它可能擴大到無,這顯然很好;它可能擴展到一些編譯指示,這可能仍然很好,這取決於編譯器 –

0

這些都是宏觀的定義爲

# define __acquires(x) __attribute__((context(x,0,1))) 
# define __releases(x) __attribute__((context(x,1,0))) 
在Linux中

/在include/linux/compiler.h

+0

謝謝,最讓我困惑的是他們的位置。我不記得你可以把一件事情放在那個位置上。 – CodyChan

1

__attribute__這些宏就特定編譯器的功能。 man gcc解釋了一些用途。

前綴__通常用於避免名稱衝突;雙下劃線作爲前綴,後綴標記爲編譯器自身使用的標識符。

有關gcc屬性的更多信息,請參閱here

更多關於這些內核的使用可以找到here

相關問題