140 likes | 278 Views
清华大学综合论文训练答辩. 题目:基于 EJTAG 的交叉调试器开发 报告人:葛宏 项目合作成员:苏宏谋、鄂威 指导教师:田金兰、王生原. 背 景. 交叉调试器是一种分布式的系统。调试器运行在宿主机端,而被调试的可执行代码运行在目标机端,宿主机和目标机使用某种通信协议进行通信。 基于 EJTAG 的交叉调试器是 CPU 项目的一个组成部分,目的是在监控程序、操作系统的移植过程中提供调试功能。 基于 EJTAG 的交叉调试器的开发工作分两步进行。第一步,实现一个汇编级的交叉调试器;第二步,实现一个高级语言级的交叉调试器。. 主要工作. 了解交叉调试器的发展现状
E N D
清华大学综合论文训练答辩 题目:基于EJTAG的交叉调试器开发 报告人:葛宏 项目合作成员:苏宏谋、鄂威 指导教师:田金兰、王生原
背 景 • 交叉调试器是一种分布式的系统。调试器运行在宿主机端,而被调试的可执行代码运行在目标机端,宿主机和目标机使用某种通信协议进行通信。 • 基于EJTAG的交叉调试器是CPU项目的一个组成部分,目的是在监控程序、操作系统的移植过程中提供调试功能。 • 基于EJTAG的交叉调试器的开发工作分两步进行。第一步,实现一个汇编级的交叉调试器;第二步,实现一个高级语言级的交叉调试器。
主要工作 • 了解交叉调试器的发展现状 • 深入研究EJTAG规范 • 设计并实现基于EJTAG的汇编级交叉调试器的EJTAG模块部分 • 设计基于EJTAG的高级语言级交叉调试器 • 总结目前的工作,并提出下一步的方案
0xBFC0 0480, 执行固定的例外处理指令 ProbTrap=0 EJTAGBrk=1, 触发debug例外 PC = 0xFF20 0200 dmseg内 PC -> Address ProbTrap=1 处理器设置PrAcc=1; PRnW=0;Psz[1:0]=xx; 测试PrAcc 选择Address, 移出其内容 检测PrAcc=1 (3) 选择Data, 移入对应Address的指令 PrAcc=0 执行指令,PC+=4 (2) (1) EJTAG调试的流程
EJTAG调试的流程 • Load类指令用于处理器外部到处理器内部的数据传输。如果读入的指令是Load类指令,比如LW,LH,LB.而且地址在dmseg范围里,则: • PC值变为load指令的操作数地址 • 移入的是期望的数据 • 由于延迟槽的存在,需要检测Address地址的值以判断是否是load指令的操作数地址 • Store类指令用于处理器内部到处理器外部的数据传输。如果读入的指令是Store类指令,比如SW,SH,SB.而且地址在dmseg范围里,则: • PC值变为store指令的操作数地址 • 移出期望得到的数据 • 由于延迟槽的存在,需要检测Address地址的值以判断是否是store指令的操作数地址
1.1 HCI(人机界面) 调试请求 调试响应 1.2调试命令打包 及响应的处理 Debugger Command Request GDB Remote serial protocol Responce 2.1调试命令解包、处理及响应的返回 调试请求 调试响应 2.2 EJTAG信号的发出/接收 TCK, TMS, TDI TRST* TDO Board 基于EJTAG的汇编级调试器
基于EJTAG的汇编级调试器 • 1. 断点管理(指令执行+数据读写) • Add增加断点 • Remove删除断点 • List列出断点 • 2. 信息 • 寄存器 查看所有寄存器的内容(通用+CP0) • 内存 查看指定地址的内存数据 • 3. 执行 • 单步 • 多步(在单步的基础上扩充) • 连续(到断点处停止) • 4. 装入目标代码 • 向目标机装入目标代码
遇到的困难和解决 • EJTAG方案的选择 • 将所有要读写的寄存器串联的方案 优点:软件和硬件实现比较容易 缺点:对CPU硬件实现和性能开销大 • TAP使用外部微处理器实现 优点:不增加CPU的工作量 缺点:要在开发板上实现TAP,不符合EJTAG规范 • TAP在CPU内部实现 优点:符合EJTAG规范,对开发板只需要增加从CPU引 出4根信号线 缺点:增加CPU的工作量
遇到的困难和解决 • 现场保存的问题 由于MIPS指令集的load, store指令都需要一个寄存器作为基址寄存器,因此,为了在EJTAG调试的过程中不破坏寄存器现场,必须有一个不用的空闲寄存器用来存放这个基址寄存器的值,以便在调试结束后恢复基址寄存器。 • 利用某个被调试程序中不用的空闲通用寄存器 • 利用CP0寄存器中的DESAVE寄存器 • 延迟槽对Load-Store指令的影响 Load-Store指令分两拍进行。第一拍,取指令并分析。第二拍,将指定地址的数据装入寄存器/将寄存器的数据装入指定地址。由于延迟槽的存在,这两拍中间会有间隙。 • 插入nop指令,检测Address寄存器 • 死循环 上述操作有可能陷入死循环 • 循环一定次数不成功,则重新进行Load-Store操作。重复若干次不成功,则Load-Store失败,退出调试过程
基于EJTAG的高级语言级调试器 • 体系结构和基于EJTAG的汇编级调试器基本相同,差别主要在对调试命令的处理部分。 • 我负责的EJTAG处理部分基本不需要改动,只需改动I/O模块即可
未来工作展望 • 基于GDB的支持EJTAG的交叉调试器 • 操作系统调试器 KDB和KGDB的研究和应用。
衷心感谢 田金兰老师 王生原老师 苏宏谋师兄 鄂威同学 教研组其他的老师和同学