为什么RCX不用于将参数传递给系统调用,而是用R10替换?

Rus*_*lan 5 linux x86-64

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

rdi, rsi, rdx, rcx, r8, r9
Run Code Online (Sandbox Code Playgroud)

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

rdi, rsi, rdx, r10, r8, r9
Run Code Online (Sandbox Code Playgroud)

为什么内核使用r10而不是rcx第四个参数?它是否以某种方式与rcx未被保留的事实有关r10

Rus*_*lan 10

X86-64系统调用使用syscall指令.该指令保存返回地址rcx,然后ripIA32_LSTARMSR 加载.即rcx立即被摧毁syscall.这就是rcx必须替换系统调用ABI的原因.

此相同的syscall指令也节省了rflagsr11,然后口罩rflags使用IA32_FMASKMSR.这就是r11内核没有保存的原因.

因此,这些更改反映了系统调用机制的工作原理.这就是为什么内核被强制声明rcx并且r11没有保存,甚至不能使用它们进行参数传递.

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