内存保护单元(MPU)
概述
内存保护单元(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)
|
ap |
uint8_t |
访问权限
|
sh |
uint8_t |
普通内存的共享属性
|
attr_idx |
uint8_t |
内存属性间接索引 取值范围为 0 ~ 7,具体属性在 mpu_init() 中定义且支持自定义。典型定义如下:
|
API 参考
概述 |
描述 |
---|---|
功能 |
初始化 MPU 区域内存属性为典型值 |
参数 |
无 |
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
修改 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
配置 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
释放 MPU 实体 |
参数 |
MPU 实体索引:
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
分配一个空闲的 MPU 实体 |
参数 |
无 |
返回值 |
MPU 实体索引:
|
概述 |
描述 |
---|---|
功能 |
初始化 MPU 区域内存属性为典型值 |
参数 |
无 |
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
修改 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
配置 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
释放 MPU 实体 |
参数 |
MPU 实体索引:
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
分配一个空闲的 MPU 实体 |
参数 |
无 |
返回值 |
MPU 实体索引:
|
概述 |
描述 |
---|---|
功能 |
初始化 MPU 区域内存属性为典型值 |
参数 |
无 |
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
修改 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
配置 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
释放 MPU 实体 |
参数 |
MPU 实体索引:
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
分配一个空闲的 MPU 实体 |
参数 |
无 |
返回值 |
MPU 实体索引:
|
概述 |
描述 |
---|---|
功能 |
初始化 MPU 区域内存属性为典型值 |
参数 |
无 |
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
修改 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
配置 MPU 区域内存属性 |
参数 |
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
释放 MPU 实体 |
参数 |
MPU 实体索引:
|
返回值 |
无 |
概述 |
描述 |
---|---|
功能 |
分配一个空闲的 MPU 实体 |
参数 |
无 |
返回值 |
MPU 实体索引:
|
使用说明
按照以下步骤设置 MPU 区域:
定义新变量和结构体
定义一个变量用于存储 MPU 实体索引
定义一个结构体 mpu_region_config 用于存储区域内存属性
调用
mpu_entry_alloc()
分配一个空闲的 MPU 实体设置区域内存属性的结构体
调用
mpu_region_cfg()
配置 MPU 区域内存属性
备注
对于 KR4,虽然实现了物理内存保护单元(PMP),但 SDK 中的代码并未使用 PMP 来提供访问权限控制。如需实现访问权限控制,请参考 RISC-V privileged architecture proposal 中的物理内存保护方案来设置 PMP。