问题描述
因此,我正在了解如何实现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