gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:49:54 31 4
gpt4 key购买 nike

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

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

令我困惑的是 static int fb_mmap() 之后的两个 __functions 就在 "{",

之前

a).这两个__函数的目的是什么?

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

关于c - "static int function(...) __acquires(..) __releases(...){"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21018778/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com