ARM Cortex-M 系列处理器权限模式介绍


参考:Introduction to Cortex-M3/M4 M0+ Security (Privileged/Non-Privileged Access Level)

范围

本文讨论 ARM Cortex-M 系列处理器中的两个模式(Thread/Handler)以及两个访问级别(Privileged/Unprivileged)

Handler/Thread Mode; Privileged/Unprivileged Access Level

一般系统运行时会有两种模式,即用户模式和内核模式,分别对应低权限和高权限。这种机制主要为了实现对系统资源进行不同级别的访问控制。在 ARM Cortex-M 系列处理器中(包括 ARMv6-M,ARMv7-M 以及 ARMv8-M),除了有 privileged/unprivilged模式,还有 handler 模式和 thread 模式。为了便于区分,把 privileged/unprivileged 称为两种访问级别,handler 和 thread 是两种处理器模式。

Cortex-M 系列处理器有两种模式

  • Thread Mode
  • Handler Mode

Thread 模式主要适用于用户的程序代码,Handler 模式主要适用于异常处理代码以及内核代码。可以通过 IPSR 寄存器查看处理器所处的状态。
在系统 Reset 之后,处理器运行在 Thread 模式下。一旦遇到异常处理,处理器会自动切入 Handler 模式。

Cortex 系列处理器有两种访问级别

  • Privileged
  • Unprivileged

在系统 Reset之后,处理器默认是 Privileged 级别。访问级别由寄存器 control[0] 控制,当且仅当处理器运行在 Thread 模式下,该位才有效。Handler 模式只能运行在 Privileged 模式。

Privilege 的作用范围

取决于系统是有支持 MPU,Privilege 的作用范围有所不同。

当系统不支持 MPU 时,只有当 CPU 访问一些硬件资源时才会需要高权限模式,比如系统时钟的配置,Private Peripheral Bus (PPB),系统寄存器的读写( control 寄存器)等等。

当系统支持 MPU 时,可以对代码段和数据段进行权限的设定,类似 MMU,CPU 每次对相应内存地址的访问,都会先经过 MPU 进行审查,然后返回相应的结果。

状态切换

总的来说,处理器在运行时一共有三种状态,分别是 handler/privileged,thread/privileged 和 thread/unprivileged。三种状态之间的转换如下图所示。


handler 和 thread 两个模式的设计

  1. 速度: 处理器在不同的模式下,很多寄存器是banked的,这样就减少了context的转换
  2. 中断鲁棒性: MCU 在设计上,可以有OS,也可以没有OS。一般来说 OS 在 thread/privileged,task 运行在 thread/unprivileged。中断运行在 handler 下。因此,thread 下的程序 crash 后不影响中断程序的运行。

引入 ARM TrustZone-M 后的状态转换

引入 ARM Trustzone-M 后,处理器的状态多了安全和非安全两种状态,在开发过程中,这两个状态一般由两个开发方开发,所有这两个状态与 handler/thread 两个模式是正交的关系。当程序从非安全状态下切换到安全状态后,就会发生安全状态的转换。在转换过程中,有一下几个原则:

  • thread/handler,在发生安全状态转换后,处理器会保持原先的 thread/handler 状态。
  • privileged/unprivileged,在发生安全状态转换后,处理器不会保持原先状态,而是保持上一次离开安全状态下的访问级别。因为访问级别在 thread 模式下由 control[0] 寄存器决定,而在安全和非安全状态下各有一个独立的 control 寄存器(banked)。

Author: x-codingman
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source x-codingman !
  TOC