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

6
我正在自学Linux汇编语言,发现了BSD和Linux之间的一个有趣区别。在Unix中,在调用80h中断之前,您需要将系统调用参数推入堆栈;相比之下,在Linux中,您需要使用寄存器传递参数。
有人知道Linux开发人员决定使用寄存器而不是堆栈的原因吗?
注意:这是一个详细介绍此区别的好网页:FreeBSD Developer's Handbook:System Calls,但并没有解释其原理。

3
为什么你称BSD所做的事情为“Unix”? - unwind
@clay 我相信你是对的,只是我觉得你的措辞有些奇怪。我复制链接到一个有理由的问题(x86-64上有更多的寄存器,这是寄存器约定适用的地方)。 - unwind
@unwind -- 在发布我的问题之前,我已经阅读了这个问题。据我所知,它提到了不同的调用约定,但并没有给出为什么会这样的权威参考。根据我所知,被接受的答案只是猜测,并没有任何实际权威或历史参考,但也许我错过了某些部分。??? 我真的不认为这是一个重复的问题。 - clay
有两个版本的Unix:AT&T和BSD。 AT&T和伯克利都有使用该名称的权利。 - turboscrew
它们是不同的操作系统;你为什么会期望其中一个的惯例在另一个中相同呢?虽然它们实现了类似的POSIX接口,但这并不重要;它们是不同的系统,做事情的方式也不同。不同是好的。 - Jonathan Leffler
显示剩余3条评论
2个回答

1
系统调用约定不同,因为标准函数调用序列不同。我假设你在谈论x86-32调用约定和AMD64调用约定之间的区别。你可以在这里查看AMD64 ABI。
但是,如果你想快速了解要点,请查看这篇文章。基本上,这是关于速度的问题。通过改变调用约定并使用寄存器而不是堆栈,你可以在调用的序言和结语中节省指令。

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%)更快的原因之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接