文章目錄
- 獲取xv6源代碼
- Ubuntu
- 20.04 Version
- 安裝指令
- 成功測試
- 參考MIT2021年官方文檔
- 24.04 Version
- 安裝指令
- 成功測試
- 參考MIT2024年官方文檔
- Ubuntu 22.04
- 沒有官方文檔?
- 配置大體流程
- 1. 卸載原本qemu(如果之前安裝了)
- 2. clone qemu官方源代碼,切換到stable 7.2 version
- 3. configure
- 4. make 并 install
- 5. 刪除下載的qemu項目
- 心酸歷程
- 能不能用24.04的Qemu?
- 更多
- 三種riscv-gcc的應用場景與區別
- 能不能在wsl下使用?
- riscv64-linux-gnu-gcc
- riscv64-unknown-elf-gcc
- riscv64-unknown-linux-gnu-gcc
- 配置環境項講解
- 1. git
- 2. build-essential
- 3. gdb-multiarch
- 4. qemu-system-misc
- 5. gcc-riscv64-linux-gnu
- 6. binutils-riscv64-linux-gnu
- 總結
- 自己安裝的qemu和apt安裝的有什么區別
- 1. 版本差異
- 2. 編譯選項
- 3. 安裝路徑
- 4. 依賴管理
- 5. 更新與維護
- 6. 兼容性
獲取xv6源代碼
git clone https://github.com/mit-pdos/xv6-riscv.git
cd xv6-riscv #視下載后項目文件而定,可能在更多層中
下載好并正確進入OS源代碼所在文件夾后,結構應該為
Ubuntu
20.04 Version
最終環境:QEMU 5.1+, GDB 8.3+, GCC, and Binutils.
安裝指令
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
成功測試
# in the xv6 directory
$ make qemu
# ... lots of output ... 最終顯示
init: starting sh
$
如果沒有成功,可以檢查下面環境
$ qemu-system-riscv64 --version
QEMU emulator version 5.1.0
至少一個以下GCC版本
$ riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc (Debian 10.3.0-8) 10.3.0
...
$ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (GCC) 10.1.0
...
$ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc (GCC) 10.1.0
...
參考MIT2021年官方文檔
6.S081 / Fall 2021
24.04 Version
最終環境:RISC-V versions of QEMU 7.2+, GDB 8.3+, GCC, and Binutils.
安裝指令
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
成功測試
# in the xv6 directory
$ make qemu
# ... lots of output ...
init: starting sh
$
如果沒有成功,可以檢查下面環境
$ qemu-system-riscv64 --version
QEMU emulator version 7.2.0
至少一個以下GCC版本
$ riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc (Debian 10.3.0-8) 10.3.0
...
$ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (GCC) 10.1.0
...
$ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc (GCC) 10.1.0
...
參考MIT2024年官方文檔
6.1810 / Fall 2024
Ubuntu 22.04
有人又要說了,博主博主這不是CV官方文檔嗎。這也可以水一篇博客,強烈譴責!
也有人就要問了,主播主播,20.04和24.04版本的配置環境太沒有含金量了,有沒有什么又沒有什么博客指引,也沒有官方文檔的版本?
有的,兄弟,有的。像這樣的牢版本還有2(jiǔ)個……其中一個便是咱們的22.04,高貴的Jammy玩家
沒有官方文檔?
20年沒有wsl版本,21~23年是20.04的天下,24年終于更新了……是24.04(Jammy玩家懸著的心還是死了)
不過以下指令還是要先執行的
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git build-essential gdb-multiarch binutils-riscv64-linux-gnu
配置大體流程
- 卸載原先qemu
- clone qemu官方源代碼,切換到stable 7.2 version
- configure
- make 并 install
1. 卸載原本qemu(如果之前安裝了)
22.04版本使用 apt install
直接安裝的版本是 6.2.0
由于不知名原因,這個qemu并無法直接使用。會出現執行 make qemu
到一半卡住無反饋的情況
我當時還尋思著怎么啟動個系統這么久……
此時有兩個選擇,一是使用老版本qemu(5.1),二是使用新版本qemu(7.2)。由于官方已更新,所以我們選擇后者。
使用apt移除qemu
sudo apt remove --purge qemu qemu-system qemu-utils qemu-system-* -y
清理殘留文件
sudo apt autoremove -y
sudo apt autoclean
檢查是否仍然存在 QEMU
qemu-system-riscv64 --version
如果命令返回 “command not found”,說明 QEMU 已成功卸載。
2. clone qemu官方源代碼,切換到stable 7.2 version
git clone https://gitlab.com/qemu-project/qemu.git
cd ./qemu
git checkout stable-7.2
注意:這里沒有用到最新版(學都是學最新的,用都是用最老的~~~)
3. configure
cd qemu/
mkdir build
cd build/
../configure --target-list=x86_64-softmmu,riscv64-softmmu --enable-debug
注意這里我們只make了x86_64和riscv-64版本并且之后安裝到/usr/local下。此時調用項目中可執行文件configure為make作準備。
出現 ERROR: Cannot find Ninja
執行命令
sudo apt install ninja-build
出現 ERROR: glib-2.56 gthread-2.0 is required to compile QEMU
執行命令
sudo apt install libglib2.0-dev
之后想要將qemu安裝到/usr而非/usr/local下(不推薦,可能會和系統自帶包管理器相沖突)
將原本configure指令替換為
../configure --target-list=x86_64-softmmu,riscv64-softmmu --enable-debug --prefix=/usr
成功configure之后顯示
后面還有很多參數,沒有截全
4. make 并 install
make -j$(nproc)
sudo make install
make過程可能會持續幾分鐘,因機而異
完成后嘗試
qemu-system-riscv64 --version
如果正常輸出則ok,如果沒有找到則需要將 /usr/local
也添加到 PATH
嘗試
export PATH=/usr/local/bin:$PATHqemu-system-riscv64 --version
如果正常輸出則將該路徑添加到配置文件的PATH中
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
如果,不出意外的話。此時回到 xv6-riscv
目錄便可以執行 make qemu
了
5. 刪除下載的qemu項目
如果之后不打算make
其他架構的硬件模擬,此時便可以把下載的qemu源代碼文件夾刪除了
sudo rm -rf ./qemu
心酸歷程
能不能用24.04的Qemu?
你可真是個小天才,借腹生子是吧!!!
警告:以下命令不要隨便執行
sudo add-apt-repository ppa:jacob/virtualisation -y
sudo apt update
sudo apt install qemu-system-riscv64 -y
運行之后再去試試 make qemu
,結果能執行了!!!然后發現你的 gdb
就神奇的不見了……
原因就是你安裝高版本的 qemu-system
時安裝了覆蓋一些依賴,此時便將沖突的gdb給卸載了。仔細檢查 sudo apt install qemu-system-riscv64 -y
的輸出日志可以發現信息
The following packages will be REMOVED:debhelper debugedit gdb gdb-multiarch ...
sad~~~天地好輪回,蒼天饒過誰
這個教訓告訴我們,以后在看到有哪篇博客里存在指令 apt *** -y
以 -y
結尾,基本可以拖出去斬了(bushi)
后面就因為這個事情導致22.04版本的一些依賴變成了24.04,這個做法實在是個爛主意!
原以為22.04玩家已經是最牢的,沒想到b站上還有更牢的18.04玩家(bushi)
立創泰山派訓練營學習筆記–Ubuntu22.04.4 rootfs根文件系統制作-Linux SDK編譯(二)
更多
三種riscv-gcc的應用場景與區別
編譯器 | 適用場景 | 目標架構 | 典型應用 | 是否支持標準 C 庫 |
---|---|---|---|---|
riscv64-linux-gnu-gcc | Linux 用戶空間 | riscv64-linux-gnu | 編譯 RISC-V Linux 應用程序 | ? (glibc ) |
riscv64-unknown-elf-gcc | 裸機 / RTOS / OS 內核 | riscv64-unknown-elf | 編譯 xv6、U-Boot、裸機程序 | ?(無操作系統支持) |
riscv64-unknown-linux-gnu-gcc | Linux 用戶空間 | riscv64-unknown-linux-gnu | 交叉編譯 Linux 程序(可能使用 musl) | ? (glibc 或 musl ) |
- 如果你在開發 Linux 用戶空間應用(如普通軟件)
→ 用riscv64-linux-gnu-gcc
或riscv64-unknown-linux-gnu-gcc
- 如果你在開發 RISC-V 操作系統或裸機程序(如 Bootloader、xv6)
→ 用riscv64-unknown-elf-gcc
- 如果你不確定,但目標是在 RISC-V Linux 運行
→ 用riscv64-linux-gnu-gcc
能不能在wsl下使用?
riscv64-linux-gnu-gcc
情況:可以編譯成功但是無法執行
這個gcc最終編譯的二進制文件針對的是RISCV架構,所以無法在一般的x86-64架構上直接執行。而xv6-riscv是通過qemu模擬riscv硬件才能夠執行
riscv64-unknown-elf-gcc
情況:連編譯都編譯不過去了
riscv64-unknown-elf-gcc
針對的是裸機環境,那么包沒有 <stdoi.h>
的。所以確實無法編譯
riscv64-unknown-linux-gnu-gcc
沒下……
配置環境項講解
MIT的 apt-get install
命令安裝了以下幾個關鍵的軟件包,主要用于在 WSL2 的 Ubuntu 22.04 上配置 xv6(一個 RISC-V 架構的類 Unix 操作系統)的開發和調試環境。
1. git
- 作用:Git 版本控制系統,用于下載 xv6 源碼,并進行代碼管理(如克隆、提交和更新)。
- xv6 相關性:從 GitHub 上克隆 xv6 源代碼,例如:
git clone https://github.com/mit-pdos/xv6-riscv.git
2. build-essential
- 作用:提供了一組基本的編譯工具,包括
gcc
、g++
、make
等。 - xv6 相關性:
- xv6 使用
make
進行編譯,依賴gcc
進行 C 語言編譯。 build-essential
里包含make
,而 xv6 的 Makefile 需要make
來組織編譯流程。
- xv6 使用
3. gdb-multiarch
- 作用:支持多架構的 GNU 調試器(GDB),可用于調試不同 CPU 指令集(如 x86、ARM、RISC-V 等)的程序。
- xv6 相關性:
- xv6 運行在 RISC-V 上,因此需要一個支持 RISC-V 的 GDB 進行調試。
- 可以用它遠程調試 QEMU 模擬器運行的 xv6:
gdb-multiarch (gdb) target remote localhost:1234
4. qemu-system-misc
- 作用:QEMU 是一個通用的CPU 模擬器,
qemu-system-misc
包含對多個架構的 QEMU 模擬支持。 - xv6 相關性:
- xv6 需要 QEMU 來模擬 RISC-V 硬件環境。
- 通常用如下命令運行 xv6:
make qemu
5. gcc-riscv64-linux-gnu
- 作用:RISC-V 交叉編譯器,可以編譯 RISC-V 目標平臺的代碼。
- xv6 相關性:
- xv6 運行在 RISC-V 上,而你的開發環境是 x86_64,因此需要交叉編譯器編譯 RISC-V 代碼。
- 可以用它手動編譯 xv6 代碼:
riscv64-linux-gnu-gcc -o hello hello.c
6. binutils-riscv64-linux-gnu
- 作用:RISC-V 目標平臺的 GNU binutils 工具集,包括
as
(匯編器)、ld
(鏈接器)等。 - xv6 相關性:
- xv6 需要
as
來編譯匯編代碼。 ld
用于鏈接最終的 xv6 可執行文件。
- xv6 需要
總結
軟件包 | 作用 | 在 xv6 中的用途 |
---|---|---|
git | 版本控制 | 克隆 xv6 源碼 |
build-essential | C/C++ 編譯工具 | 編譯 xv6 |
gdb-multiarch | 多架構調試 | 調試 xv6 |
qemu-system-misc | CPU 模擬器 | 運行 xv6 |
gcc-riscv64-linux-gnu | 交叉編譯 | 編譯 RISC-V 代碼 |
binutils-riscv64-linux-gnu | 匯編/鏈接工具 | 處理 RISC-V 匯編和鏈接 |
自己安裝的qemu和apt安裝的有什么區別
1. 版本差異
apt 安裝:Ubuntu 官方軟件源提供的 QEMU 可能是穩定版,但版本較老/或太新,可能缺少一些新功能或優化。
自己編譯:可以選擇最新的源碼,獲取最新功能、修復的 bug 和性能優化。
2. 編譯選項
apt 安裝:使用的是 Ubuntu 維護者編譯的二進制文件,默認開啟了一些常見的功能,但可能未啟用所有選項。
自己編譯:可以根據需求啟用或禁用特定功能,例如:
- 僅編譯支持特定架構(如
--target-list=riscv64-softmmu
) - 選擇特定的加速選項(如
--enable-kvm
、--enable-tcg
) - 進行特定優化(如
--enable-lto
進行鏈接時優化)
3. 安裝路徑
apt 安裝:QEMU 會被安裝到系統路徑(如 /usr/bin/qemu-system-*
)
自己編譯:
默認安裝在 ·/usr/local/bin·,不會影響系統自帶的 QEMU
可以自定義安裝路徑(如 ./configure --prefix=/opt/qemu
)
安裝路徑在 configure
之后的報告里有,如果保存了源代碼build文件夾還可以執行 sudo make uninstall
進行卸載
4. 依賴管理
apt 安裝:自動處理依賴關系,安裝/卸載時不容易出問題。
自己編譯:需要手動安裝依賴(如 libglib2.0-dev、libpixman-1-dev),可能會遇到缺少庫或不兼容的問題。
5. 更新與維護
apt 安裝:系統更新時可以自動升級(sudo apt upgrade
)。
自己編譯:需要手動拉取源碼并重新編譯安裝,維護成本更高。
6. 兼容性
apt 安裝:官方軟件源提供的版本經過測試,與 Ubuntu 其他軟件兼容性較好。
自己編譯:如果使用了非官方補丁或特定配置,可能會遇到不兼容問題,例如影響 gdb、libvirt、kvm 相關組件的使用。