文章目录
-
- [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)。
- 基地址需对齐至 64 字节边界 (低 6 位为
-
地址包含性 :区域范围满足以下条件:
PRBAR.BASE:0b000000 ≤ 地址 ≤ PRLAR.LIMIT:0b111111 -
最小区域尺寸 :64 字节。
区域属性配置
PRBAR 和 PRLAR 寄存器还定义以下关键属性:
| 寄存器字段 | 功能说明 |
|---|---|
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 基地址与边界地址寄存器可通过间接 或直接方式访问。
间接访问
- 通过 PRSELR (EL2 MPU 使用 HPRSELR)选择目标区域。
- 向 PRBAR 和 PRLAR (EL2 MPU 使用 HPRBAR 和 HPRLAR)写入配置所选区域。
直接访问
通过系统寄存器访问指令,将区域编号编码至 CRm 和 opcode2 字段:
CRm = 0b1rrr,其中rrr = region_number[3:1](区域编号的第 3-1 位)。- 基地址寄存器访问 :
- 偶数区域:
op2 = 0b000 - 奇数区域:
op2 = 0b100
- 偶数区域:
- 边界地址寄存器访问 :
- 偶数区域:
op2 = 0b001 - 奇数区域:
op2 = 0b101
- 偶数区域: