exception - RISC-V 从带有压缩指令的异常处理程序返回
问题描述
我看到退出 RISC-V 异常处理程序的标准方法是更新mepc
到mepc+4
before mret
。
但是如果下一条指令在压缩指令模式下只有 2 个字节长,这不会引起问题吗?
在压缩指令模式下,混合了 4 字节和 2 字节指令。如果您不更新mepc
,mret
那么您就会不断收到相同的异常。但是总是将 4 添加到被困mepc
似乎是混合压缩指令的错误。
我错过了什么吗?
解决方案
我看到退出 risc-v 异常处理程序的标准方法是在 mret 之前将 mepc 更新为 mepc+4。
这些不是严肃的异常处理程序;它们只是说明性的——显示异常的捕获,并在没有完成给定情况所需的实际异常处理的情况下返回到被中断的代码。因此,防止无限循环最简单的方法就是跳过有问题的指令。
我们推进 pc 以返回导致异常的代码的少数几个地方之一是处理ecall
. 据我所知,没有压缩(16 位)ecall
指令。
许多可恢复的异常需要重新运行导致异常的指令——例如导致页面错误的加载和存储(在 32 位和 16 位形式中都可用),例如,一旦页表已修复(从磁盘读入并映射到用户地址空间的页面)。
许多其他异常通常不可恢复。
但是,模拟指令需要知道它的大小,就像ecall
. 如果您选择模拟,例如,未对齐的内存访问,您确实必须决定指令的大小,因为模拟它意味着恢复过去。另请注意,RISC V 支持 16 位、32 位、48 位、64 位和更长的指令,因此要模拟指令的异常处理程序将需要能够解码它们的长度(仅选择用于仿真,虽然)。
要补充的另一件事是,您可能正在查看的示例异常处理程序设计为无需压缩指令集即可工作,并且由于 RVC 是可选的,因此这是一个合理的设计选择(尽管理想情况下,当然会明确说明)。
推荐阅读
- java - Spring-Boot:运行 spring-boot restful 程序失败
- unity3d - 使用 Unity Vimeo API 下载 Vimeo 视频以供离线使用
- java - 我如何检索孩子(姓名和列表图像)
- java - 使用 JNDI 的休眠数据源连接
- android - 为什么按下后退按钮时我的意图没有通过?
- c++ - C++ 类名冲突
- python - 替换python 3中的第一个字符串字符
- javascript - 如果表单验证为假(VueJS),则防止将数据发送到数据库/服务器
- php - 在 CodeIgniter 中删除文件夹
- spring-mvc - 嵌套异常是 javax.comm 中的 java.lang.NoClassDefFoundError 在部署 WAR 时使用 Srping MVC?