玄铁C906——物理内存保护(PMP)介绍

文章探讨了玄铁C906处理器的物理内存保护机制(PMP)与RISC-V架构的差异,特别关注PMP地址寄存器中低九位的特殊设计,这导致了编程上的挑战。作者分析了这种设计的原因,包括最小保护区域限制和简化硬件设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前言

(1)本文描述的是玄铁C906的物理内存保护机制的实现中,与RISC-V架构手册中完整PMP机制的差异部分
(2)RISC-V架构的PMP机制,参考博客:《RISC-V架构——物理内存属性和物理内存保护》

2、PMP概览

在这里插入图片描述

3、PMP地址寄存器差异

在这里插入图片描述
在这里插入图片描述

4、PMP地址寄存器差异带来编程差异

(1)pmp配置项中的NAPOR地址匹配模式是计算pmp地址寄存器中值的低位有多少个零来计算的,但是c906的pmp地址寄存器读出来低九位只能是零,所以通过读PMP地址寄存器的值来反推保护区域范围就有问题,不能直接移植opensbi里的pmp_get函数,需要考虑低九位只读且为零的问题;
(2)举例:按照NAPOR地址匹配模式,写入38’ byy_yyyy_yyyy_yyyy_yyyy_yyyy_yyyy_yy01_1111_1111表示保护区域是2的(9+3)次方,也就是4KB。但是你将上面的值写入,然后从PMP地址寄存器中读出来是38’ byy_yyyy_yyyy_yyyy_yyyy_yyyy_yyyy_yy00_0000_0000,因为pmp地址寄存器的低九位只读且为零;

5、拓展

问题:为什么把低九位设计成只读且为零?
个人看法:
(1)芯片支持最小保护区域是4KB,也就是保护区域的大小的4KB的整数倍,4KB也就2的12次方;
(2)按照NAPOR地址匹配模式计算保护区域,大小是2的(n+3)次方,其中n是地址最低位连续1的个数。要表示4KB,刚好n=12-3=9,也就是低九位肯定是连续1,既然低九位是固定的,那干脆就硬件直接设计成只读为零,简化芯片设计;

### RISC-V架构下的读写执行权限 在RISC-V架构中,物理内存保护(Physical Memory Protection, PMP)机制用于控制不同地址空间的访问权限。通过配置PMP表项可以精确设定特定区域内的读取、写入以及执行权限。 对于每一个PMP条目而言,存在专门的位来定义其属性: - **R位**:指示该区域内是否允许进行数据加载操作即读取动作; - **W位**:表明能否对该范围实施存储指令也就是写入行为; - **X位**:决定着此区间能不能被执行作为程序代码段[^3]。 当上述任何一个标志位置零,则对应类型的请求将会遭到拒绝并触发异常处理流程;值得注意的是,在某些特殊情况下,部分组合可能被预留并未实际启用[R=0,W=1]。 除了基本的功能外,还有额外两个辅助性的域——A和L用来进一步增强灵活性与安全性。不过这里主要关注于最基本的RWX三类权限管理方式及其影响。 为了确保系统的稳定性和安全级别,开发者应当合理规划各个模块所需的最小化资源访问权利,并利用好硬件层面所提供的防护措施以防止潜在风险的发生。 ```c // 设置PMP寄存器的例子 (假设使用C语言编写) void set_pmp(uint8_t index, uint64_t addr, size_t size, bool read, bool write, bool exec){ pmp[index].addr = addr; pmp[index].size = size; pmp[index].r = read ? 1 : 0; // 是否允许读取 pmp[index].w = write ? 1 : 0; // 是否允许写入 pmp[index].x = exec ? 1 : 0; // 是否允许执行 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值