跳转至

pmp

PMP (Physical Memory Protection) 提供物理内存保护功能,支持对内存区域配置读写执行权限、地址匹配方式及缓存属性。

头文件清单

#include "include/driver/drv_pmp.h"

接口清单

接口名称 功能简述
uapi_pmp_config 初始化并配置PMP模块

Functions

uapi_pmp_config

errcode_t uapi_pmp_config(const pmp_conf_t *config, uint32_t length)

头文件清单

#include "include/driver/drv_pmp.h"

功能说明

  • 初始化并配置PMP模块,根据传入的一组PMP域配置参数逐个配置PMP区域
  • 支持批量配置多个PMP域,每个域的配置包括地址、大小、读写权限、地址匹配方式及属性
  • 配置完成后执行数据同步屏障(DSB),确保PMP配置生效

前置条件

  • 调用时序约束:当前接口必须在PMP模块HAL层函数注册完成后调用(pmp_port_register_hal_funcs已调用)
  • 依赖关系:当前接口依赖PMP硬件已正常初始化且HAL层函数已注册

入参

名称 参数类型 详细说明 约束取值范围
config const pmp_conf_t * 一组PMP域配置参数的数组指针 非NULL,指向有效内存空间
length uint32_t PMP配置的个数,即config数组的元素个数 大于0

返回值

  • 返回类型:errcode_t
返回值 文字含义 触发场景
ERRCODE_SUCC(0x00) 执行成功 所有PMP域配置均成功
ERRCODE_INVALID_PARAM(0x80000001) 参数无效 size小于等于1且地址匹配模式非TOR
Other 其他错误码,参考errcode_t 执行失败

参考案例

Kconfig配置

配置项 宏类型 说明 默认值
CONFIG_DRIVER_SUPPORT_PMP 编译参与宏 控制pmp模块参与编译 y
CONFIG_PMP_USING_RISCV_31 编译参与宏 控制hal_pmp_riscv31.c参与编译 n
CONFIG_PMP_USING_RISCV_70 编译参与宏 控制hal_pmp_riscv70.c参与编译 n
CONFIG_PMP_SUPPORT_64BIT_SIZE 特性宏 支持PMP 64位地址空间特性 -

Type definitions

errcode_t

typedef uint32_t errcode_t;

使用说明

uapi_pmp_config接口的返回值类型。[SDK公共基础类型]

Enumerations

pmp_attr

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

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

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

typedef struct pmpx_config {
    rwx_permission_t rwx_permission;  /*!< 读写权限。 */
    addr_match_t addr_match;          /*!< 地址匹配方式。 */
    bool lock;                        /*!< Lock位配置。 */
    pmp_attr_t pmp_attr;              /*!< 读写方式配置。 */
} pmpx_config_t;

成员说明

成员名称 数据类型 描述
rwx_permission rwx_permission_t 读写执行权限配置
addr_match addr_match_t 地址匹配方式
lock bool Lock位配置,为true时该PMP条目锁定不可修改
pmp_attr pmp_attr_t 读写方式配置(缓存属性)

pmp_conf

typedef struct pmp_conf {
    uint32_t idx;                    /*!< 域编号 */
    uint32_t addr;                   /*!< 基地址,在NAPOT/NA4模式为首地址,TOR模式为尾地址。 */
#ifdef CONFIG_PMP_SUPPORT_64BIT_SIZE
    uint64_t size;                   /*!< 在NAPOT模式使用,内存单元的大小。 */
#else
    uint32_t size;                   /*!< 在NAPOT模式使用,内存单元的大小。 */
#endif
    pmpx_config_t conf;              /*!< PMP域配置参数。 */
} pmp_conf_t;

成员说明

成员名称 数据类型 描述
idx uint32_t PMP域编号
addr uint32_t 基地址,NAPOT/NA4模式为首地址,TOR模式为尾地址
size uint32_t / uint64_t 在NAPOT模式使用,内存单元的大小;CONFIG_PMP_SUPPORT_64BIT_SIZE开启时为uint64_t,否则为uint32_t
conf pmpx_config_t PMP域配置参数

Macros

ERRCODE_SUCC [SDK公共共享宏]

#define ERRCODE_SUCC                            0UL

ERRCODE_INVALID_PARAM [SDK公共共享宏]

#define ERRCODE_INVALID_PARAM                               0x80000001