目录
-
- [12.2.1 内存属性基础概念](#12.2.1 内存属性基础概念)
- [12.2.2 MAIR寄存器配置](#12.2.2 MAIR寄存器配置)
- [12.2.3 页表属性控制](#12.2.3 页表属性控制)
- [12.2.4 安全状态访问控制](#12.2.4 安全状态访问控制)
- [12.2.5 典型内存保护场景](#12.2.5 典型内存保护场景)
- [12.2.6 调试与验证方法](#12.2.6 调试与验证方法)
- [12.2.7 常见问题与解决方案](#12.2.7 常见问题与解决方案)

12.2.1 内存属性基础概念
在ARM架构中,内存属性(Memory Attributes)是控制内存访问行为的关键机制,主要包括:
-
内存类型:
- Normal Memory:可缓存、可预测访问模式
- Device Memory:用于外设寄存器访问(严格顺序)
- Non-cacheable Memory:禁用缓存的内存区域
-
访问权限:
- 读/写/执行权限控制
- 特权级访问控制(EL0-EL3)
- 安全状态访问控制(Secure/Non-secure)
c
// 典型的内存属性定义示例(基于ARMv8)
#define MT_DEVICE_nGnRnE 0x0 // 严格排序设备内存
#define MT_NORMAL_NC 0x1 // 非缓存普通内存
#define MT_NORMAL 0x2 // 可缓存普通内存
12.2.2 MAIR寄存器配置
ARM架构通过MAIR_ELx寄存器定义内存属性:
- 属性索引:8个可配置的属性条目(Attr0-Attr7)
- 属性字段 :
- 设备内存类型(Device-nGnRnE/Device-nGnRE等)
- Normal内存的缓存策略(WB/WA/NT等)
assembly
// MAIR寄存器配置示例(AArch64)
mov x0, #0x44 // Attr1 = Normal Non-cacheable
orr x0, x0, #0xFF << 8 // Attr0 = Normal WB/WA
msr mair_el3, x0
12.2.3 页表属性控制
在MMU页表中,内存属性通过描述符字段控制:
字段 | 作用 |
---|---|
AP[2:1] | 访问权限(Privilege/User) |
XN | 执行权限控制 |
PXN | 特权执行禁止 |
NS | 安全状态位 |
SH[1:0] | 共享属性 |
典型页表配置流程:
- 配置MAIR寄存器定义内存类型
- 在页表描述符中引用属性索引
- 设置AP/XN等控制位
12.2.4 安全状态访问控制
TrustZone技术引入的安全属性控制:
-
安全配置:
SCR_EL3.SIF
:控制安全内存的可执行属性TCR_ELx.{DS, T0SZ}
:影响地址转换的安全检查
-
访问规则:
- 安全世界可访问所有内存
- 非安全世界只能访问标记为NS的内存
12.2.5 典型内存保护场景
案例1:保护安全关键数据
c
// 配置安全-only内存区域
mmap_add_region(0x60000000, 0x60000000, 0x1000,
MT_RO_DATA | MT_SECURE | MT_RW);
案例2:设备寄存器保护
assembly
// 配置设备内存为特权访问-only
dcfg = (0x1 << 10) | // AP=01 (Privileged RW)
(0x0 << 3) | // AttrIndex=0 (Device-nGnRnE)
(0x1 << 2); // Block descriptor
12.2.6 调试与验证方法
-
寄存器检查:
- 通过
MRS
指令读取MAIR/TCR寄存器 - 使用GDB检查页表内容
- 通过
-
内存访问测试:
bash# 在TF-A中触发故意错误访问测试 make PLAT=fvp DEBUG=1 TEST_MMAP=1
-
运行时监控:
- 使用PMU监控内存访问事件
- 通过MMU fault handler捕获违规访问
12.2.7 常见问题与解决方案
Q1:设备内存访问导致同步异常
- 检查MAIR属性索引与页表配置是否匹配
- 确认设备内存是否配置了正确的访问权限
Q2:安全世界访问非安全内存失败
- 确认
SCR_EL3.NS
位状态 - 检查目标内存的NS位配置
Q3:缓存一致性问题
- 确保Normal内存区域的缓存策略一致
- 检查shareability属性配置
注意:ARMv8.6引入的MTE(内存标记扩展)需要特殊的内存属性配置,详见ARM架构参考手册。