x86_64 SysV ABI的函数调用约定规定,整数参数#4需要在rcx
寄存器中传递。相反地,Linux内核syscall ABI使用r10
来传递同样的参数。对于这两个函数和syscalls,所有其他参数都使用相同的寄存器进行传递。
这导致了一些奇怪的事情。例如,在x32平台上(该平台存在相同的差异),请查看glibc中mmap
的实现:
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相同,考虑它们已经如此相似。