- RISC-V體系結構編程與實踐(第2版)
- 笨叔
- 1226字
- 2024-09-23 17:56:00
2.2 搭建實驗環境
2.2.1 實驗2-1:輸出“Welcome to RISC-V!”
1.實驗目的
了解并熟悉如何在NEMU和QEMU模擬器上運行最簡單的BenOS程序。
2.實驗詳解
在Linux主機中安裝相關工具。
$ sudo apt-get install qemu-system-misc libncurses5-dev gcc-riscv64-linux-gnu build-essential git bison flex libssl-dev
(1)在QEMU上運行BenOS
在Linux主機上使用make命令編譯BenOS[1]。
[1]請參考“本書約定”一章獲取下載配套參考代碼的方法。
$ cd riscv_programming_practice/chapter_2/benos
$ export board=qemu
$ make clean
$ make
CC build_src/uart_c.o
CC build_src/kernel_c.o
AS build_src/boot_s.o
LD build_src/benos.elf
OBJCOPY benos.bin
CC build_sbi/sbi_main_c.o
AS build_sbi/sbi_boot_s.o
AS build_sbi/sbi_payload_s.o
LD build_sbi/mysbi.elf
OBJCOPY mysbi.bin
LD build_sbi/benos_payload.elf
OBJCOPY benos_payload.bin
要想編譯能在QEMU模擬器[2]上運行的可執行二進制文件,需要先設置board=qemu。
[2]本書使用的QEMU版本默認為Ubuntu 20.04自帶的版本(4.2.1),如讀者使用高版本QEMU時遇到問題,請參考本章實驗代碼中的說明文件:riscv_programming_practice/chapter_2/必讀.txt。
直接輸入make run命令并運行。
rlk@master:benos$ make run
qemu-system-riscv64 -nographic -machine virt -m 128M -bios mysbi.bin -kernel benos.elf
Welcome RISC-V!
QEMU輸出“Welcome RISC-V!”。要關閉QEMU,可以先按 “Ctrl +A”鍵,松開,再快速按 “X”鍵。
(2)在NEMU上運行BenOS
在Linux主機上使用make命令編譯BenOS。
$ cd riscv_programming_practice/chapter_2/benos
$ export board=nemu
$ make clean
$ make
CC build_src/uart_c.o
CC build_src/kernel_c.o
AS build_src/boot_s.o
LD build_src/benos.elf
OBJCOPY benos.bin
CC build_sbi/sbi_main_c.o
AS build_sbi/sbi_boot_s.o
AS build_sbi/sbi_payload_s.o
LD build_sbi/mysbi.elf
OBJCOPY mysbi.bin
LD build_sbi/benos_payload.elf
OBJCOPY benos_payload.bin
要想編譯能在NEMU模擬器上運行的可執行二進制文件,需要先設置board=nemu。如果想查看更多編譯日志,可以使用make V=1命令。編譯完成之后會生成以下5個文件。
● benos.bin:BenOS可執行文件。
● benos.elf:BenOS帶調試信息的可執行與可鏈接格式(Executable and Linkable Format,ELF)文件。
● mysbi.bin:MySBI固件的可執行文件。
● mysbi.elf:MySBI帶調試信息的ELF文件。
● benos_payload.bin:把benos.bin和mysbi.bin整合到一個可執行二進制文件中。
直接輸入make run命令并運行。
rlk@master:benos$ make run
riscv64-nemu-interpreter -b benos_payload.bin
Welcome to riscv64-NEMU!
For help, type "help"
Welcome RISC-V!
NEMU輸出“Welcome RISC-V!”,如圖2.1所示。

圖2.1 NEMU的輸出結果
2.2.2 實驗2-2:單步調試BenOS和MySBI
本小節提供兩種單步調試BenOS和MySBI的方法。一種是使用QEMU與GDB工具,另一種是使用NEMU內置的單步調試功能。
1.使用QEMU與GDB工具
以實驗2-1為例,使用make debug命令在終端啟動QEMU虛擬機的gdbserver。
$ cd riscv_programming_practice/chapter_2/benos
$ make debug
或者直接使用如下命令啟動gdbserver。
$ qemu-system-riscv64 -nographic -machine virt -m 128M -bios mysbi.bin -kernel benos.elf -S -s
在另一個終端使用如下命令啟動GDB工具。
$ gdb-multiarch --tui benos.elf
在GDB命令行中執行如下命令。
(gdb) target remote localhost:1234
(gdb) b _start
Breakpoint 1 at 0x80200000: file src/boot.S, line 6.
(gdb) c
此時,使用GDB工具單步調試BenOS,如圖2.2所示。

圖2.2 使用GDB工具單步調試BenOS
另外,也可以通過GDB工具調試MySBI固件。為了在終端啟動QEMU虛擬機的gdbserver,使用make debug命令。
$ cd riscv_programming_practice/chapter_2/benos
$ make debug
在另一個終端使用如下命令啟動GDB工具,這時候需要加載MySBI固件的ELF文件。
$ gdb-multiarch --tui mysbi.elf
在GDB命令行中執行如下命令。
(gdb) target remote localhost:1234
(gdb) b _start
Breakpoint 1 at 0x80000000: file sbi/sbi_boot.S, line 6.
(gdb) c
此時,使用GDB工具進行單步調試,如圖2.3所示。

圖2.3 單步調試
2.NEMU內置的單步調試功能
NEMU內置了簡易調試器(Simple Debugger,SDB)。SDB是NEMU中一個非常重要的基礎設施,可以獲取程序的執行信息,以協助調試。SDB支持的命令如表2.4所示。
表2.4 SDB支持的命令

在Linux主機終端,使用make debug命令啟動SDB。
$ cd riscv_programming_practice/chapter_2/benos
$ make debug
riscv64-nemu-interpreter benos_payload.bin
Welcome to riscv64-NEMU!
For help, type "help"
(nemu)
在SDB命令行中輸入“help”,查看幫助信息,如圖2.4所示。

圖2.4 查看幫助信息
輸入“si”,進行單步調試,如圖2.5所示。

圖2.5 進行單步調試
另外,還可以通過監視點命令設置斷點,不過目前只支持為地址設置斷點。例如,在0x8020 0000地址處設置斷點。
$ make debug
(nemu) w $pc==0x80200000 //設置斷點
Set watchpoint #0
(nemu) c //繼續執行,此時NEMU停在斷點處
Hint watchpoint 0 at address 0x00000000800000a8, expr = $pc==0x80200000
old value = 0x0000000000000000
new value = 0x0000000000000001
(nemu) si //單步執行
0x0000000080200000: 73 10 40 10 csrrw $0,0x104,$0
Hint watchpoint 0 at address 0x0000000080200000, expr = $pc==0x80200000
old value = 0x0000000000000001
new value = 0x0000000000000000
- Xcode 7 Essentials(Second Edition)
- Learning Hunk
- Asynchronous Android Programming(Second Edition)
- C#應用程序設計教程
- Bootstrap 4 Cookbook
- Java Web開發就該這樣學
- Learning Unreal Engine Android Game Development
- Python+Tableau數據可視化之美
- Python函數式編程(第2版)
- Unity 5.X從入門到精通
- Node.js 6.x Blueprints
- Isomorphic Go
- 精益軟件開發管理之道
- Mastering Machine Learning with scikit-learn
- Linux Networking Cookbook