我正在开发一个自定义版本的 Rocket Chip,其中包含一些我希望 Linux 正确处理的额外指令。尽管使用这些指令的裸机程序运行良好,但 Linux 使相同的基准测试因“非法指令”消息而崩溃。
有谁知道 Linux 的哪个软件元素——加载程序、反汇编程序、其他东西——负责检测非法指令?
我的目标是修改那个软件,让 Linux 不再抱怨我的指令。如果有人知道一种更简单的方法来抑制这种错误,那也将非常有用。
我正在开发一个自定义版本的 Rocket Chip,其中包含一些我希望 Linux 正确处理的额外指令。尽管使用这些指令的裸机程序运行良好,但 Linux 使相同的基准测试因“非法指令”消息而崩溃。
有谁知道 Linux 的哪个软件元素——加载程序、反汇编程序、其他东西——负责检测非法指令?
我的目标是修改那个软件,让 Linux 不再抱怨我的指令。如果有人知道一种更简单的方法来抑制这种错误,那也将非常有用。
RISC-V 实现(处理器)在遇到未实现的指令时会引发非法指令陷阱。这些非法指令陷阱将通过管道传送到 Linux(通过陷阱委托或在由机器模式软件处理之后),然后流经标准陷阱处理流程:
strapvec
指向Handle_exception,它会做一堆簿记以避免破坏用户空间,然后将陷阱引导到正确的位置。excp_vect_table
表,它处理所有无聊的陷阱。scause
,在本例中指向do_trap_insn_illegal
。do_trap_insn_illegal
只是一个通用的 Linux 陷阱处理程序,它传递SIGILL
给导致陷阱的任何原因。这可能会向用户空间任务、内核任务发出信号,或者直接使内核恐慌。这里有很多间接级别,我们目前没有做任何事情,但将来可能会用于模拟未实现的指令。