linux - 哪个 Linux 实体负责生成非法指令陷阱?

标签 linux riscv binutils rocket-chip

我正在开发自定义版本的 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/

相关文章:

c++ - 给定一个使用 gcc 从 C++ 构建的 ELF 二进制文件,我如何确定其中某些类型的大小?

gcc - 构建交叉编译 64 位 GCC 失败

c - 为什么 arm-none-eabi-size 报告 .data 部分为 0,即使我使用的是已初始化的 RAM?

java - 在 Java 中读取 Excel 中的值,Windows 与 Linux 的问题

android - 仅将新文件(照片)从 Android adb 拉到 linux 操作系统

assembly - RISC 32I 跳转和分支 LSB 硬连线至零

assembly - 在没有乘法器的情况下加速以 2^8 为基数的大型模乘法

assembly - 如何在 RISC-V 汇编中使用数组

regex - 为什么这个模式搜索挂了?

c - setgid 不允许操作