龙芯ejtag 单步调试pmon
一、概述
1、硬件环境
mips版本龙芯派板卡、ejtag、串口线、12V电源
备注:ejtag链接 小三角对应1脚
2、软件环境
龙芯派pmon源码、ejtag软件、minicom
二、更新pmon
-
编译龙芯派pmon源码
-
更新pmon
此处不会可以参考:龙芯派教学 -
ejtag单步调试时会用到两个文件
a、zloader.ls2k/gzrom
b、Targets/LS2K/compile/ls2k/pmon.gdb
备注:两个文件均在编译好的pmon源码内
三、ejtag中用到的命令
-
硬件指令断点
设置软件指令断点到addr: hb addr [ibm]
删除addr上的指令断点: unhb addr [ibm]
查看断点: hbls -
单步调试
单步count次: si [count]
取消单步: unsi -
暂定
停住CPU命令:set -
继续执行
继续执行命令:cont
四、pmon汇编代码 ejtag单步调试
- 板卡先断电
- 链接ejta、串口
- 打开串口,波特率112500
- 打开ejtag软件sudo ./ejtag_debug_usb -t
a、执行:source configs/config.ls2k
b、执行:loop -1 stop
c、板卡上电 (龙芯派上电后,需要按下开机按钮)
d、执行:ctrl + c (目的打断loop -1 stop)
e、执行:set
备注:执行set后,可以看到 pc 值是0xffffffffbfc00004。龙芯处理器起始地址是:0xbfc00000
对pmon启动流程不熟悉的同学可以参考:龙芯pmon启动流程概述
- 反汇编 gzrom
mipsel-linux-objdump -d zloader.ls2k/gzrom > 1.log
文件1.log 里为gzrom的反汇编代码
- 打硬件断点,locate标志处
a、通过Targets/LS2K/ls2k/start.S 与 1.log 查找locate标志地址为:8f900fdc
b、硬件断点操作: hb 0xffffffffbfc00fdc
图执行流程为:打断点hb、查看断点hbls、cont、set、取消断点、查看断点hbls
通过set显示内容可知,pc已经停止到0xffffffffbfc00fdc
- 将pc停止到第一条打印处
打印处地址:0xffffffffbfc015b4
打印断点 hb 0xffffffffbfc015b4
- 单步执行1000条命令
执行:si 1000
串口输出第一条打印数据PRINTSTR(“\r\ninitserial good _…\r\n”)
五、查看pmon启动过程中三次地址变换
备注:此处内容不做过多讲解,感兴趣的同学可以自行学习
第一次地址变化
地址从0xffffffffbfcxxxxx 变为 0xffffffff9fcxxxxx
第二次地址变化
地址从0xffffffff9fcxxxxx 变为 0xffffffff8f9xxxxx
第三次地址变化
地址从0xffffffff8f9xxxxx 变为 0xffffffff8f0xxxxx
六、pmon C语言代码 ejtag单步调试
1、找 C 函数入口地址
==反汇编 pmon==
mipsel-linux-objdump -d Targets/LS2K/compile/ls2k/pmon > 2.log
C入口函数在Targets/LS2K/ls2k/tgt_machdep.c 定义,函数是:void initmips(unsigned long long raw_memsz)
2、将pc停止到C入口函数地址
备注:建议断电重新操作
串口停在位置如下:
3、ejtag内gdb调试pmon.gdb
查看代码
打函数断点,并执行到该断点处
例子1:
a、dbginit(NULL)函数调用地方:
b、dbginit(NULL)函数内容:
c、打dbginit(NULL)函数断点,并执行到该断点处
d、串口输出内容
4、gdb 基础命令
命令 | 简写 | 格式 | 说明 |
---|---|---|---|
list | l | list n1 n2 | 显示 n1 行和 n2 行之间的代码,参数缺省时显示默认后 10 行 |
next | n | next n | 执行 n 行代码,如果是函数也会跳过函数。参数缺省时,执行一行 |
step | s | step | 执行一行代码,遇到函数的话就会进入函数的内部 |
finish | finish | 运行程序,直到当前函数运行完毕返回再停止 | |
break | b | break x | 当 x 为数字时,设置当前文件第 x 行为断点,x 为某函数名时,则在该函数处设置断点 |
delete | delete n | 删除 n 号断点,参数缺省时,删除所有断点 | |
continue | c | continue | 继续运行程序直接运行到下一个断点 |
info | info break | 显示所有断点号 | |
p | print var | 显示变量(var)值 | |
clear | clear n | 清除行 n 上面的所有断点 |