不是所有以一對括號結尾的東西都是一個函數(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是一個操作系統內核,它沒有(因爲它根本無法使用)使用標準庫,所以很自然,定義它自己的編譯器環境定義,它是私有的。因此兩個下劃線表示這是編譯器環境/實現特定的東西。
它們很可能是宏,所以在頭文件中搜索它們的定義。 –
@JoachimPileborg我不記得在C語法中,你可以把任何東西放在那個位置。 – CodyChan
這很可能是宏擴展到GCC擴展'__attribute__',它確實可以放在那個位置。 –