如何在gem5中使用时间戳记跟踪执行的来宾函数符号名称?

问题描述

例如在每个刻度为500个单位的AtomicSimplecpu中,我想输入以下内容

0 function1
2000 function2
5000 function3

表示function1在时间0开始执行,function2在时间2000开始,依此类推。

我可以从--debug-flags ExecAll中解析出来,但是由于它会输出大量信息,因此大大降低了执行速度,这很烦人。

解决方法

我在gem5 6bc2111c9674d0c8db22f6a6adcc00e49625aabd上偶然发现了一个函数:

gem5.opt fs.py --param 'system.cpu[0].function_trace = True'
  --param 'system.cpu[0].function_trace_start = 0'

生成文件ftrace.system.cpu,该文件包含以下格式的输出:

0: _start (6500)
6500: on_exit (2500)
9000: __register_exitproc (13500)
22500: _start (2000)
24500: main (4000)

其中_start在时间0开始执行,执行了6500个单位。

我测试了一个arm64 Linux kernel v5.4.3. boot with it,它只使执行速度降低了大约30%,这很好

该功能当前无法用于系统调用仿真:

BaseSimpleCPU::postExecute()
{
    if (FullSystem)
        traceFunctions(instAddr);

我试图快速删除它,并且main的输出看起来确实正确,但是由于某种原因,似乎在__end__之前的每个时间戳上都打印了名为main的入口函数,这很烦人。它应该很容易修复。