为什么Linux不遵循Unix系统调用约定?

时间:2013-12-11 13:43:27

标签: c linux unix assembly x86

我正在自学Linux汇编语言,我遇到了BSD和Linux之间的一个有趣的区别。在Unix中,在调用80h中断之前将syscall参数压入堆栈;相反,在Linux中,您将参数传递给寄存器。

有谁知道Linux开发人员使用寄存器而不是堆栈的理由是什么?

注意:这是一个很好的页面,详细说明了这种差异:FreeBSD Developer's Handbook:System Calls,但未解释其基本原理。

2 个答案:

答案 0 :(得分:1)

系统调用约定不同,因为标准函数调用序列不同。我假设您正在讨论x86-32调用约定和AMD64调用约定之间的区别。您可以查看AMD64 ABI here

但如果你想快点检查this帖子。基本上它是关于速度。通过更改调用约定并使用寄存器而不是堆栈,您可以删除序言和序言中的指令。

答案 1 :(得分:1)

您也可以使用一些32位代码的寄存器。 32位代码有几种调用约定:cdecl,stdcall,pascal和fastcall。 Windows和Linux对32位代码使用相同的调用约定。使用fastcall(GCC中的__attribute((fastcall)),前两个整数参数(3个带有一些编译器)可以是寄存器。其他调用约定使用堆栈。

对于64位代码,Windows和Linux使用不同的调用约定。 Linux最多可以使用14个寄存器进行呼叫,而Windows只能使用6个。使用寄存器可以使代码更快。这可能是一些带有许多函数调用的64位代码比相同的32位代码快O(10%)的部分原因。