iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0

QEMU

QEMU(Quick Emulator)是一個開源的虛擬化工具,它可以在不同的硬體平台上運行虛擬機器(VM),而QEMU如同它名稱所表示的,實際上是一種仿真器(Emulator),不過因為QEMU也常常作為RISC-V使用者進行模擬的平台,且QEMU本身極快的特性讓他很適合當作模擬器建構過程中的輔助工具 (例如像Spike一樣作為標準答案,或者是作為產生儲存點(checkpoint)的工具都很適合),因此筆者也打算花一篇的內容來講QEMU要怎麼使用。

checkpoint在模擬器領域指的是透過儲存模擬器的暫態,在下次進行模擬時可以回存(restore)回該狀態,進而節省模擬時間

QEMU作為仿真器,其並沒有實際上去模擬處理器的行為,相反的,他透過DBT(dynamic binary translate)的技術,將目標(例如說RISC-V)的指令轉換成本機(例如說X86)的指令並執行,就像是系列文章前面提到的黑魔法一樣。因此其模擬速度相較一般的功能模擬器還要快上許多,以筆者之前的經驗約有1GIPS以上。而QEMU與Spike一樣有模擬機器本身的ROM Code,因此同樣的直接執行程式會遇到跳到0x80000000的問題。


sifive_u.c
...
..
 uint32_t reset_vec[12] = {
        s->msel,                       /* MSEL pin state */
        0x00000297,                    /* 1:  auipc  t0, %pcrel_hi(fw_dyn) */
        0x02c28613,                    /*     addi   a2, t0, %pcrel_lo(1b) */
        0xf1402573,                    /*     csrr   a0, mhartid  */
        0,
        0,
        0x00028067,                    /*     jr     t0 */
        start_addr,                    /* start: .dword */
        start_addr_hi32,
        fdt_load_addr,                 /* fdt_laddr: .dword */
        0x00000000,
        0x00000000,
                                       /* fw_dyn: */
    };

QEMU的安裝方法
QEMU本身可以直接透過apt-install下載,指令如下

apt install qemu qemu-kvm libvirt-bin bridge-utils cpu-checker virtinst 

但如果本身機器太舊(例如筆者是ubuntu14-04),則會沒有risc-v的版本,要手動安裝,
安裝時可以參考risc-v-getting-started-guide內的這篇文章的內容,選擇v5.0版。
安裝步驟如下:

git clone https://github.com/qemu/qemu
git checkout v5.0.0
./configure --prefix="PATH/TO/INSTALL" --target-list=riscv64-softmmu
make -j $(nproc)
sudo make install

順利安裝後,由於Qemu本身並沒有像是Spike的PK那樣配套的kernel,因此可以選擇參考risc-v-getting-started-guide的內容直接將linux開起來。我們在此先將QEMU安裝好,作為將來自己的模擬器要開啟linux時的標準答案使用,因為我們的模擬器沒有MMU,而QEMU相較於Spike有額外提供no-mmu這個option,較適合我們所使用。

QEMU的一些技巧

在以QEMU作為"標準答案"時,我們可以找到設定option去倒QEMU的log (有哪些內容可以參考官方qemu-log.c)

例如我想要將exec的所有內容倒到文件"debug.log",直覺上會想要這樣下,

qemu-system-riscv64 -nographic -machine virt \
     -kernel linux/arch/riscv/boot/Image -append "root=/dev/vda ro console=ttyS0" \
     -drive file=busybox,format=raw,id=hd0 \
     -device virtio-blk-device,drive=hd0 -D "debug.log" -d "exec" 

但如果實際上去跟自己的模擬器或者是spike去比較,會發現qemu的指令數量壓倒性的少,且能觀察到PC會跳號,這是因為qemu的訊息是以TB(translate block)為單位在倒,也就是轉換成x86的指令的時候顯示,且轉換過一次就不會重新顯示,作為答案時會有許多不便,為此我們可以這樣設定

-d "exec,nochain -singlestep"

這樣能強迫QEMU逐行的轉換指令,進而讓我們得到指令層級的紀錄了,缺點是執行速度會慢上許多許多。


碎碎念 : 今天講QEMU,QEMU是筆者比較不熟悉的工具 (相較Spike和Gem5都有拆開來玩過),不過還是分享一些使用上的心得。QEMU的執行速度很快且功能強大,如果讀者對模擬有興趣強烈建議可以好好研究研究。


上一篇
Day 4 - Spike , RISC-V官方ISA simulator
下一篇
Day 6 - Gem5, 學習處理器架構的好平台
系列文
從零開始的RISC-V ISA Simulator (Another Little RISC-V ISA Simulator)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言