Linux kernel 如何将SVC模式更改为用户模式?

Linux kernel 如何将SVC模式更改为用户模式?,linux-kernel,arm,system-calls,Linux Kernel,Arm,System Calls,我了解在最新的ARM架构中,通过“SVC 0”(系统调用)指令将用户模式切换到SVC模式。 系统调用的返回值存储在r0寄存器中,SPSR_SVC复制到CPSR。 我想知道哪个api是如何做到这一点的?SVC指令的体系结构操作是将CPSR保存到SPSR_SVC,将以下指令的地址保存到LR_SVC,将CPU切换到SVC模式,将PC设置为SVC异常向量(0x08),然后从那里继续执行。这正是硬件为该指令所做的(作为一个单一的原子操作)——不涉及“API”。SVC处理程序代码,一旦完成了它想做的事情,通

我了解在最新的ARM架构中,通过“SVC 0”(系统调用)指令将用户模式切换到SVC模式。 系统调用的返回值存储在r0寄存器中,SPSR_SVC复制到CPSR。
我想知道哪个api是如何做到这一点的?

SVC指令的体系结构操作是将CPSR保存到SPSR_SVC,将以下指令的地址保存到LR_SVC,将CPU切换到SVC模式,将PC设置为SVC异常向量(0x08),然后从那里继续执行。这正是硬件为该指令所做的(作为一个单一的原子操作)——不涉及“API”。SVC处理程序代码,一旦完成了它想做的事情,通常会执行一个异常返回指令*,它基本上会以相反的方式执行所有这些操作-从SPSR_SVC恢复模式和CPSR状态,将PC设置为LR_SVC,并在恢复模式下继续

现在,这完全是正在实施的任何系统的选择。如果是Linux,那么它的syscall处理程序代码就是这样编写的。其他系统可能会做一些完全不同的事情



*根据指令集的不同,异常发生的级别,以及是否涉及堆栈,通常是或中的一个。

“SVC处理程序代码,一旦完成它想要的任何操作,通常会执行一个异常返回指令”-我想知道这些说明是什么。你问问题的能力很差。我想你真的想知道Linux内核是如何处理这个问题的。当我逐字逐句地读你的问题时,并没有确切地描述你想要什么。Linux内核有一个API,但是除了错误的标记之外,您没有提到这一点。在这种情况下,可能会很有趣。这并不意味着侮辱,只是一些建议可以帮助你更快地得到你想要的答案,并提供有用的Q/A。