【问题标题】:What Linux entity is responsible for generating Illegal Instruction Traps?哪个 Linux 实体负责生成非法指令陷阱?
【发布时间】:2018-08-13 17:50:09
【问题描述】:

我正在开发一个自定义版本的 Rocket Chip,其中包含一些我希望 Linux 正确处理的额外指令。尽管使用这些指令的裸机程序运行良好,但 Linux 使相同的基准测试崩溃并显示“非法指令”消息。

有谁知道 Linux 的哪个软件元素(加载程序、反汇编程序、其他东西)负责检测非法指令?

我的目标是修改那个软件,让 Linux 不再抱怨我的指令。如果有人知道抑制这种错误的更简单方法,那也将非常有用。

【问题讨论】:

  • 这些指令是否被处理器视为特权?如果是这样,问题可能不在于 Linux,而在于您在操作系统中运行应用程序时是在用户模式而不是内核模式下运行。
  • 处理器生成陷阱。操作系统会处理陷阱并通常会杀死您的应用程序。 ARM 具有异常级别 (EL)。用户土地为 EL0。 EL1 及以上的指令你必须有特权。
  • 我刚刚发现我应该设置某个 CSR (mstatus) 的位 0x8000 以启用自定义指令的执行。确实是处理器产生了非法指令陷阱。现在一切正常。感谢@merlin2011 和@jww 的帮助。

标签: linux riscv binutils rocket-chip


【解决方案1】:

RISC-V 实现(处理器)在遇到未实现的指令时会引发非法指令陷阱。这些非法指令陷阱将通过管道传送到 Linux(通过陷阱委托或由机器模式软件处理后),然后流经标准陷阱处理流程:

  • strapvec 指向 Handle_exception,它会进行大量记账以避免破坏用户空间,然后将陷阱引导到正确的位置。
  • 对于非法指令陷阱,您会遇到the excp_vect_table jump table,它会处理所有无聊的陷阱。
  • 这由scause 索引,在本例中指向do_trap_insn_illegal
  • do_trap_insn_illegal 只是一个通用的 Linux 陷阱处理程序,它将 SIGILL 传递给导致陷阱的任何原因。这可能会向用户空间任务、内核任务发出信号,或者直接使内核恐慌。

这里有很多间接级别,我们目前没有做任何事情,但将来可能会用于模拟未实现的指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2021-10-31
    相关资源
    最近更新 更多