系统相关
首页 > 系统相关> > linux – 为什么RCX不用于将参数传递给系统调用,而是用R10替换?

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

作者:互联网

参见英文答案 > Linux x64: why does r10 come before r8 and r9 in syscalls?                                    2个
根据System V X86-64 ABI,应用程序中的函数调用使用以下寄存器序列来传递整数参数:

rdi, rsi, rdx, rcx, r8, r9

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

rdi, rsi, rdx, r10, r8, r9

为什么内核使用r10代替rcx作为第四个参数?它是否与某个事实相关,即r10是不保留rcx的?

解决方法:

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

同样的syscall指令还将rflags保存到r11中,然后使用IA32_FMASK MSR屏蔽rflags.这就是内核不保存r11的原因.

因此,这些更改反映了系统调用机制的工作原理.这就是内核被强制声明rcx和r11未保存的原因,甚至不能将它们用于参数传递.

参考:Intel’s Instruction Set Reference,寻找SYSCALL.

标签:linux,x86-64
来源: https://codeday.me/bug/20191001/1839283.html