簡體   English   中英

什么“靜態int函數(...)__ acquires(...)__releases(...){”是什么意思?

[英]what does “static int function(…) __acquires(..) __releases(…){” mean?

我最近在Linux內核中得到了一段代碼:

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

令我困惑的是在"{"之前的static int fb_mmap()之后的兩個__funtions,

a). 這兩個__funtions的目的是什么?

b). 為什么在那個位置?

c). 為什么他們有前綴"__"

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

並非以一對括號結尾的所有內容都是函數(調用)。 在這種情況下,它們是參數化宏擴展。 宏定義為

#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)))
{
…
}

這些宏以雙下划線__開頭,表示它們是編譯器環境的一部分。 所有以一個或兩個下划線開頭的標識符都保留用於編譯器環境實現。 對於Linux內核,因為Linux是一個操作系統內核(因為它根本不可用)使用標准庫,所以很自然地定義它自己的編譯器環境定義,它是私​​有的。 因此,兩個下划線表明,這是編譯器環境/實現特定的東西。

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

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

前綴__通常用於避免名稱沖突; 雙下划線作為前綴,后綴標記編譯器本身使用的標識符。

有關gcc屬性的更多信息,請點擊此處

關於內核的更多內容可以在這里找到。

這些是宏的定義為

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

在Linux / include / linux / compiler.h中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM