iT邦幫忙

0

[gem5][xv6-riscv] 在 gem5 上運行 xv6-riscv

  • 分享至 

  • xImage
  •  

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

在這一篇來介紹一下,要怎麼將 xv6-riscv 移植到 gem5 上。
這樣子,我們就有一個小一點的 kernel,可以更快速的驗證 gem5 的一些功能 ( 例如 page table )。

因為原本 xv6-riscv 沒辦法運行在 gem5 上,所以我把這個專案 fork 出來,並修改了一些地方。程式碼放在這裡 : https://github.com/TommyWu-fdgkhdkgh/xv6-riscv/tree/gem5-xv6-riscv

其實要修改的地方不多,接下來就講述一下需要修改哪些地方,以及實際運行的時候,需要輸入的指令。

commit : 03b11d3

commit 03b11d3 的更改內容 : https://github.com/TommyWu-fdgkhdkgh/xv6-riscv/commit/03b11d3032538a3db8bbae29e68d0bdbe330dc98

在這一筆 commit,主要做的事情就是把 92e60dd 這筆 commit 給 revert 掉。

92e60dd 的更改內容可以看這裡 : https://github.com/TommyWu-fdgkhdkgh/xv6-riscv/commit/92e60dd8335b49e426760dbcbf1ef54c601f098e

在 92e60dd ,從 machine mode ( M-mode ) 的 timer interrupt ,換成效能更好的 Supervisor mode ( S-mode ) timer interrupt。而想要這樣做有一個前提,那就是該 RISC-V 平台需要支援 Sstc extension。

很不幸的,gem5 目前沒有模擬 Sstc extension,所以需要把這筆 commit 給 revert 掉。

commit : cfeb198

commit cfeb198 : https://github.com/TommyWu-fdgkhdkgh/xv6-riscv/commit/cfeb19896d93c4531f7d96267a4ff22f55385286。在這一筆 commit,主要做的事情就是把 cd00a82 這筆 commit 給 revert 掉。

cd00a82 的內容 : https://github.com/TommyWu-fdgkhdkgh/xv6-riscv/commit/cd00a8233ad43be269908db5bdc28c5961a9dce9 。在 cd00a82 將 virtIO 的版本從 version 1 升級到 version 2

但是因為 gem5 不支援 version 2,所以還是必須把它降版回使用 version 1

commit : 7cc0e49

commit 7cc0e49 : https://github.com/TommyWu-fdgkhdkgh/xv6-riscv/commit/7cc0e4921cccb7f25f43155c61761cce7ff414b9

{ QEMU code : https://github.com/qemu/qemu/blob/master/include/hw/virtio/virtio-mmio.h#L42 }
在這裡可以看到,QEMU 的 vendor id 是 0x554D4551

{ gem5 code : https://github.com/TommyWu-fdgkhdkgh/gem5/blob/gem5-xv6-riscv/src/dev/riscv/vio_mmio.hh#L101C39-L101C45 }
在這裡可以看到 gem5 的 vendor id 是 0x1AF4

所以我們也需要更改一下,xv6-riscv 裡面檢查 vendor id 的程式碼。

如何在 gem5 運行 xv6-riscv

# 把已經寫好的 script 下載下來
git clone https://github.com/TommyWu-fdgkhdkgh/gem5-verify-vm.git 
cd gem5-verify-vm/

# 下載 gem5 程式碼
make gem5/clone

# 編譯 gem5
make gem5/build

# 下載修改過後的 xv6-riscv 程式碼
make xv6-riscv/clone

# 編譯 xv6-riscv
make xv6-riscv/build/SV39

# 運行 gem5
./gem5/build/RISCV/gem5.opt ./run_xv6.py --kernel-type=xv6-riscv

# 連上 terminal
./gem5/util/term/gem5term 3456

成功 boot xv6-riscv 之後,預期可以看到

hart 2 starting
hart 1 starting
init: starting sh
$ 

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

尚未有邦友留言

立即登入留言