__devexit在函数声明中的含义是什么?

时间:2015-06-20 00:05:16

标签: c function

我看过的司机有

static void __devexit rtsx_remove(struct pci_dev *pci)

__devexit在函数定义的上下文中意味着什么?我见过的其他函数最多只有static和返回类型。

3 个答案:

答案 0 :(得分:3)

长篇小说:

这是一个扩展为一组gcc 属性的宏。它们是为编译器提供有关代码中各种内容的特殊信息的一种方式,例如,在这种情况下,是一个函数。

不同的编译器为此目的有不同的语法,它不是标准化的。例如,gcc使用属性,但其他编译器使用不同的结构。

很久以来的故事:

所以,我不是Linux内核专家,但从源代码来看,这个宏用于Hotplug。我相信它表示该功能应该在特定设备退出时执行某些操作。

例如,您提供的功能似乎来自用于使用Realtek PCI-Express读卡器驱动程序的Hotplug功能集。

该宏实际上做了什么?那么,让我们仔细看看宏的定义:

#define __devexit        __section(.devexit.text) __exitused __cold

第一部分是__section(.devexit.text)

# define __section(S) __attribute__ ((__section__(#S)))

如您所见,这会创建一个__attribute__(__section__()),其部分名称为".devexit.text"。这意味着gcc会将具有此属性的函数的汇编代码编译为编译二进制文件中名为.devexit.text的命名部分(而不是默认部分)。

第二部分是__exitused(仅在定义MODULE宏时定义为某事物):

#define __exitused  __used

__used取决于gcc版本,定义如下:

# define __used                 __attribute__((__used__))

或者像这样:

# define __used                 __attribute__((__unused__))

前者确保编译具有此属性的函数,即使它未在任何地方引用。后者在相同的情况下会抑制编译器警告,尽管它不会以任何方式影响编译。

最后,__cold

#define __cold                  __attribute__((__cold__))

这是一个属性,通知编译器具有此属性的函数不会经常被调用,因此可以相应地进行优化。

Sooo,我们到底有什么?看起来标有__devexit的函数是只是不经常调用的函数(如果完全调用的话),并填充到命名部分。

所有源代码均来自here。看起来宏现在实际上已经removed from the Linux Kernel

答案 1 :(得分:1)

" ...很可能只是一个注释..." --barak manos

尤里卡!事实证明,神秘元素可能被称为annotation,它增加了有关函数的额外信息。编译器可以检查这些额外的信息,以捕获可能会被忽视的错误。

编辑:@MattMcNabb表示它不是注释。增加了不确定性。

答案 2 :(得分:0)

这些属性在Linux内核中用于某些驱动程序函数和数据声明,将它们放在一个单独的部分中,在某些情况下可以丢弃。

但是,从3.10.x开始不再使用(或定义)它们。请参阅:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=54b956b903607