12.2 内存属性与访问控制

目录

    • [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寄存器定义内存属性:

  1. 属性索引:8个可配置的属性条目(Attr0-Attr7)
  2. 属性字段
    • 设备内存类型(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] 共享属性

典型页表配置流程

  1. 配置MAIR寄存器定义内存类型
  2. 在页表描述符中引用属性索引
  3. 设置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 调试与验证方法

  1. 寄存器检查

    • 通过MRS指令读取MAIR/TCR寄存器
    • 使用GDB检查页表内容
  2. 内存访问测试

    bash 复制代码
    # 在TF-A中触发故意错误访问测试
    make PLAT=fvp DEBUG=1 TEST_MMAP=1
  3. 运行时监控

    • 使用PMU监控内存访问事件
    • 通过MMU fault handler捕获违规访问

12.2.7 常见问题与解决方案

Q1:设备内存访问导致同步异常

  • 检查MAIR属性索引与页表配置是否匹配
  • 确认设备内存是否配置了正确的访问权限

Q2:安全世界访问非安全内存失败

  • 确认SCR_EL3.NS位状态
  • 检查目标内存的NS位配置

Q3:缓存一致性问题

  • 确保Normal内存区域的缓存策略一致
  • 检查shareability属性配置

注意:ARMv8.6引入的MTE(内存标记扩展)需要特殊的内存属性配置,详见ARM架构参考手册。