Cortex-R52学习:MPU内存保护机制

文章目录

    • [1. 关于 MPU](#1. 关于 MPU)
    • [2. MPU 区域定义](#2. MPU 区域定义)
      • [2.1 EL1 控制的 MPU 背景区域](#2.1 EL1 控制的 MPU 背景区域)
      • [2.2 EL2 控制的 MPU 背景区域](#2.2 EL2 控制的 MPU 背景区域)
      • [2.3 默认缓存属性](#2.3 默认缓存属性)
    • [3. 虚拟化支持](#3. 虚拟化支持)
      • [3.1 MPU 内存属性组合](#3.1 MPU 内存属性组合)
    • [4. MPU 寄存器访问](#4. MPU 寄存器访问)

1. 关于 MPU

Cortex-R52 处理器配备两个可配置 MPU,分别由异常级别 1(EL1)和异常级别 2(EL2)控制。每个 MPU 可将 4GB 内存地址空间划分为多个区域。

内存区域定义内容:

  • 基地址
  • 边界地址
  • 访问权限
  • 内存属性

对于数据访问 ,MPU 会检查当前转换机制是否允许对该区域执行相应类型的访问(读或写)。

对于指令访问 ,MPU 会检查是否允许访问该区域,以及当前转换机制是否允许执行代码。

对于数据和指令访问 ,若访问被允许,MPU 将为该区域分配定义的内存属性;若访问被拒绝,则触发权限错误(permission fault)。

以下情况将触发转换错误(translation fault):

  • 若某次访问同时命中单个 MPU 中的多个区域。
  • 若某次访问未命中任何 MPU 区域,且背景区域不可用(取决于 MPU 配置和当前特权级别)。

由于处理器采用流水线操作,会预测程序流程和未来数据访问,从而提前获取数据和指令。此类事务称为推测性事务,除非流水线完成对应指令的执行,否则其状态将保持推测性。这可能导致处理器生成超出允许区域的地址,或尝试无权访问的地址。在此类情况下,MPU 会阻止推测性访问生成总线事务,但不会触发转换错误或权限错误。

每个处理器内核均配备一个由 EL1 控制的 MPU(支持 16、20 或 24 个可编程区域),以及一个由 EL2 控制的 MPU(可选支持 0、16、20 或 24 个可编程区域)。当 EL2 控制的 MPU 和虚拟化功能使能时,所有使用 EL0/EL1 转换机制的事务均需查询两个 MPU。最终属性将综合两者结果,采用最严格限制的属性。这种双重保护机制使虚拟机监控器(hypervisor)能够保留对 EL0/EL1 转换机制的控制权,从而支持虚拟化功能。当软件使用 EL2 转换机制执行时,仅使用 EL2 控制的 MPU。

2. MPU 区域定义

区域(Region) 是从基地址开始、延伸至并包含边界地址(Limit Address)的一段连续地址范围。

区域配置机制

  • 基地址 :通过 PRBAR(EL2 控制的 MPU 使用 HPBAR)配置。

  • 边界地址 :通过 PRLAR(EL2 控制的 MPU 使用 HPRLAR)配置。

  • 对齐要求

    • 基地址需对齐至 64 字节边界 (低 6 位为 0b000000)。
    • 边界地址需对齐至 64 字节边界下方的字节 (低 6 位为 0b111111)。
  • 地址包含性 :区域范围满足以下条件:

    复制代码
    PRBAR.BASE:0b000000 ≤ 地址 ≤ PRLAR.LIMIT:0b111111
  • 最小区域尺寸64 字节

区域属性配置

PRBARPRLAR 寄存器还定义以下关键属性:

寄存器字段 功能说明
PRBAR.AP 访问权限(Access Permissions),控制读/写权限。
PRBAR.SH 可共享性(Shareability),标识内存是否可被多核共享。
PRBAR.XN 禁止执行位(Execute-Never),置 1 时禁止指令执行。
PRLAR.AttrIndx 内存属性索引 ,用于查表获取实际内存属性(通过 MAIRx 寄存器组)。

内存属性通过 PRLAR.AttrIndx 索引内存属性间接寄存器(MAIRx) 确定。

区域的使能或禁用通过设置/清除区域使能位(PRLAR.EN)实现。在 EL2 控制的 MPU 中,也可通过写入虚拟机监控器 MPU 区域使能寄存器(HPRENR) 控制区域状态。

2.1 EL1 控制的 MPU 背景区域

作用场景

  • MPU 禁用时SCTLR_EL1.M = 0):
    • 作为默认内存映射。
  • MPU 使能时SCTLR_EL1.M = 1):
    • 若设置 SCTLR_EL1.BR = 1,则 EL1 转换机制下未命中任何编程区域的访问将使用背景区域。
    • EL0 转换机制的访问始终触发故障(不允许使用背景区域)。

下表显示了用于指令访问的 EL1 控制的 MPU 背景区域。

表 1:EL1 控制的 MPU 背景区域 - 指令访问

地址范围 指令缓存使能(SCTLR_EL1.I = 1 指令缓存禁用(SCTLR_EL1.I = 0 执行权限 (XN)
0x00000000--0x7FFFFFFF 普通内存, 不可共享, 写通可缓存 普通内存, 可共享 , 不可缓存 允许执行
0x80000000--0xFFFFFFFF - - 禁止执行

表 2:EL1 控制的 MPU 背景区域 - 数据访问

地址范围 数据缓存使能(SCTLR_EL1.C = 1 数据缓存禁用(SCTLR_EL1.C = 0
0x00000000--0x3FFFFFFF 普通内存, 不可共享 , 写回写分配可缓存 普通内存, 可共享 , 不可缓存
0x40000000--0x5FFFFFFF 普通内存, 不可共享, 写通可缓存 普通内存, 可共享 , 不可缓存
0x60000000--0x7FFFFFFF 普通内存, 可共享 , 不可缓存 普通内存, 可共享 , 不可缓存
0x80000000--0xBFFFFFFF Device-nGnRE Device-nGnRE
0xC0000000--0xFFFFFFFF Device-nGnRnE Device-nGnRnE

注:

在 Arm 架构的内存类型定义中,nGnRnE 是设备内存(Device memory)的一组属性标识,每个字母的含义如下:

  • G (Gathering) :是否允许合并多个写访问。

    • nG 表示 不允许合并(non-Gathering),即对同一地址或相邻地址的多次写访问必须严格按顺序单独执行,不能合并成一次事务。
  • R (Reordering) :是否允许重排序

    • nR 表示 不允许重排序(non-Reordering),即访问必须按照程序顺序进行,处理器不能调整读写顺序。
  • E (Early Write Acknowledgement) :是否允许早期写应答

    • nE 表示 不允许早期写应答(No Early Write Acknowledgement),即写操作必须等到数据真正到达最终目的地(如外设或内存)后才能给出应答,不能提前响应以提升性能。

2.2 EL2 控制的 MPU 背景区域

作用场景

  • EL2 MPU 禁用时HSCTLR.M = 0):
    • 作为所有访问的默认内存映射
  • EL2 MPU 使能时HSCTLR.M = 1):
    • 若设置 HSCTLR.BR = 1,则 EL2 转换机制下未命中任何编程区域的访问将使用背景区域。
    • EL0/EL1 转换机制的访问 若未命中 EL2 编程区域,将触发转换故障(两级转换机制要求)。

下表显示了用于指令访问的 EL2 控制的 MPU 背景区域。

表 3:EL2 控制的 MPU 背景区域 - 指令访问

地址范围 指令缓存使能(HSCTLR.I = 1 指令缓存禁用(HSCTLR.I = 0 执行权限 (XN)
0x00000000--0x7FFFFFFF 普通内存, 不可共享, 写通可缓存 普通内存, 可共享 , 不可缓存 允许执行
0x80000000--0xFFFFFFFF - - 禁止执行

下表显示了用于数据访问的 EL2 控制的 MPU 背景区域。

表 4:EL2 控制的 MPU 背景区域 - 数据访问

地址范围 数据缓存使能(HSCTLR.C = 1 数据缓存禁用(HSCTLR.C = 0
0x00000000--0x3FFFFFFF 普通内存, 不可共享 , 写回写分配可缓存 普通内存, 可共享 , 不可缓存
0x40000000--0x5FFFFFFF 普通内存, 不可共享, 写通可缓存 普通内存, 可共享 , 不可缓存
0x60000000--0x7FFFFFFF 普通内存, 可共享 , 不可缓存 普通内存, 可共享 , 不可缓存
0x80000000--0xBFFFFFFF Device-nGnRE Device-nGnRE
0xC0000000--0xFFFFFFFF Device-nGnRnE Device-nGnRnE

2.3 默认缓存属性

当使能默认缓存属性(HCR.DC=1)时,使用 EL1 控制的 MPU 背景区域的事务将应用以下属性:

普通内存类型(Normal)、内层写回(Inner Write-Back)、外层写回(Outer Write-Back)、不可共享(Non-Shareable) ,且同时使能读分配(Read-Allocate)写分配(Write-Allocate) 提示。此时,若指令访问命中背景区域,则始终允许执行。

默认属性为最宽松限制,即当与 EL2 控制的 MPU 属性组合时,最终属性将等同于 EL2 控制的 MPU 属性。这使得 EL2 控制的 MPU 能够有效屏蔽 EL1 控制的 MPU 对背景区域访问的影响(即对 EL1 转换机制的事务透明化)。

HCR.DC=1 时,所有来自 EL0/EL1 转换机制的地址转换均执行两级 MPU 查询 ,且处理器行为等效于已设置 HCR.VM 位。

3. 虚拟化支持

为支持虚拟化,系统执行两级 MPU 查询

虚拟化允许在 EL1 和 EL0 运行的进程(通常为一个或多个客户操作系统及其应用程序)由 EL2 进程(通常为单一虚拟机监控器)统一管理。

  • EL1 控制的 MPU:检查 EL0/EL1 进程的事务,由 EL1 或 EL2 进程配置。
  • EL2 控制的 MPU:当虚拟化使能时,额外检查 EL0/EL1 转换机制的事务,仅由 EL2 软件配置。
  • EL2 转换机制:仅使用 EL2 控制的 MPU。

当虚拟化使能(HCR.VM=1)且 EL2 控制的 MPU 使能(HSCTLR.M=1)时,EL1 控制的 MPU 允许的事务需进一步通过 EL2 控制的 MPU 检查。若两级均允许访问,则阶段1的内存属性 将与阶段2匹配区域的属性 组合,最终采用更严格的属性集

3.1 MPU 内存属性组合

执行两级查询时,需组合来自两个 MPU 的内存类型(Memory Type)缓存属性(Cacheability)可共享性(Shareability)

下表描述两级内存类型属性的组合规则:

表 5:内存类型属性组合规则

EL1 控制的 MPU 属性 EL2 控制的 MPU 属性 最终类型
Device-nGnRnE 任意 Device-nGnRnE
Device-nGnRE Device-nGnRnE Device-nGnRnE
Not Device-nGnRnE Device-nGnRE
Device-nGRE Device-nGnRnE Device-nGnRnE
Device-nGRE Device-nGRE
Not (Device-nGnRnE or Device-nGnRE) Device-nGRE
Device-GRE Device-nGnRnE Device-nGnRnE
Device-nGnRE Device-nGnRE
Device-nGRE Device-nGRE
Device-GRE or Normal Device-GRE
Normal 任意 Device 类型 阶段2指定的 Device 类型
Normal Normal

下表描述缓存属性的组合规则:

表 6:缓存属性组合规则

EL1 控制的 MPU 属性 EL2 控制的 MPU 属性 最终缓存属性
Non-cacheable 任意 Non-cacheable
任意 Non-cacheable Non-cacheable
Write-Through Cacheable Write-Through/Write-Back Cacheable Write-Through Cacheable
Write-Through/Write-Back Cacheable Write-Through Cacheable Write-Through Cacheable
Write-Back Cacheable Write-Back Cacheable Write-Back Cacheable

下表描述可共享性属性的组合规则:

表 7:可共享性属性组合规则

EL1 控制的 MPU 属性 EL2 控制的 MPU 属性 最终可共享性
Outer Shareable 任意 Outer Shareable
Inner Shareable Outer Shareable Outer Shareable
Inner Shareable Inner Shareable
Non-shareable Inner Shareable
Non-shareable Outer Shareable Outer Shareable
Inner Shareable Inner Shareable
Non-shareable Non-shareable

4. MPU 寄存器访问

MPU 基地址与边界地址寄存器可通过间接直接方式访问。

间接访问

  1. 通过 PRSELR (EL2 MPU 使用 HPRSELR)选择目标区域。
  2. PRBARPRLAR (EL2 MPU 使用 HPRBARHPRLAR)写入配置所选区域。

直接访问

通过系统寄存器访问指令,将区域编号编码至 CRmopcode2 字段:

  • CRm = 0b1rrr,其中 rrr = region_number[3:1](区域编号的第 3-1 位)。
  • 基地址寄存器访问
    • 偶数区域:op2 = 0b000
    • 奇数区域:op2 = 0b100
  • 边界地址寄存器访问
    • 偶数区域:op2 = 0b001
    • 奇数区域:op2 = 0b101
相关推荐
red_redemption1 小时前
自由学习记录(198)
学习
花岛溯1 小时前
Cursor 学习 DAY2·切换AI模型
学习
星夜夏空991 小时前
FreeRTOS学习(9)——临界区
学习
iCxhust2 小时前
C# 命令行指令 查看二进制文件
开发语言·单片机·嵌入式硬件·c#·proteus·微机原理·8088单板机
小智老师PMP3 小时前
零基础能不能考PMP?零基础专属学习路径+全套扶持体系
学习·算法·职场和发展·软件工程·求职招聘·敏捷流程
XGeFei4 小时前
【Fastapi学习笔记(4)】—— JsonScheme与数据验证、错误响应格式、正则表达式
学习·fastapi
爱喝水的鱼丶5 小时前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇) 第四篇:SAP 报表异常处理机制:数据校验与消息提示规范落地
开发语言·数据库·学习·算法·sap·abap
東雪木5 小时前
泛型、反射、注解(Spring 框架核心底层)专属复习笔记
java·windows·笔记·学习·spring
芯岭技术郦6 小时前
集成 2.4G 射频收发器、MCU 及丰富外设的XL2417D透传模组
单片机·嵌入式硬件