我正在开发自定义版本的 Rocket Chip,它具有一些额外的指令,我希望 Linux 能够正确处理这些指令。尽管使用这些指令的裸机程序运行良好,但 Linux 使相同的基准测试因“非法指令”消息而崩溃。
有谁知道 Linux 的哪个软件元素(加载程序、反汇编程序或其他软件)负责检测非法指令?
我的目标是修改那个软件,让 Linux 不再提示我的指令。如果有人知道抑制此类错误的更简单方法,那也将非常有用。
最佳答案
RISC-V 实现(处理器)在遇到未实现的指令时会引发非法指令陷阱。这些非法指令陷阱将通过管道传递到 Linux(通过陷阱委托(delegate)或在由机器模式软件处理后),然后通过标准陷阱处理流程:
strapvec
指向Handle_exception ,它会进行大量簿记以避免破坏用户空间,然后将陷阱定向到正确的位置。- 对于非法指令陷阱,您将跳转到 the
excp_vect_table
jump table ,处理所有无聊的陷阱。 - 这由
scause
索引,在本例中指向do_trap_insn_illegal
. do_trap_insn_illegal
只是一个通用的 Linux 陷阱处理程序,它将SIGILL
传递给导致陷阱的任何对象。这可能会向用户空间任务、内核任务发出信号,或者直接让内核 panic 。
这里有一堆间接级别,我们目前没有做任何事情,但可能会在未来用于模拟未实现的指令。
关于linux - 哪个 Linux 实体负责生成非法指令陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51827928/