什么“静态int函数(...)__ acquires(...)__releases(...){”是什么意思?

时间:2014-01-09 11:21:44

标签: c linux linux-kernel linux-device-driver

我最近在Linux内核中获得了一段代码:

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

让我感到困惑的是static int fb_mmap()之后的"{"之后的两个__故事,

a).两个__funtions的目的是什么?

b).为什么要担任这个职位?

c).为什么他们有前缀"__"

d).还有其他类似的例子吗?

4 个答案:

答案 0 :(得分:11)

并非以一对括号结尾的所有内容都是函数(调用)。在这种情况下,它们是参数化宏扩展。宏定义为

#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是一个操作系统内核(因为它根本不可用)使用标准库,所以很自然地定义它自己的编译器环境定义,它是私​​有的。因此,这两个下划线表明,这是编译器环境/实现特定的东西。

答案 1 :(得分:1)

它们可能是使用#define定义的宏。您应该查找此类宏的定义并查看它们扩展到的内容。它们可能会扩展到某些pragma,为编译器提供提示;他们可能会扩展到没有给开发人员或某些分析工具提供提示。含义可能会有所不同

答案 2 :(得分:1)

这些宏评估的__attribute__是特定于编译器的功能。 man gcc解释了一些用途。

前缀__通常用于避免名称冲突;双下划线作为前缀,后缀标记编译器本身使用的标识符。

有关gcc属性的更多信息,请here

有关内核使用的更多内容可以在here找到。

答案 3 :(得分:0)

这些是宏定义为

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

在Linux / include / linux / compiler.h中