Gem5的源码在src文件夹,涉及很多内容,如果希望修改某些模块,或增加某些功能,总感觉无从下手:一方面对Gem5的代码组织不清楚,另一方面对硬件结构不熟悉。

经过一番探索,逐渐有些感觉,特来记录一波。

以O3 CPU为例,主要有Fetch、Decode、Rename、Execute、Writeback、Commit这几级流水。源码主要集中在src/cpu/o3image.png

分析工具主要有两类,一类是静态分析工具,它可以查看函数的调用关系,理清代码的不同层级。

  • vscode
  • understand
  • grep -nr "function"

另一类是动态分析工具,它可以跟踪“O3 CPU”运行的时序,更进一步了解软件代码的运行。

  • gdb
  • gdb可视化工具gdbgui

一、静态分析

“Understand” 是收费软件,但网上很多破解版,而且只有windows版本。新建工程,导入源码之后,会自动分析这些函数的调用和被调用关系。vscode也有函数跳转功能,两者可以结合着看。

另一方面,因为Gem5是混合了python(主要为了连线和传参)和C++(基本硬件的建模),所以有些函数没法跳转,这时候用可以用grep搜索。 image.png

二、动态分析

如果想查看一些中间变量,用print大法需要重新编译,非常耗时,这时用gdb断点调试可以事半功倍。

gdb --args build/X86/gem5.opt configs/example/se.py -c test_ban/hello

gdb常用指令

b fetch.cc:1024 # 打断点
info b # 查看断点
d 编号# 删除编号
r  # run
c # continue
n # next line
s # 进入子函数
si # step inst
p param #打印变量

如果有图形界面,gdbgui工具可以更方便调试,

 pip install gdbgui #安装gdbgui

~/.local/bin/gdbgui -p 10001 -r "a.out"  # 浏览器本地127.0.0.1:10001端口打开即可

~/.local/bin/gdbgui -p 10001 -r --args ./build/RISCV/gem5.debug --debug-flags=O3CPUAll debug-start=78000 configs/example/se.py --cpu-type=O3CPU --l1d_size=32kB --l1i_size=32kB --caches -m 230000 -c /home/hezf/Documents/OS_test/gem5_pro/testbench/hello/hello.elf

浏览器打开本地端口10001,可以看到调试界面,更多的调试指南可以查看官网。

image.png

三、O3 CPU代码分析

1.仿真前的初始化

src/sim/main.cc: importer() -> importInit()-> initAll()
src/python/embedded.cc: initAll()
src/sim/init.cc: initAll()-> pybind_init_event()
src/python/pybind11/event.cc: pybind_init_event() -> simulate()
src/sim/simulate.cc: simulate() -> doSimloop() -> serviceOne()
src/sim/eventq.cc: serviceOne() -> eventq.hh:event->process()

2. 各级流水线

image.png

image.png

image.png

标签: gem5, 体系结构

仅有一条评论

  1. helloworld helloworld

    帆哥,啥时候更新博客啊!!!

添加新评论