官术网_书友最值得收藏!

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
主站蜘蛛池模板: 彭阳县| 金寨县| 赤水市| 四会市| 图木舒克市| 水城县| 聂荣县| 瑞丽市| 安塞县| 哈尔滨市| 治县。| 柞水县| 平利县| 札达县| 衡阳县| 柏乡县| 望城县| 印江| 徐闻县| 社会| 吉隆县| 会同县| 综艺| 两当县| 黄冈市| 阿瓦提县| 安溪县| 博湖县| 宜阳县| 会宁县| 遵义县| 蛟河市| 神农架林区| 威宁| 南昌市| 股票| 康平县| 玉林市| 辰溪县| 于田县| 晋江市|