在Linux i386上,int $0x80
系统调用ABI使得在没有有效用户空间堆栈的情况下轻松执行系统调用。另一方面,vdso / vsyscall接口需要访问堆栈。其他Linux端口如何在这方面发挥作用,尤其是x86_64?他们有办法在没有堆栈的情况下进行系统调用吗?是否有关于每个拱门的可用系统调用方法的参考?
答案 0 :(得分:4)
总的来说:不知道。即使在i386上,如果有第6个参数,也必须在堆栈上传递(例如mmap
)。
具体来说,对于x86_64:将系统调用号放在%rax
中(注意:系统调用号的分配与32位完全不同),%rdi
中最多6个参数,{{1} },%rsi
,%rdx
,%r10
和%r8
(几乎,但不完全相同,与寄存器中参数传递的通常ABI相同 - 注意使用{ {1}}而不是%r9
),并使用%r10
指令。结果在%rcx
中返回,syscall
和%rax
被破坏。
x86_64 ABI信息可在http://www.x86-64.org/documentation/abi.pdf找到; Linux ABI记录在附录中。 (如果在其他地方查找x86_64 ABI信息,请注意64位Windows使用自己不同的ABI。)
我认为%rcx
的用户堆栈框架没有任何要求才能正常工作。在被信号中断的情况下,处理器显然需要一个理智的堆栈;但是下面的实验,它使用一个替代信号堆栈并故意在%r11
周围跟踪syscall
,对我来说很好:
%rsp