iT邦幫忙

0

[gem5] 該怎麼編譯以及運行 gem5 ?

  • 分享至 

  • xImage
  •  

系列文章 : [gem5] 從零開始的 gem5 學習筆記

在閱讀程式碼前,有一個能動起來的簡單範例還蠻有幫助的。
可以一邊閱讀程式碼,一邊用 gdb 去觀察 gem5 實際運行起來的行為。
所以這邊來開始將 gem5 編譯起來,並且運行一個簡單的 gem5 範例。

這邊就部分照著官方網站的教學,來進行 gem5 的編譯。

官方網站是使用 Ubuntu,我自己也是使用 Ubuntu。 : - )


安裝相關的套件。

sudo apt install build-essential git m4 scons zlib1g zlib1g-dev libprotobuf-dev protobuf-compiler libprotoc-dev libgoogle-perftools-dev python-dev python

把程式碼給複製下來。

git clone https://github.com/gem5/gem5.git

進入資料夾,並 checkout 到特定的版本。
checkout 這一步驟是怕以後改版之後,編譯的方式可能會改變,所以把
版本定在某一版。

cd gem5
git checkout 924000e05ea764a362264db5c2cb7553807ed929

安裝需要的 python 套件。

pip install -r requirements.txt

編譯 opt 版本

  • 有開啟編譯的優化,運行比較快
  • 某些 debug symbol 可能會消失
scons build/RISCV/gem5.opt -j$(nproc)

編譯 debug 版本

  • 沒有開啟編譯優化,運行比較慢
  • 保存完整的 debug symbol,當我們想要用 gdb 去 debug gem5 的時候,會方便許多。
scons build/RISCV/gem5.debug -j$(nproc)

詳細可參考 gem5 文件的 Building with SCons 章節


最後可以運行起 gem5。

build/RISCV/gem5.opt configs/learning_gem5/part1/simple-riscv.py

最後我們可以看到 Hello world! 的字樣。
這代表我們的編譯有成功! 真是太好了。

...
Hello world!
...

現在大概來檢視一下剛剛運行的簡單範例

我們把 configs/learning_gem5/part1/simple-riscv.py 當作參數,餵給了可執行檔 build/RISCV/gem5.opt

  • build/RISCV/gem5.opt 是什麼 ?
    很直白,就是一個可執行的檔案。我們可以執行它,也可以直接用 gdb 對它進行 debug

  • configs/learning_gem5/part1/simple-riscv.py 是什麼 ?
    對於 gem5 來說,這是一個 configuration script,這個檔案描述了你想怎麼建構你的 virtual platform。
    看到副檔名,我們可以知道 configuration script 就是一個 python file。實際上運行的時候,我們會先運行 gem5.opt 這個主要由 C++ 寫成的可執行檔案 ( ELF ),然後 gem5.opt 會開啟並執行這個 python script。

因為 gem5 是使用 python 去建構 virtual platform,這讓我們可以使用 python 的語法,靈活地建構我們想要的virtual platform。當我們想要替這個平台加上一個 cache,或是新增一個 Uart,我們只需要在這個使用 python 語法的 configuration script 進行設定,而不需要重新編譯

一個可比較的對象是 QEMU。因為 QEMU 是使用 C 語言建構 virtual platform ( e.g. RISC-V 的 virt machine ),所以當我們想要更改這個 virtual platform 的設定的時候,很可能需要重新編譯。

note : QEMU 的一個特例是 Xilinx 特製的 QEMU,它可以使用 dtb 去建構 virtual platform 而不需要重新編譯。


當我們想要 debug gem5 的時候,我們可以很方便的直接用 gdb 進行 debug。

gdb --args build/RISCV/gem5.debug configs/learning_gem5/part1/simple-r
iscv.py

例如我們可以在 main function 下個斷點。

(gdb) b main
(gdb) r

Breakpoint 1, main (argc=2, argv=0x7fffffffe038) at src/sim/main.cc:51
51          initSignals();

參考連結


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言