gdb 调试 RISC-V
? ? ? 優秀的產品需要有高效的調試手段,RISC-V的工具鏈中提供GDB。 使得切換到RISCV后,底軟和內核工程師的工作效率不受損害。
? ? ? 我們使用一個有趣的程序來嘗試gdb調試的效果。源文件 rot13.c 和 鏈接描述文件spike.lds如下
rot13.c 中,通過變量wait的值,控制程序進入不同階段:
? ? ? ? 階段1: 程序因為 0 == wait, 停留在一個死循環里面。在后面的gdb調試中,我們可以看到通過修改變量wait的值,控制程序進入下一個階段。
? ? ? ? 階段2: 程序執行簡單的“解密”運算,將初始化的“密文”解析為“明文”。在gdb中,我們將看到RISC-V demo 作者想告訴我們的信息。
? ? ? ? 階段3: 程序結束。
? ? ? ??
/* file name: rot13.c */ char text[] = "Vafgehpgvba frgf jnag gb or serr!";// Don't use the stack, because sp isn't set up. volatile int wait = 1;int main() {while (wait);// Doesn't actually go on the stack, because there are lots of GPRs.int i = 0;while (text[i]) {char lower = text[i] | 32;if (lower >= 'a' && lower <= 'm')text[i] += 13;else if (lower > 'm' && lower <= 'z')text[i] -= 13;i++;}done:while (!wait); } /* spike.lds */OUTPUT_ARCH( "riscv" )SECTIONS {. = 0x10010000;.text : { *(.text) }.data : { *(.data) } }1.Build
? ?源碼Build 命令如下
$ riscv64-unknown-elf-gcc -g -Og -o rot13-64.o -c rot13.c $ riscv64-unknown-elf-gcc -g -Og -T spike.lds -nostartfiles -o rot13-64 rot13-64.o2.調試
? ? 2.1 在spike(riscv-isa-sim)上運行程序rot13-64,在9824端口打開調試通道。
? ?2.2? 使用openocd 創建一個gdb調試的server, 通過9824端口連接到spike上的riscv實例,并在3333端口等待gdb的連接。
/*spike.cfg*/interface remote_bitbang remote_bitbang_host localhost remote_bitbang_port 9824set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913set _TARGETNAME $_CHIPNAME.cpu target create $_TARGETNAME riscv -chain-position $_TARGETNAMEgdb_report_data_abort enableinit halt? ?2.3 使用配套的riscv gdb工具進行調試。最終我們得到了demo 作者告訴我們的秘密
? ? ? ? “Instrcution sets want to be free!”
?
總結
以上是生活随笔為你收集整理的gdb 调试 RISC-V的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive正则表达式反向引用
- 下一篇: Linux配置本机ssh免登陆(解决启动