我刚浏览了Linux内核源代码树,并阅读了文件tools/include/nolibc/nolibc.h。在这个文件中,我看到
是否有真正的
syscall
使用了%r8、%r9
和%r10
。此外,有一个注释说:
据我所知,rcx和r8..r11可能被破坏,其他都保留。
syscall
只会破坏%rax
、%rcx
和%r11
(以及内存)。是否有真正的
syscall
示例会破坏%r8
、%r9
和%r10
?
%r8
、%r9
和%r10
放入我的系统调用破坏列表(内联汇编),而它目前正在生产应用程序上运行。但是到目前为止,我还没有看到任何问题。 - Ammar Faizi%r8...%r10
没有被破坏。https://elixir.bootlin.com/linux/latest/source/arch/x86/entry/entry_64.S#L50 - Ammar FaiziPUSH_AND_CLEAR_REGS
和第193行的POP_REGS
。它们保存和恢复了r8-r10,因此除非系统调用显式地干扰了栈中的副本,否则它们将被保留。当然,其中一个例子是exec
,但它不返回,所以没有什么好担心的 :) - Jester