为什么RCX不用于传递参数给系统调用,被R10取代?

根据System V X86-64 ABI ,应用程序中的函数调用使用以下顺序的寄存器来传递整型参数:

rdi, rsi, rdx, rcx, r8, r9 

但是系统调用参数(除了系统调用号)在另一个寄存器序列中传递:

 rdi, rsi, rdx, r10, r8, r9 

为什么内核使用r10而不是rcx作为第四个参数? 这与r10是不是被保留的事实有什么关系?

Solutions Collecting From Web of "为什么RCX不用于传递参数给系统调用,被R10取代?"

X86-64系统调用使用syscall指令。 该指令将返回地址保存到rcx ,之后从IA32_LSTAR MSR加载rip 。 ie rcxsyscall立即销毁。 这就是为什么rcx不得不被替换为系统调用ABI的原因。

这个同样的syscall指令也将rflags保存到r11 ,然后使用IA32_FMASK MSR屏蔽rflags 。 这就是r11没有被内核保存的原因。

所以,这些改变反映了系统调用机制的工作原理。 这就是为什么内核被迫声明rcxr11没有保存,甚至不能用它们来传递参数。

参考: 英特尔的指令集参考 ,寻找SYSCALL