刚刚阅读完 RISCV 规范,更具体地说是“第二卷:RISC-V 特权架构”,并对 GDB(或任何其他调试器)应该如何工作有疑问。
基本上有两种编译标准 GDB 的方法:基于硬件或基于操作系统。
一个区别是“单步指令”(si 命令) - 对于基于操作系统,它是通过在可能遵循的每个可能指令(下一个程序集)上放置软件断点(用“断点”汇编指令替换汇编指令)来实现的如果当前是条件分支,则可能是另一个指令)。这忽略了可能的中断、页面错误、操作系统请求……
对于基于硬件的 GDB,没有任何东西是隐藏的,因此无法使用软件“下一条指令断点”:可能存在中断或异常,然后 GDB 将在该处理程序的入口处停止。
如果 RISC-V 也应该支持“用户模式中断”,它将有同样的问题,在用户模式下执行“单个汇编指令步骤”可能不知道下一个要替换的汇编指令是什么,而 GDB 用户可能不想跳过/隐藏中断处理。
然后需要一些“硬件”支持来中断硬件周期计数器,有点像定时器的“实时寄存器及其比较值寄存器”。