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

cla*_*lay 5 c unix linux x86 assembly

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

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

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

小智 1

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

但如果你想进入正题,请快速查看这篇文章。基本上是关于速度。通过更改调用约定并使用寄存器而不是堆栈,您可以减少调用的序言和尾声中的指令。