gem5中的伪指令是什么?

问题描述

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

  • include / gem5 / m5ops.h
  • util / m5 / m5op_x86.S
  • src / arch / x86 / isa / decoder / two_byte_opcodes.isa
  • src / sim / pseudo_inst.hh(cc)

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

解决方法

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

它们可以按以下方式使用/实现:

  • 魔术指令放置在实际ISA的未使用编码空间中

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

  • 访问魔术存储器地址。这是从Python配置中配置/启用的,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的更多硬代码示例,或者您也可以从主线树中更好,更省力地使用它们,如How to use m5 in gem5-20

更多信息,请访问:https://cirosantilli.com/linux-kernel-module-cheat/#m5ops