我在教自己的Linux彙編語言,我遇到了BSD和Linux之間的一個有趣的區別。在Unix中,在調用80h中斷之前,將系統調用參數壓入堆棧;相反,在Linux中,您將參數傳遞到寄存器中。爲什麼Linux不遵循Unix系統調用約定?
有誰知道Linux開發人員使用寄存器而不是棧的原理是什麼?
注意:這裏有一個很好的網頁詳細說明了這種差異:FreeBSD Developer's Handbook:System Calls沒有解釋的理由。
我在教自己的Linux彙編語言,我遇到了BSD和Linux之間的一個有趣的區別。在Unix中,在調用80h中斷之前,將系統調用參數壓入堆棧;相反,在Linux中,您將參數傳遞到寄存器中。爲什麼Linux不遵循Unix系統調用約定?
有誰知道Linux開發人員使用寄存器而不是棧的原理是什麼?
注意:這裏有一個很好的網頁詳細說明了這種差異:FreeBSD Developer's Handbook:System Calls沒有解釋的理由。
您也可以使用一些32位代碼的寄存器。對於32位代碼有幾種調用約定:cdecl,stdcall,pascal和fastcall。 Windows和Linux對32位代碼使用相同的調用約定。通過快速調用(GCC中的__attribute((fastcall)
),前兩個整數參數(帶有一些編譯器的3個參數)可以是寄存器。其他調用約定使用堆棧。
對於64位代碼,Windows和Linux使用不同的調用約定。 Linux可以使用多達14個寄存器進行通話,而Windows只能使用6個。使用寄存器可以使代碼更快。這可能是一些64位代碼與許多函數調用比相同的32位代碼運行O(10%)更快的原因的一部分。
沒有明確的想法,但也許它與執行速度和位置的可訪問性有關?將等待某人澄清。 –
爲什麼你打電話什麼BSD做「Unix」? – unwind
@unwind - 我的問題中包含的超鏈接表明BSD遵循Unix系統調用的約定,而Linux不支持。其他方面呢? – clay