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

Ken*_*ron 10 c function

我看过一个司机

static void __devexit rtsx_remove(struct pci_dev *pci)
Run Code Online (Sandbox Code Playgroud)

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

小智 4

长篇故事短篇:

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

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

故事有点长:

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

例如,您提供的函数似乎来自用于与 Realtek PCI-Express 读卡器驱动程序配合使用的热插拔函数集。

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

#define __devexit        __section(.devexit.text) __exitused __cold
Run Code Online (Sandbox Code Playgroud)

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

# define __section(S) __attribute__ ((__section__(#S)))
Run Code Online (Sandbox Code Playgroud)

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

第二部分是__exitused(仅当定义了MODULE宏时才定义为某些内容):

#define __exitused  __used
Run Code Online (Sandbox Code Playgroud)

根据__usedgcc 版本,定义如下:

# define __used                 __attribute__((__used__))
Run Code Online (Sandbox Code Playgroud)

或者像这样:

# define __used                 __attribute__((__unused__))
Run Code Online (Sandbox Code Playgroud)

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

最后,__cold

#define __cold                  __attribute__((__cold__))
Run Code Online (Sandbox Code Playgroud)

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

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

所有源代码均取自此处。看起来该宏现在实际上已经从 Linux 内核中删除了。