gem5 中的伪指令是什么?

What are pseudo-instructions for in gem5?

所以,我看到了 gem5 中的一些模拟是如何实现的,更具体地说,我查看了 PIMSim (https://github.com/vineodd/PIMSim)。我看到他们已经为 x86 架构实现了一些伪指令。我已经看到这些伪指令仅在完整系统模式下使用。为此,他们修改了以下文件:

我已经了解实现自定义伪指令需要进行哪些更改,但我不了解它们是什么以及如何使用它们。我没有在这些文件之外找到任何调用此函数的地方。有什么帮助吗?提前致谢!

伪操作是从来宾内部进行魔术模拟操作的方法,这种技术通常称为来宾检测

它们可以是 used/implemented 或者是:

  • 魔法指令放置在真实 ISA 的未使用编码 space 中

    我认为这总是启用的,除了在主机 CPU 接管的 KVM 中,如果看到那些未知指令就会崩溃。

  • 访问魔法内存地址。这是 Python 配置中的 configured/enabled,System.py 包含:

    m5ops_base = Param.Addr(
        0xffff0000 if buildEnv['TARGET_ISA'] == 'x86' else 0,
        "Base of the 64KiB PA range used for memory-mapped m5ops. Set to 0 "
        "to disable.")
    
  • ARM semihosting:最近将一些自定义半主机操作连接到 m5ops。一些 m5ops 和一些标准化的半主机操作可以实现的东西之间存在一些重叠是毫无意义的,比如退出模拟器。

一些最常见的 m5ops 是:

  • m5 exit: 退出模拟器
  • m5 checkpoint: 拿一个关卡
  • m5 dumpstats:转储统计数据
  • m5 resetstats:将统计数据清零并重新开始计算下一个 m5 dumpstats
  • m5 readfile:读取主机fs.py --script选项内容的值,对run different workloads after Linux boot checkpoint
  • 很有用

m5ops 很有用,因为通常很难确定何时要以其他方式执行上述操作,例如:在 Linux 完成启动时执行某些操作。例如,要从模拟器中天真地做到这一点,您需要提前知道发生了什么滴答声。您可以检查 PC 是否匹配某个地址(已经完成,例如 Linux panic 检查),但这有点难。

还有 in-tree m5 tool,您可以交叉编译并放置在完整的系统来宾中,以公开可执行 CLI 界面的魔法指令。

但是如果需要,您也可以将它们硬编码到二进制文件中以获得更精确的结果,例如X86

中的硬编码
#define LKMC_M5OPS_CHECKPOINT __asm__ __volatile__ (".word 0x040F; .word 0x0043;" : : "D" (0), "S" (0) :)
#define LKMC_M5OPS_DUMPSTATS  __asm__ __volatile__ (".word 0x040F; .word 0x0041;" : : "D" (0), "S" (0) :)

更多硬编码示例位于:https://github.com/cirosantilli/linux-kernel-module-cheat/blob/4f82f79be7b0717c12924f4c9b7c4f46f8f18e2f/lkmc/m5ops.h Or you can also use them more nicely and laboriously from the mainline tree as shown at:

还可以在以下位置找到更多信息:https://cirosantilli.com/linux-kernel-module-cheat/#m5ops