我正在寻找用于在x86上的内核模块中调用的ABI的官方定义。我最近看了成编译的模块,惊讶地发现:Linux内核模块ABI(x86)
它使用寄存器传递前三个参数(
eax
,edx
和ecx
)。它不是
fastcall
,如GCC文档中所述。 docs sayfastcall
使用ecx和edx(微软风格)。
我可以找到的唯一有点相关的信息是this,但它没有说太多。
所以:
1)是否有任何官方文件的ABI在内核模块中使用(而不是系统调用ABI,而不仅仅是功能列表 - 那些我没找到)。
2)编译器产生这种奇怪的fastcall是怎么回事?有没有我错过的开关?
它实际上是'__fastcall',但不是MS变体,而是Borland版本:http://en.wikipedia.org/wiki/X86_calling_conventions#Borland_fastcall – Necrolis 2012-08-07 14:07:45
请注意,在32位x86系统上,使用了另一种约定对于具有可变参数列表的函数,这些函数将所有的参数都放到堆栈中。 x86-64是另一回事。 – Eugene 2012-08-07 15:20:30