ARM模式:用户和系统

ARM模式:用户和系统,arm,Arm,你能解释一下在系统调用处理的情况下ARM模式是如何改变的吗? 我听说ARM模式的改变只能在特权模式下发生,但是在ARM处于用户模式(非特权模式)时进行系统调用处理的情况下,ARM模式如何改变 有人能解释一下用户模式案例的整个动作流程,以及更一般的系统调用处理(特别是ARM模式是如何变化的)吗 提前感谢。对于ARM上的系统调用,通常系统调用会导致执行SWI指令。每当处理器执行SWI(软件中断)指令时,它就会进入SVC模式,这是特权模式,并跳转到SWI异常处理程序。然后,SWI处理程序查看中断的原因

你能解释一下在系统调用处理的情况下ARM模式是如何改变的吗? 我听说ARM模式的改变只能在特权模式下发生,但是在ARM处于用户模式(非特权模式)时进行系统调用处理的情况下,ARM模式如何改变

有人能解释一下用户模式案例的整个动作流程,以及更一般的系统调用处理(特别是ARM模式是如何变化的)吗


提前感谢。

对于ARM上的系统调用,通常系统调用会导致执行
SWI
指令。每当处理器执行
SWI
(软件中断)指令时,它就会进入
SVC
模式,这是特权模式,并跳转到
SWI
异常处理程序。然后,
SWI
处理程序查看中断的原因(嵌入到指令中),然后执行操作系统程序员决定应该执行的任何操作。其他异常(复位、未定义指令、预取中止、数据中止、中断和快速中断)都会导致处理器进入特权模式


文件处理的工作方式完全取决于编写您的操作系统的人——这一点与ARM无关。

您需要一份ARM(体系结构参考手册)

->ARM架构->参考手册->ARMv5架构参考手册,然后下载pdf

它曾经是ARM世界中的一个单一ARM,但是有太多的内核,并且开始出现分歧,因此他们将旧的一个拆分为ARMv5 ARM,并为每个主要的ARM处理器系列制作了新的体系结构参考手册

在“程序员模型”一章中,它讨论了模式,它说您可以在除用户之外的其他模式中自由更改。ARM启动代码通常会经历一系列模式更改,以便可以配置堆栈指针等。然后根据需要返回到系统模式或用户模式

在同一章中,请看异常部分,它描述了异常以及处理器为每个异常切换到的模式

执行SWI指令时发生的软件中断异常是实现系统调用的一种方法。处理器处于监控模式,如果处于拇指模式,则切换到arm模式

当然,需要有代码来支持该异常处理程序。您需要使用操作系统(如果有)验证您正在运行、支持什么以及调用约定是什么,等等


并非所有ARM处理器都是这样工作的。Cortex-M(ARMv7-M)没有相同的模式和相同的异常表等。当您使用ARM时(在该级别),您需要获得您正在使用的系列的ARM,并且需要获得您正在使用的核心的TRM(技术参考手册),理想情况下是精确的版本,即使ARM将TRM标记为已被芯片制造商购买的较新版本替换,并使用特定版本的core,但版本之间可能存在足够的差异,因此您需要正确的手册。

我引用了此处提供的ARM文档:

当生成异常时,处理器执行以下操作 行动:

  • 将CPSR复制到相应的SPSR中。这将保存当前模式、中断掩码和条件标志
  • 如果当前状态与异常向量表中使用的指令集不匹配,则自动切换状态
  • 将相应的CPSR模式位更改为:
    • 切换到适当的模式,并映射到该模式的适当倾斜输出寄存器
    • 禁用中断。当发生任何异常时,IRQ将被禁用。当FIQ发生和重置时,FIQ被禁用
  • 将适当的LR设置为返回地址
  • 将电脑设置为异常的矢量地址

  • 其中,CPSR指当前程序状态寄存器,SPSR指保存的程序状态寄存器,用于恢复中断进程的状态。因此,如第3点所示,处理器电路的设计方式是,当用户模式执行主管调用指令时,硬件本身改变模式

    当PC遇到SVC指令时,会发生以下行为:

    • 当前状态(CPSR)已保存(保存到主管SPSR)
    • 该模式切换到监控模式
    • 正常(IRQ)中断被禁用
    • 进入ARM模式(如果尚未使用)
    • 以下指令的地址(返回地址)保存到链接寄存器(R14)-值得注意的是 属于主管模式的链接寄存器
    • 电脑更改为跳转到地址0x00000008
    异常向量(只是一条分支指令)应该位于地址0x0000008处,它将把程序分支到另一个代码区域,用于确定进行了哪个主管调用

    通常通过将SVC指令加载到寄存器中(通过将LR偏移一个字-因为LR仍然指向监控器调用旁边的指令)来确定已进行的监控器调用,位清除最后8位,并使用寄存器剩余24位中的值计算跳转表中的偏移量,以分支到相应的SVC代码

    当主管调用代码希望返回到用户应用程序时,处理器需要将上下文切换回用户模式并返回到LR中包含的地址(该地址仅在主管模式下可用,因为某些寄存器存储在两种模式下)。使用MOVS指令可以克服此问题,如下所示:

    (这也是您对如何更改模式的解释)

    <
     MRS    R0, CPSR          ; load CPSR into R0
     BIC    R0, R0, #&1F      ; clear mode field
     ORR    R0, R0, #&10      ; user mode code
     MSR    SPSR, R0          ; store modified CPSR into SPSR
    
     MOVS   PC, LR            ; context switch and branch