【发布时间】:2018-11-07 08:05:10
【问题描述】:
在Low-Level Programming: C, Assembly, and Program Execution on Intel® 64 Architecture 的书中说,
关于系统调用参数 系统调用的参数存储在与函数不同的一组寄存器中。第四个参数存储在
r10中,而函数接受rcx中的第四个参数!原因是
syscall指令隐式使用rcx。系统调用不能接受超过六个 论据。
你可以看到这个Stack Overflow post也提到了这个,
系统调用是通过 syscall 指令完成的。这会破坏 %rcx 和 %r11,以及 %rax,但会保留其他寄存器。
我理解破坏 rax 来存储返回码,但为什么 rcx 和 r11 在 syscall 中被破坏?是否有破坏 rcx/r11 的特定系统调用的列表?有没有关于破坏的约定?它们在任何系统调用中都被认为是安全的吗?
【问题讨论】:
-
syscall这样做。没有堆栈切换,内核来不及了。
标签: linux assembly x86-64 system-calls