• Gem5 Debug


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

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

    以O3 CPU为例,主要有Fetch、Decode、Rename、Execute、Writeback、Commit这几级流水。源码主要集中在src/cpu/o3
    image.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
    
    • 1

    gdb常用指令

    b fetch.cc:1024 # 打断点
    info b # 查看断点
    d 编号# 删除编号
    r  # run
    c # continue
    n # next line
    s # 进入子函数
    si # step inst
    p param #打印变量
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果有图形界面,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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    浏览器打开本地端口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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2. 各级流水线

    image.png

    image.png

    image.png
    原文链接

  • 相关阅读:
    js-原生对象
    《TCP/IP网络编程》阅读笔记--进程间通信
    解决异常 java.net.URISyntaxException: Illegal character in query at index
    【腾学汇的第1个实验代码】应用Matplotlib绘制图标分析
    HTML静态网页作业——我的家乡安庆
    汽车空调工作总结
    自定义数字键盘(kotlin)
    高可用(keepalived)部署方案
    基于深度神经网络的社交媒体用户级心理压力检测
    kafka详解一
  • 原文地址:https://blog.csdn.net/qq_42556934/article/details/126430954