x86_64 SysV ABI的函數調用約定定義了要在rcx
寄存器中傳遞的整數參數#4。另一方面,Linux內核系統調用ABI爲了同樣的目的使用r10
。所有其他參數都傳遞到函數和系統調用的相同寄存器中。x86_64 Linux函數和系統調用之間的ABI差異
這會導致一些奇怪的事情。退房,例如,mmap
glibc中實現了X32平臺(針對同一存在差異):
00432ce0 <__mmap>:
432ce0: 49 89 ca mov %rcx,%r10
432ce3: b8 09 00 00 40 mov $0x40000009,%eax
432ce8: 0f 05 syscall
因此,所有的寄存器都已經到位,但我們移動rcx
到r10
。
我想知道爲什麼不把系統調用ABI定義爲與函數調用ABI相同,因爲它們已經如此相似。
在[另一個ABI答案](http://stackoverflow.com/a/35619528/224132)中,我發現了一些AMD架構師和Linux內核開發人員發佈amd64郵件列表帖子的鏈接,之後發佈了第一個AMD64芯片。這裏有一些有趣的東西,比如實驗結果(從編譯SPECint並查看代碼大小和指令數量)導致x86-64 SysV ABI選擇哪個寄存器用於什麼。 –