假设我有一个简单的aarch64函数,通过SVC进行系统调用,看起来像这样(iOS目标):
make_syscall:
stp fp, lr, [sp, #-16]!
add fp, sp, #0
mov x16, SYSCALL_NUM
svc #128
ldp fp, lr, [sp], #16
ret
问题:由于该函数只修改了调用者保存的x16,除了帧指针和链接寄存器之外是否需要保存/恢复任何其他寄存器?换句话说,可以假设SVC处理程序遵循ABI过程调用约定吗?
由于
答案 0 :(得分:0)
我想我找到了问题的答案: https://events.linuxfoundation.org/images/stories/pdf/lcna_co2012_marinas.pdf 在第14-15页,它讨论了当用户模式转换到更高模式时arm 64bit的作用。 简单地说,内核会自动将GPR保存到内核堆栈中,但不会像用户代码那样明确地保存在内核堆栈中。