【问题标题】:How SVC mode is changed to USER mode?SVC模式如何更改为USER模式?
【发布时间】:2014-12-22 17:26:32
【问题描述】:

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

【问题讨论】:

  • 你在提问方面做得很差。我想你真的很想知道 Linux 内核是如何处理这个问题的。当我从字面上阅读您的问题时,Notlikethat 已经准确地描述了您想要什么。 Linux 内核有各种各样的 API,但是除了 wrong 标记之外,您没有提及这一点。在这种情况下,svc_entry 可能会很有趣。这并不意味着侮辱,只是一些建议,以帮助您更快地获得您可能想要的答案并提供有用的 Q/A。

标签: linux-kernel arm system-calls


【解决方案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,那么它的系统调用处理程序代码就是这样编写的。其他系统可能会做一些完全不同的事情。


*取决于指令集、发生异常的级别以及是否涉及堆栈,通常是ERETSUBS PC, LR, #0LDM with PC in the list and the ^ suffix 之一。

【讨论】:

  • " SVC 处理程序代码,一旦完成它想做的任何事情,通常会执行异常返回指令之一" - 我想知道这些指令是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
相关资源
最近更新 更多