我尝试在 16 字节区域上使用 PMP 来保护特定的内存区域。但是,当启用 PMP 配置时跳转到 U 模式时,我遇到指令访问错误。
详情:
我的程序以 M 模式启动,并在某个时刻使用以下命令跳转到 U 模式 先生。我没有使用虚拟内存进行此测试。
我要保护的内存区域从0x80020180开始。
我将 pmpaddr0 设置为 0x20008061 (将 0x80020180 右移 2 并 将最后两位数字设置为 0b'01 以标记 16 字节区域)。
pmp0cfg 设置为 0b'0001 1000(使用 NAPOT 进行读取、写入、 不允许执行)。
我有一个存储操作,尝试在 U 模式下存储到 0x80020184。 但是代码跳转到U时出现指令访问错误 模式。
U模式第一条指令位于PC 0x800004c0, 它不应该与 pmpaddr0 匹配。
我试图找出为什么跳转到 U 模式时会出现指令访问错误。 谁能帮我理解发生了什么?
我在 Spike 上运行我的代码,我在火箭核心模拟中也看到了相同的行为。
我找到了自己问题的答案,发布为薄可能对其他人有帮助。
事实证明我错过了规范中关于 PMP 优先级的重要一句话。
If no PMP entry matches an M-mode access, the access succeeds. If no PMP entry matches an
S-mode or U-mode access, but at least one PMP entry is implemented, the access fails.
所以我必须添加第二个 PMP 条目来匹配 U 模式下的所有地址,这解决了问题。
请告诉我如何添加第二个 PMP 条目以匹配 U 模式下的所有地址。我厌倦了添加第二个 PMP 条目,它对我不起作用。