内存保护单元(MPU)

IC:

概述

内存保护单元(Memory Protection Unit,MPU)是 Arm 提供的一个组件,用于通过软件定义来实现硬件保护。SDK 中提供了 mpu_region_config 结构体,用于设置 MPU 的区域内存属性。

下表列出了 mpu_region_config 结构体的成员变量:

名称

类型

描述

region_base

uint32_t

MPU 区域基地址,32 字节对齐

region_size

uint32_t

MPU 区域大小,32 字节对齐

xn

uint8_t

执行禁止属性(Execute Never)

  • MPU_EXEC_ALLOW:允许在该区域执行程序

  • MPU_EXEC_NEVER:禁止在该区域执行程序

ap

uint8_t

访问权限

  • MPU_PRIV_RW:仅特权代码可读/写

  • MPU_UN_PRIV_RW:任何权限级别均可读/写

  • MPU_PRIV_R:仅特权代码可读

  • MPU_PRIV_W:任何权限级别均可读

sh

uint8_t

普通内存的共享属性

  • MPU_NON_SHAREABLE:不可共享

  • MPU_OUT_SHAREABLE:外部可共享

  • MPU_INR_SHAREABLE:内部可共享

attr_idx

uint8_t

内存属性间接索引

取值范围为 0 ~ 7,具体属性在 mpu_init() 中定义且支持自定义。典型定义如下:

  • 0:MPU_MEM_ATTR_IDX_NC,定义普通内存属性为非缓存

  • 1:MPU_MEM_ATTR_IDX_WT_T_RA,定义普通内存属性为写透传,读分配

  • 2:MPU_MEM_ATTR_IDX_WB_T_RWA,定义普通内存属性为写回,读和写分配

  • 3 ~ 7:MPU_MEM_ATTR_IDX_DEVICE,定义设备内存属性为非聚集(Non-Gathering)、非记录(Non-Recording)、非早期写确认(Non-Early Write Acknowledge)

API 参考

mpu_init

概述

描述

功能

初始化 MPU 区域内存属性为典型值

参数

返回值

mpu_set_mem_attr

概述

描述

功能

修改 MPU 区域内存属性

参数

  • attr_idx:区域内存属性索引,取值范围为 0 ~ 7

  • mem_attr: 区域内存属性

返回值

mpu_region_cfg

概述

描述

功能

配置 MPU 区域内存属性

参数

  • region_num:

    • KM4_NS:0 ~ 7

    • KM4_S:0 ~ 3

  • pmpu_cfg:指向已配置的 mpu_region_config 结构体

返回值

mpu_entry_free

概述

描述

功能

释放 MPU 实体

参数

MPU 实体索引:

  • KM4_NS:0 ~ 7

  • KM4_S:0 ~ 3

返回值

mpu_entry_alloc

概述

描述

功能

分配一个空闲的 MPU 实体

参数

返回值

MPU 实体索引:

  • KM4_NS:0 ~ 7

  • KM4_S:0 ~ 3

  • Fail:-1

使用说明

按照以下步骤设置 MPU 区域:

  1. 定义新变量和结构体

    • 定义一个变量用于存储 MPU 实体索引

    • 定义一个结构体 mpu_region_config 用于存储区域内存属性

  2. 调用 mpu_entry_alloc() 分配一个空闲的 MPU 实体

  3. 设置区域内存属性的结构体

  4. 调用 mpu_region_cfg() 配置 MPU 区域内存属性

备注

对于 KR4,虽然实现了物理内存保护单元(PMP),但 SDK 中的代码并未使用 PMP 来提供访问权限控制。如需实现访问权限控制,请参考 RISC-V privileged architecture proposal 中的物理内存保护方案来设置 PMP。