2015-06-20 84 views
9

驱动程序我看着有__devexit在函数声明中的含义是什么?

static void __devexit rtsx_remove(struct pci_dev *pci) 

是什么意思__devexit在函数定义的范围内?我见过的其他函数最多有static和返回类型。

+0

这是在这个问题上的两个尝试。看起来第一次尝试被无关的细节蒙上了一层阴影,以至于没有得到答复。我想删除这个问题,但是堆栈溢出警告说它被压低了,我觉得编辑会使以前的回答看起来不相关。如果有人建议选择编辑/删除,请告诉我。 – Kenkron

+7

为什么不右键单击'__devexit'符号,进入其定义,并确切地看到它是什么意思?它很可能只是一个注释,用于通过外部工具生成预定义的警告,该工具会检查编码的正确性等。 –

+2

这是Unix内核中的一些宏:http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/init.h – SomethingSomething

回答

2

龙十岁上下简而言之:

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

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

龙十岁上下的故事长上下的:

所以,我没有Linux内核专家,而是由源代码来看,这个宏用于Hotplug。我相信它意味着函数应该用一个特定的设备退出。

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

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

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

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

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

正如你所看到的,这与部分名称为".devexit.text"创建__attribute__(__section__())。这意味着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

非常感谢,你是一位绅士和学者。 – Kenkron

1

“......这是最有可能只是一个注解......” --barak马诺斯

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

编辑:@MattMcNabb说这不是一个注释。增加不确定性

+0

这可能是很多事情,因为它很可能是一个宏。 – Olaf

+1

如果它是[Linux内核__devexit](http://lxr.free-electrons.com/ident?v = 2.6.33; i = _devexit),那么它肯定不是一个“注释”。 –

+0

好的,它是什么? – Kenkron

相关问题