我在最新的ARM架构中了解了SVC 0' (系统调用)指令USER模式切换到SVC模式。 系统调用的返回值存储在r0寄存器中,SPSR_SVC复制到CPSR。 我想知道api是怎么做到的?
答案 0 :(得分:1)
SVC
指令的架构操作是将CPSR保存到SPSR_SVC,将以下指令的地址保存到LR_SVC,将CPU切换到SVC模式,将PC设置为SVC异常向量(0x08)并从那里继续执行。这就是该指令的硬件所做的(作为单个原子操作) - 不涉及“API”。 SVC处理程序代码,一旦完成它想做的任何事情,通常会执行一个异常返回指令 * ,它基本上会执行所有反向操作 - 从SPSR_SVC恢复模式和CPSR状态,设置PC到LR_SVC,并继续处于恢复模式。
现在,any other ABI on top of that完全可以选择正在实施的系统。如果Linux chooses to use r0 to return a value,那就是它的系统调用处理程序代码的编写方式。其他系统可能会做一些完全不同的事情。
* 取决于指令集,异常的级别以及是否涉及堆栈,通常是ERET
,SUBS PC, LR, #0
或{{}}之一{3}}