所以,我正在了解 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 检查点
:采取检查点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您可以交叉编译并将其放置在完整的系统 guest 中,以公开来自可执行 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
关于gem5 - gem5 中的伪指令是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63488050/