2012-08-07 198 views
3

我正在寻找用于在x86上的内核模块中调用的ABI的官方定义。我最近看了成编译的模块,惊讶地发现:Linux内核模块ABI(x86)

  • 它使用寄存器传递前三个参数(eaxedxecx)。

  • 它不是fastcall,如GCC文档中所述。 docs say fastcall使用ecx和edx(微软风格)。

我可以找到的唯一有点相关的信息是this,但它没有说太多。

所以:

1)是否有任何官方文件的ABI在内核模块中使用(而不是系统调用ABI,而不仅仅是功能列表 - 那些我没找到)。

2)编译器产生这种奇怪的fastcall是怎么回事?有没有我错过的开关?

+1

它实际上是'__fastcall',但不是MS变体,而是Borland版本:http://en.wikipedia.org/wiki/X86_calling_conventions#Borland_fastcall – Necrolis 2012-08-07 14:07:45

+1

请注意,在32位x86系统上,使用了另一种约定对于具有可变参数列表的函数,这些函数将所有的参数都放到堆栈中。 x86-64是另一回事。 – Eugene 2012-08-07 15:20:30

回答

7

-mregparm=3对此负责。

+1

谢谢,这解释了它!现在我知道了我发现的这个关键字(http://lwn.net/Articles/66965/),它可能是整个事物的起源。尽管如此,在文档的某个地方也会很高兴... – 2012-08-07 14:08:07

+1

另一个链接更多的背景:http://lwn.net/Articles/67175/ – 2013-01-15 13:39:50