• 资料介绍
  • 在线预览
  • 相关推荐
申请入驻 产业图谱

LAT1448 ARMv8-M架构下MPU的使用技巧

03/17 09:56
1450
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

LAT1448 ARMv8-M架构下MPU的使用技巧

1.51 MB

1、引言

为什么要谈 MPU(Memory Protection Unit)?MPU 是内核中与地址属性设置及代码保护相关的外设。ARM 架构的 MCU 内核通常有默认的地址映射表以及各个地址段的默认访问属性,当应用所需要的地址类型或者属性与默认配置不一致时,往往需要针对 MPU region配置某段地址区的类型和内核的访问属性,其中包括设置内核对某段地址的访问许可,实现memory 的保护机制。

近年来 STM32 推出了多款采用 Armv8-M 内核的 MCU 新产品。Armv8-M 内核中包含了基于 PMSAv8 (Protected Memory System Architecture)的新版本 MPU,与 v7-M 的MPU 相比,它的配置和使用都发生了不少变化。另外 Armv8-M 内核还增加了安全扩展(Security Extension),支持 v8-M TrustZone 架构,在 TrustZone 架构下使用 MPU 也有特别的地方,v8-M TrustZone 架构下的存储器保护除了传统的 MPU,还增加了针对安全属性进行配置和管理的 SAU 单元。本文将主要探讨 v8-M 架构下 MPU 的使用技巧。

2、Armv8-M 地址空间与默认地址映射

Armv8-M 是基于地址映射的架构,Cortex-M 处理器支持 32 位的地址访问,可以访问最大 4GB 的地址空间。Armv8-M 架构预定义的 32 位地址空间被划分为代码、数据、外设等区域,支持片内和片外的资源,总共 8 个分区,每个分区占用 0.5GB 的空间,包括:

  • Code
  • SRAM
  • Peripheral
  • 2x RAM (external)
  • 2x Device (external)
  • System

3、MPU (Memory Protection Unit)

MPU 是内核外设的一个单元, Armv8-M 采用了新版的 PSMAv8 MPU。

4、MPU 使用场景及注意事项

?MPU 使用场景

由于 ARM 架构已经有默认的地址映射表,很多时候在 MCU 中即使不使用 MPU,应用程序也能够正常执行。但是在某些场景中配置和使用 MPU 是必要的,否则系统无法正常运行,常见的情况包括:

  • 代码执行(指令或者数据)需要用到外部 Memory(Flash 或者 RAM),而外挂Memory 在系统中的映射地址落在默认的 Device 类型的地址范围:

o 这种情况需要配置 MPU region,将对应地址范围配置为 Normal 类型。

  • 希望通过 Cache 提高代码执行或者数据访问效率,但是代码或者数据所在地址范围在默认的地址映射表中为 non-cacheable,或者默认的 Cache 策略与期望的策略不一致:

o 此时需要通过 MPU region 修改相关 Cache 策略配置。

  • 希望对代码执行安全性进行保护,例如在执行某段关键代码时,禁止意外跳转到该段代码区以外的地址执行:

o 这种情况需要定义 MPU region 并设置关键代码区以外为 XN 属性,只允许期望的地址范围可以做取指令访问。

  • 需要对某些资源的访问进行保护,比如部分代码和数据只允许特权代码访问:

o 这种情况需要定义 MPU region,设置对应地址范围的 AP 访问控制属性为Priv RO 或者 Priv RW。

5、TrustZone 使能环境下使用 MPU

在多数 Armv8-M 内核的 STM32 MCU 产品系列中,都支持安全扩展,也就是TrustZone 架构,比如 STM32L5,STM32U5,STM32WBA,STM32H5 等系列。当系统的安全扩展处于使能状态时,即 TrustZone 使能后,内核中在安全侧和非安全侧各有一套 MPU,相对于没有启用 TrustZone 安全扩展的情况,这种环境下 MPU 的功能和行为会有些变化,这个小节将重点讨论 TrustZone 环境下使用 MPU 的不同之处。

6、MemManage Fault 处理与调试技巧

?MemManage Fault 及其使能

当系统中出现违反 MPU 保护规则的访问时,会触发 MemManage Fault 异常,异常相关信息会体现在 SCB CFSR 寄存器的 MMFSR 位上,如果 MMFSR 的 MMARVALID 位被置位,则 MMFAR 的内容还会提示触发错误的访问地址。

在 Armv8-M 的异常模型中,系统默认使能的只有 HardFault,也就是说违反 MPU 规则导致的异常并不会进入软件的 MemManage Fault Handler,而是统一进入 HardFaultHandler。如果软件希望单独处理 MemManage Fault,则需要事先设 SCB 的 SHCSR 寄存器,将 SHCSR.MEMFAULTENA 置位来使能 MemManage Fault,使能后MemManage Fault 将触发系统进入 MemManage Fault Handler 执行。

如果开启了 TrustZone 安全扩展,则系统默认使能的只有 Secure HardFault,即使是非安全侧代码违反 MPU 保护规则导致了异常,也只会进入 Secure HardFault Handler。在 TrustZone 环境中 MemManage Fault 是 banked,也就是说安全和非安全侧可以有各自的 MemManage Fault 以及对应的 Handler,SCB 也区分 SCB_S 和 SCB_NS,其中的 CFSR_S 和 CFSR_NS 寄存器的 MMFSR 以及 MMFAR 寄存器也会各自提示安全侧和非安全侧的 MemManage Fault 异常的信息。软件可以单独使能安全侧或者非安全侧的MemManage Fault,进而各自处理自己的 MemManage Fault 异常。软件代码可以根据 Fault 处理的需要进行配置。

  • 置位 SCB_S 的 SHCSR.MEMFAULTENA,将使能安全侧 MemManage Fault,错误可以触发进入安全侧 MemManage Fault Handler
  • 置位 SCB_NS 的 SHCSR.MEMFAULTENA,将使能非安全侧 MemManage Fault,错误可以触发进入非安全侧 MemManage Fault Handler
  • 如果没有使能某侧的 MemManage Fault,则发生错误时默认进入 SecureHardFault Handler,使能后可以进入该侧的 MemManage Fault Handler。

这里需要说明一点的是,如果某侧代码由于取对侧指令违反了 MPU 规则而触发Fault,将进入对侧的 Fault Handler,这时候是否进入 MemManage Fault Handler,取决于对侧的 SCB SHCSR.MEMFAULTENA 位的配置情况。

7、小结

本文简要介绍了 Armv8-M MPU 的功能、配置以及与 v6/v7-M MPU 相比发生的变化,举例列举了 v8-M MPU 的使用场景以及配置中的一些注意事项,另外针对使能了Armv8-M 内核安全扩展(即 TrustZone)之后,MPU 功能以及使用上的变化进行了介绍,最后分享了 MemManage 异常的处理以及一些调试技巧。

STM32 的新产品有越来越多的系列搭载了 Armv8-M 内核,希望以上内容对于开发者使用 STM32 新产品系列进行开发时能有所帮助。

在线预览

相关推荐