ARM v7处理器模式

发布时间 2024-01-03 16:39:07作者: this毛豆

ARM v7处理器有9种模式(参考自官方文档):

模式 缩写 编码 特权级别 执行 安全状态
User usr 10000 PL0 Always Both
FIQ fiq 10001 PL1 Always Both
IRQ irq 10010 PL1 Always Both
Supervisor svc 10011 PL1 Always Both
Monitor mon 10110 PL1 With Security Extensions Secure only
Abort abt 10111 PL1 Always Both
Hyp hyp 11010 PL2 With Virtualization Extensions Non-secure only
Undefined und 11011 PL1 Always Both
System sys 11111 PL1 Always Both

模式更改可以在软件控制下进行,也可以由外部或内部异常引起。

1. User模式

操作系统在用户模式下运行应用程序以限制系统资源的使用。 在用户模式下执行的软件在 PL0 处执行。 用户模式下的执行有时被描述为非特权执行。 应用程序通常在用户模式下执行,并且任何在用户模式下执行的程序:

  • 仅对系统资源进行非特权访问,这意味着它无法访问受保护的系统资源;
  • 仅对内存进行非特权访问;
  • 除非引发异常,否则无法更改模式。

2. FIQ模式

FIQ 模式是 FIQ 中断的默认模式。

3. IRQ模式

IRQ 模式是 IRQ 中断的默认模式。

4. Supervisor模式

管理员模式是发生管理员调用异常时的默认模式。
执行 SVC(主管调用)指令会生成主管调用异常,该异常将进入主管模式。
处理器在复位时进入管理模式。

5. Monitor模式

监控模式是发生安全监控调用异常的模式。
在PL1模式下,执行SMC(Secure Monitor Call)指令会产生Secure Monitor Call异常。
监控模式是一种安全模式,这意味着无论 SCR.NS 位的值如何,它始终处于安全状态。
在监控模式下运行的软件可以访问系统寄存器的安全和非安全副本。 这意味着监控模式提供了在安全和非安全安全状态之间进行更改的正常方法。

注意:区分以下两者很重要:
Monitor mode
这是一种处理器模式,仅当实现包含安全扩展时才可用。 它在正常操作中使用,作为在安全和非安全状态之间转换的机制,如本节所述。
Monitor debug-mode
这是一种调试模式,无论实现是否包含安全扩展,都可用。

监控模式仅作为安全扩展的一部分实现。

6. Abort模式

中止模式是发生数据中止异常或预取中止异常时的默认模式。

7. Hyp模式

Hyp 模式是非安全 PL2 模式,作为虚拟化扩展的一部分实现。 Hyp 模式是在非安全状态出现异常时进入的,必须进入 PL2。
管理程序调用异常和 Hyp 陷阱异常是作为虚拟化扩展的一部分实现的异常,并且始终在 Hyp 模式下发生。

注意:

这意味着无法从安全状态获取管理程序调用异常和 Hyp Trap 异常。
在非安全 PL1 模式下,执行 HVC(Hypervisor Call)指令会生成 Hypervisor Call 异常。

8. Undefined模式

未定义模式是与指令相关的异常(包括任何执行未定义指令的尝试)所采取的默认模式。

9. System模式

在系统模式下执行的软件在 PL1 上执行。 系统模式具有与用户模式相同的可用寄存器,并且不会因任何异常而进入。

安全和非安全模式

在实现安全扩展的处理器中,大多数模式名称可以限定为安全或非安全,以指示处理器是否也处于安全状态或非安全状态。 例如:
如果处理器处于 Supervisor 模式和 Secure 状态,则它处于 Secure Supervisor 模式。
如果处理器处于用户模式和非安全状态,则它处于非安全用户模式。

注意:如相应模式描述中所示:
监控模式是一种安全模式,意味着它始终处于安全状态。
Hyp 模式是一种非安全模式,这意味着它只能在非安全状态下访问。

模式操作伪代码

// BadMode()
// =========

boolean BadMode(bits(5) mode)
    case mode of
        when '10000'  result = FALSE;                // User mode
        when '10001'  result = FALSE;                // FIQ mode
        when '10010'  result = FALSE;                // IRQ mode
        when '10011'  result = FALSE;                // Supervisor mode
        when '10110'  result = !HaveSecurityExt();   // Monitor mode
        when '10111'  result = FALSE;                // Abort mode
        when '11010'  result = !HaveVirtExt();       // Hyp mode
        when '11011'  result = FALSE;                // Undefined mode
        when '11111'  result = FALSE;                // System mode
        otherwise     result = TRUE;
    return result;