WQ PMP

概述

riscv 处理器提供一个物理内存保护(PMP,Physical Memory Protection)功能,防止非法访问和攻击。

功能特性

  • pmp 机制的基本原理是将物理内存划分为多个区域,并为每个区域分配一个访问权限。

  • pmp 允许区域锁定,一旦区域被锁定,对配置和地址寄存器的进一步写入将被忽略。锁定的 PMP 条目只能通过系统重置解锁。

  • pmp 机制需硬件支持,riscv 处理器需具备 pmp 相关的指令和寄存器。

  • 主要是 pmp 配置寄存器(pmpcfg)和 pmp 地址寄存器(pmpaddr)。

  • pmpcfg 用于配置 pmp 机制的权限,包括区域大小和访问权限等。

  • pmpaddr 用于存储 pmp 区域的起始地址。

  • B+ pmp 无锁定功能,包括lock bit自身。

  • hornet 增加使能位控制lock,使能之后,lock才有效。

用法流程

  • 初始化 pmp_init()

  • 重置 pmp 寄存器 pmp_reset_all()

  • 设置零地址保护 pmp_zero_addr_set()

  • 设置中断栈保护 pmp_isr_stack_set()

  • 设置 cache 保护 pmp_cache_in_isr_set()

  • 解除 cache 保护 pmp_cache_in_isr_clear()

1enum {
2   PMP_R = 1 << 0, /* 读权限 */
3   PMP_W = 1 << 1, /* 写权限 */
4   PMP_X = 1 << 2, /* 执行权限 */
5   PMP_A = 3 << 3, /* 地址匹配模式 */
6   PMP_L = 1 << 7, /* 配置锁置位 */
7}; /* 当前我们只需使用PMP_R,PMP_W,PMP_X 这三个即可,PMP_A和PMP_L已配置 */
1 /**
2 * @brief 构建一段地址保护
3 * @param base 被保护的起始地址
4 * @param size 被保护的长度, 若size>4,则都向上取2冥次方的大小
5 * @param flags 该地址保护的类型 对应 PMP_R(读保护) PMP_W(写保护)等 参考 pmp.h
6 * @return pmp entry serial number if ret = -1,no pmp reg can be used
7 */
8 int pmp_setup(uint32_t base, uint32_t size, uint32_t flags);
1 /**
2 * @brief 设置栈溢出检测
3 * @param addr 溢出检测地址
4 */
5 void pmp_task_stack_set(uint32_t addr);
1 /**
2 * @brief pmp 对已配置的pmp进行恢复
3 * @param n pmp 要恢复的pmp序号
4 * @return pmp entry serial number if ret = -1,no pmp reg can be used
5 */
6 int pmp_reset_by_serial_number(int32_t n);