PMP
PMP(Physical Memory Protection)是 RISC-V ISA 定义的硬件级内存保护机制。通过配置 PMP 条目为指定物理内存区域设置读/写/执行权限,当访问违反权限规则时硬件立即触发异常。
相比软件内存保护更高效、更安全。典型应用:保护固件代码段、安全密钥等关键内存区域不被意外篡改。
头文件清单
接口清单
接口名称 功能简述 uapi_pmp_config 初始化并配置PMP模块
Functions
uapi_pmp_config
头文件清单
功能说明
- 初始化并配置PMP(Physical Memory Protection)模块,批量设置一组PMP域的地址、大小及访问权限
- 根据配置参数中的地址匹配模式(TOR/NA4/NAPOT),将用户配置转换为硬件寄存器格式并写入PMP寄存器
- 配置完成后执行数据同步屏障(dsb),确保PMP配置生效
前置条件
- 调用前PMP模块已通过Kconfig使能(DRIVER_SUPPORT_PMP已开启)
- 入参config指向的内存空间已申请成功,且长度不小于length个pmp_conf_t元素
入参
名称 参数类型 详细说明 约束取值范围 config const pmp_conf_t * 一组PMP域配置参数,数组首地址 不为NULL,指向内存空间已申请成功 length uint32_t PMP配置的个数,即config数组元素个数 ≥1
返回值
- 返回类型:errcode_t
返回值 文字含义 触发场景 ERRCODE_SUCC(0x00) 执行成功 所有PMP域配置均成功写入 Other 其他错误码,参考errcode_t 任一PMP域配置写入失败
Kconfig配置
配置项 宏类型 说明 默认值 DRIVER_SUPPORT_PMP 功能宏 支持PMP接口功能 y
Enumerations
pmp_attr_t
typedef enum pmp_attr {
PMP_ATTR_DEVICE_NO_BUFFERABLE = 0,
PMP_ATTR_DEVICE_BUFFERABLE = 1,
PMP_ATTR_NO_BUFFERABLE_AND_NO_CACHEABLE = 2,
PMP_ATTR_NO_CACHEABLE_AND_BUFFERABLE = 3,
PMP_ATTR_WRITETHROUGH_NO_ALLOCATE = 4,
PMP_ATTR_WRITETHROUGH_RALLOCATE = 6,
PMP_ATTR_WRITEBACK_RALLOCATE = 7,
PMP_ATTR_WRITEBACK_NO_ALLOCATE = 8,
PMP_ATTR_WRITETHROUGH_RWALLOCATE = 14,
PMP_ATTR_WRITEBACK_RWALLOCATE = 15
} pmp_attr_t;
枚举成员 取值 描述 PMP_ATTR_DEVICE_NO_BUFFERABLE 0 设备属性,不可缓冲 PMP_ATTR_DEVICE_BUFFERABLE 1 设备属性,可缓冲 PMP_ATTR_NO_BUFFERABLE_AND_NO_CACHEABLE 2 不可缓冲且不可缓存 PMP_ATTR_NO_CACHEABLE_AND_BUFFERABLE 3 不可缓存但可缓冲 PMP_ATTR_WRITETHROUGH_NO_ALLOCATE 4 写穿透,不分配 PMP_ATTR_WRITETHROUGH_RALLOCATE 6 写穿透,读分配 PMP_ATTR_WRITEBACK_RALLOCATE 7 写回,读分配 PMP_ATTR_WRITEBACK_NO_ALLOCATE 8 写回,不分配 PMP_ATTR_WRITETHROUGH_RWALLOCATE 14 写穿透,读写分配 PMP_ATTR_WRITEBACK_RWALLOCATE 15 写回,读写分配
addr_match_t
typedef enum addr_match {
PMPCFG_ADDR_MATCH_OFF = 0x0,
PMPCFG_ADDR_MATCH_TOR = 0x1,
PMPCFG_ADDR_MATCH_NA4 = 0x2,
PMPCFG_ADDR_MATCH_NAPOT = 0x3
} addr_match_t;
枚举成员 取值 描述 PMPCFG_ADDR_MATCH_OFF 0x0 地址匹配关闭,该PMP域不生效 PMPCFG_ADDR_MATCH_TOR 0x1 Top of Range模式,地址为尾地址 PMPCFG_ADDR_MATCH_NA4 0x2 Naturally Aligned 4-byte模式 PMPCFG_ADDR_MATCH_NAPOT 0x3 Naturally Aligned Power-of-Two模式,地址为首地址
rwx_permission_t
typedef enum rwx_permission {
PMPCFG_NO_ACCESS = 0x0,
PMPCFG_READ_ONLY_NEXECUTE = 0x1,
PMPCFG_RW_NEXECUTE = 0x3,
PMPCFG_READ_ONLY_EXECUTE = 0x5,
PMPCFG_RW_EXECUTE = 0x7
} rwx_permission_t;
枚举成员 取值 描述 PMPCFG_NO_ACCESS 0x0 无访问权限 PMPCFG_READ_ONLY_NEXECUTE 0x1 只读,不可执行 PMPCFG_RW_NEXECUTE 0x3 可读写,不可执行 PMPCFG_READ_ONLY_EXECUTE 0x5 只读,可执行 PMPCFG_RW_EXECUTE 0x7 可读写,可执行
Structures
pmpx_config_t
typedef struct pmpx_config {
rwx_permission_t rwx_permission; /*!< Read-Write-Execute permission. */
addr_match_t addr_match; /*!< Address matching method. */
bool lock; /*!< Lock bit configuration. */
pmp_attr_t pmp_attr; /*!< Read-Write mode configuration. */
} pmpx_config_t;
成员说明:
成员名称 数据类型 描述 rwx_permission rwx_permission_t 读写执行权限 addr_match addr_match_t 地址匹配方式 lock bool Lock位配置,置位后该PMP域配置不可修改直至复位 pmp_attr pmp_attr_t 读写方式配置
pmp_conf_t
typedef struct pmp_conf {
uint32_t idx; /*!< Region number. */
uint32_t addr; /*!< Base address, First Address in NAPOT mode and End Address in TOR mode. */
uint32_t size; /*!< Used in NAPOT mode. Size of memory unit. */
pmpx_config_t conf; /*!< PMP region configuration parameters. */
} pmp_conf_t;
成员说明:
成员名称 数据类型 描述 idx uint32_t 域编号 addr uint32_t 基地址,NAPOT/NA4模式为首地址,TOR模式为尾地址 size uint32_t 在NAPOT模式使用,内存单元的大小 conf pmpx_config_t PMP域配置参数