RISC-V 启动汇编异常定位

Posted Top嵌入式

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RISC-V 启动汇编异常定位相关的知识,希望对你有一定的参考价值。

一、问题现象

最近在给一款 RISC-V 的芯片写 boot 汇编,遇到个奇怪的 BUG,系统启动后,在 boot 中打印调试信息会异常死机,死机现场的信息显示 pc 跑飞,异常寄存器也是指令获取错误

二、定位问题

这种问题还是比较难定位的,谁也不知道是代码问题还是编译器问题还是芯片问题,不过我遇到的是代码问题,这里分享一下我的定位思路。

首先启动 boot 运行在 risc-v 的 M 模式,系统发生的异常和中断时, mcause 会记录异常和中断的类型,中断时 mcause 的最高有效位置 1,同步异常时置 0,观察 mcause 寄存器,定位到的是内部异常。

然后分析异常处理流程,在异常发生时,异常指令的 PC 被保存在 mepc 中,PC 被设置为 mtvec 的地址加上偏移。(对于异常,mepc指向导致异常的指令;对于中断,它指向中断处理后应该恢复执行的位置。)RISC-V 架构也会根据异常来源设置 mcause,并将 mtval 设置为出错的地址或者其它适用于特定异常的信息字。

这里 mtvec 我直接设置为了异常自陷函数,正是这一操作导致了问题的产生,trap 我直接指向了异常函数的实体,没有设置一个异常和中断表,在进入到打印函数后会产生串口 UART,使用到 mtvec 的基地址做为偏移,以实体函数的地址作为偏移基地址肯定会产生问题,所以该问题修改 此寄存器的值为中断表的基地址就可以解决问题。

三、地址对齐问题

改变实体代码的地址对齐会让问题表面上消失,分析的原因可能是对齐的实体代码在我设置的异常跳转函数后面,与异常函数在 .text 段的地址空间连续,改大对齐,相当于用 nop 填充了地址跳转表,串口中断进入没有产生错误,再加上我也没使用到串口中断接收函数,只是开启了中断,所以问题没有发现出来。

以上是关于RISC-V 启动汇编异常定位的主要内容,如果未能解决你的问题,请参考以下文章

RISC-V 启动汇编异常定位

国内 RISC-V 产学研基地成立,IntelArmRISC-V 将三分天下?

如何将 M 文件转换为 RISC-V 汇编代码?

如何在 RISC-V 汇编中使用向量运算

入门 RISC-V 编程的五大技巧

视频更新:代码分析8之单步调试ARM64启动汇编与重定位