2013-12-11 77 views
5

我在教自己的Linux彙編語言,我遇到了BSD和Linux之間的一個有趣的區別。在Unix中,在調用80h中斷之前,將系統調用參數壓入堆棧;相反,在Linux中,您將參數傳遞到寄存器中。爲什麼Linux不遵循Unix系統調用約定?

有誰知道Linux開發人員使用寄存器而不是棧的原理是什麼?

注意:這裏有一個很好的網頁詳細說明了這種差異:FreeBSD Developer's Handbook:System Calls沒有解釋的理由。

+0

沒有明確的想法,但也許它與執行速度和位置的可訪問性有關?將等待某人澄清。 –

+3

爲什麼你打電話什麼BSD做「Unix」? – unwind

+0

@unwind - 我的問題中包含的超鏈接表明BSD遵循Unix系統調用的約定,而Linux不支持。其他方面呢? – clay

回答

1

系統調用約定不同,因爲標準函數調用序列是不同的。我假設你在談論x86-32調用約定和AMD64調用約定之間的區別。您可以查看AMD64 ABI here

但是如果你想快點檢查this的帖子。基本上它是關於速度。通過改變呼叫約定和使用寄存器而不是堆棧,你可以在序幕和尾聲中刪除指令。

1

您也可以使用一些32位代碼的寄存器。對於32位代碼有幾種調用約定:cdecl,stdcall,pascal和fastcall。 Windows和Linux對32位代碼使用相同的調用約定。通過快速調用(GCC中的__attribute((fastcall)),前兩個整數參數(帶有一些編譯器的3個參數)可以是寄存器。其他調用約定使用堆棧。

對於64位代碼,Windows和Linux使用不同的調用約定。 Linux可以使用多達14個寄存器進行通話,而Windows只能使用6個。使用寄存器可以使代碼更快。這可能是一些64位代碼與許多函數調用比相同的32位代碼運行O(10%)更快的原因的一部分。