C - "static int function(...) __acquires(..) __releases(...){"是什么意思?



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

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

让我困惑的是static int fb_mmap()后面紧接着"{"的两个__函数,

a).这两项功能的目的是什么?

b).为什么处于那个位置?

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

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

并不是所有以括号结尾的东西都是函数(调用)。在这种情况下,它们是参数化的宏展开。宏被定义为

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

在内核构建树中的文件CCD_ 8中。

这些宏扩展到属性定义的目的是用函数将获取(即锁定)和释放(即解锁)哪些锁定结构的信息来注释函数符号。它们的目的尤其是调试锁定机制(Linux内核包含一些代码,允许它检测潜在的死锁情况并报告这一情况)。

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

__attribute__是GCC编译器特有的关键字,它允许为给定的符号分配属性http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-属性

由于宏是在文本级别展开的,所以在编译器查看它之前,实际编译器看到的特定代码段的结果将是

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 中

最新更新