Gem5 Debug
Gem5的源码在src文件夹,涉及很多内容,如果希望修改某些模块,或增加某些功能,总感觉无从下手:一方面对Gem5的代码组织不清楚,另一方面对硬件结构不熟悉。
经过一番探索,逐渐有些感觉,特来记录一波。
以O3 CPU为例,主要有Fetch、Decode、Rename、Execute、Writeback、Commit这几级流水。源码主要集中在src/cpu/o3
。
分析工具主要有两类,一类是静态分析工具,它可以查看函数的调用关系,理清代码的不同层级。
- vscode
- understand
-
grep -nr "function"
另一类是动态分析工具,它可以跟踪“O3 CPU”运行的时序,更进一步了解软件代码的运行。
- gdb
- gdb可视化工具gdbgui
一、静态分析
“Understand” 是收费软件,但网上很多破解版,而且只有windows版本。新建工程,导入源码之后,会自动分析这些函数的调用和被调用关系。vscode也有函数跳转功能,两者可以结合着看。
另一方面,因为Gem5是混合了python(主要为了连线和传参)和C++(基本硬件的建模),所以有些函数没法跳转,这时候用可以用grep
搜索。
二、动态分析
如果想查看一些中间变量,用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,可以看到调试界面,更多的调试指南可以查看官网。
三、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()
帆哥,啥时候更新博客啊!!!