在RISC-V架构中,物理内存保护(PMP, Physical Memory Protection)机制允许对不同的物理内存区域设置访问权限。PMP表项不仅包含访问权限(读、写、执行),还包括地址匹配模式,用于定义受保护内存区域的范围。以下是几种主要的地址匹配模式:
PMP地址匹配模式
-
自然粒度(NAPOT, Naturally Aligned Power-of-Two)
- 这种模式要求受保护的内存区域大小必须是2的幂次方,并且起始地址也必须是对齐到该大小的边界上。
- 例如,如果你想保护一个4KB(即2^12字节)大小的内存区域,那么这个区域的起始地址必须是4KB的倍数。
- 在配置时,
pmpaddr
寄存器中的值表示的是该区域的结束地址减去1。因此,对于一个从地址0x2000开始的4KB区域,pmpaddr
寄存器应该设置为0x2FFF(即0x3000 - 1)。
-
全地址空间(TOR, Top of Range)
- 这种模式通常与另一个PMP条目结合使用,定义一个范围内的地址。第一个条目定义范围的顶部,第二个条目定义范围的底部。
- 例如,如果你有两个PMP条目,第一个条目的
pmpaddr
设置为0x3000,第二个条目的pmpaddr
设置为0x2000,则受保护的区域是从0x2000到0x3000(不包括0x3000)。 - 注意,这种模式需要两个连续的PMP条目来定义一个完整的地址范围,并且这两个条目都应配置为TOR模式。
-
下界(OFF, Offset)
- 在某些实现中,可能支持偏移模式,但这种方式不如NAPOT和TOR常见。它允许你通过指定一个基地址和一个偏移量来定义一个地址范围。
- 这种模式的具体实现细节依赖于具体的硬件平台,因此在实际应用中需要查阅相关文档。
-
关闭(NA4, Naturally Aligned 4-byte Region)
- 这种模式用于保护一个自然对齐的4字节区域。由于其粒度非常小,通常只适用于特定的小型数据结构。
- 例如,要保护从地址0x2000开始的4字节区域,
pmpaddr
寄存器应设置为0x2003(即0x2004 - 1)。
配置示例
假设我们想配置一个PMP条目来保护从地址0x2000开始的4KB内存区域,并允许读写操作但不允许执行操作。我们将使用NAPOT模式来进行配置。
步骤
-
确定地址匹配模式:
- 对于4KB大小的区域,我们需要使用NAPOT模式,并确保起始地址0x2000是对齐到4KB边界的。
-
计算
pmpaddr
值:- 对于4KB的NAPOT区域,
pmpaddr
寄存器应设置为0x2FFF(即0x3000 - 1)。
- 对于4KB的NAPOT区域,
-
配置
pmpcfg
寄存器:- 设置相应的
pmpcfg
寄存器以启用PMP条目,并选择NAPOT模式、设置读写权限(R=1, W=1, X=0)。 - 假设我们要配置第0个PMP条目,可以如下设置:
li t0, (1 << 0) | (1 << 1) | (0 << 2) | (1 << 3) | (1 << 7) # R=1, W=1, X=0, A=11 (NAPOT), L=0 csrw pmpcfg0, t0
- 设置相应的
-
配置
pmpaddr
寄存器:- 将计算好的地址写入对应的
pmpaddr
寄存器:li t0, 0x3000 # 0x2FFF + 1 csrw pmpaddr0, t0
- 将计算好的地址写入对应的
总结
- NAPOT模式是最常用的地址匹配模式,适用于大多数场景,尤其是当内存区域大小为2的幂次方且起始地址对齐时。
- TOR模式需要两个连续的PMP条目来定义一个地址范围,适用于需要精确控制较大区域的情况。
- NA4模式适用于小型数据结构的保护,但由于其粒度过小,在实际应用中较少使用。
理解这些地址匹配模式有助于更灵活地配置PMP,从而增强系统的安全性。