基于动态二进制翻译优化的间接调试器设计.doc_第1页
基于动态二进制翻译优化的间接调试器设计.doc_第2页
基于动态二进制翻译优化的间接调试器设计.doc_第3页
基于动态二进制翻译优化的间接调试器设计.doc_第4页
基于动态二进制翻译优化的间接调试器设计.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于动态二进制翻译优化的间接调试器设计郭惠芳摘要:在实现自主研发的系统级仿真平台时,为了提高系统仿真平台的运行效率使用了各种动态二进制翻译优化策略,而这些优化策略给间接调试器的各种功能实现带来了困难,另一方面,对于系统级程序的间接调试,调试时的实现效率也是需要考虑的,本文提出了在动态二进制翻译优化策略下各种基本调试功能的实现方法,基本不影响调试时运行效率的情况下,解决了时钟中断处理对单步调试的影响,实现了翻译代码缓存块中断点的判定。关键词:动态二进制翻译;调试器;间接调试代理;翻译代码缓冲;翻译代码块链The Design of Indirect Debugger Based on Dynamic Binary Translation and optimizationGUO Hui-Fang, JIANG Lie-Hui, DONG Wei-Yu, HE Hong-Qi, CHANG Rui(PLA Information Engineering University, Zhengzhou Henan 450002 , China) 【Abstract】In order to improve the performance of the system emulator we designed by ourselves, We used some optimization methods of dynamic binary translation in our emulator. However, these optimization methods caused some implementation of indirect debugger functions difficult. In addition, it is important for a system emulator to realize an effective debugger. The paper presents an implementation of the basic debug function based the optimization of the dynamic binary translation. We remove the side-effect of time interrupt from the procedure of single step debugging and complete interruption determination in the translation code cache without conspicuous performance decline.【Keywords】Dynamic binary translation; Debugger; Indirect debugging agency; Translation code cache; Translation code block chain1. 引言系统级仿真平台是在一个系统结构上用软件实现了另一个系统结构,并且在其上可运行另一个结构的操作系统及各种应用,前者称为宿主机,后者称为虚拟机或客户机。它在系统软件的调试、分析以及在异构结构上设计、调试软件等领域有着广泛的应用1。开发一个系统级仿真平台不仅需要本地的调试工具的支持,还需要有调试客户机上操作系统及应用程序的间接调试工具。它不仅在仿真平台的开发阶段用于发现仿真器本身的缺陷,而且也用于对仿真平台上运行的应用程序进行调试。现有的基于动态二进制翻译技术的系统仿真器都提供了一定的调试支持,Tdb为动态翻译程序提供了一个源代码级调试器2,Qemu实现了GDB的基本调试协议3,Dynamo和DynamoRIO实现了一个底层调试支持4,它们仅适用于它们自身的平台,大部分系统仅是应用级的仿真5,6,7,部分系统仅支持源代码级的调试2,或使用中间代码的结构实现8,9,为了探索国产系统上系统级仿真器更为高效的实现方法,我们自主研发了一个由x86至一款国产CPU的系统级仿真器10,11,在其上我们实现了基于各种动态二进制翻译优化策略的间接调试框架,为了兼顾运行效率和功能两方面的要求,在开发系统级仿真器的调试框架需要解决下面几个问题。首先,通过什么机制使系统级仿真器能够在控制其上程序运行过程中去响应调试器的命令?其次,为了加快源代码向目标代码翻译的过程,我们实现了翻译的目标代码缓存机制,这种情况下如何实现断点的识别及控制?再者,对于系统级仿真器来说,时钟中断的处理程序也是通过动态翻译后执行的,这时如果需要使用单步调试客户机上的系统程序,如何避免进入时钟中断处理程序的单步执行?最后,如果使用块链优化技术后,如何处理断点的检查? 2. 动态二进制翻译器的实现机制我们的系统级仿真器由初始化、动态二进制翻译器、内存虚拟化及I/O仿真等四部分组成。其中动态二进制翻译器部分与间接调试代理的设计相关,下面简要介绍这部分的实现机制。它以基本块为翻译单位,支持翻译代码缓存,主要由几个步骤构成:1) 异常检测与派发:执行过程中异常的指令会设置虚拟处理器内部的标志,动态二进制翻译器将检测该标志以判明处理器是否发生了异常。若发生异常,将按照x86处理器的工作方式递交、并处理异常。仿真平台与间接调试器之间的通信要借助于这个机制将断点异常和单步异常传递出来并进行处理。2) TB-CACHE查找:根据即将执行的客户机的PC地址,查找TB-CACHE,以确定基本块是否已经被翻译。若命中,则直接执行TB-CACHE中的翻译块,否则对基本块进行译码、翻译。这个过程对于间接调试有比较大的影响,需要特别处理。3) 译码:逐个提取基本块中指令的信息,识别出指令的操作,寻址方式等信息,若指令的操作为转移类型时,结束基本块。4) 翻译:根据译码步骤提供的信息,逐个将基本块中的指令翻译为目标指令流,并将翻译块加入TB-CACHE。5) 翻译代码块的执行:执行翻译块。6) 再返回步骤1。3. 间接调试代理的设计实现间接调试的系统一般由三部分组成:本地调试器(我们使用了GDB),系统级仿真平台中的调试代理(STUB),以及远程调试协议。这三部分与系统级仿真平台的关系如图1所示。图 1 系统结构仿真平台中远程调试通信模式在系统级仿真平台上设计一个间接调试代理,调试代理通过特定网络协议端口与本地调试工具(GDB)通信,将调试工具发来的有关请求进行处理,并将相应的信息返回给调试工具,调试工具再将这些信息进行组织并呈现给调试用户,通过这种间接手段完成对系统级仿真平台上运行的软件的调试。GDB定义了一个远程调试协议的接口,我们使用这个接口设计了系统中的调试代理。3.1间接调试的运行机制下面首先解决引言中提出的第一个问题,即如何让系统级仿真平台在控制运行客户机系统程序过程中来响应来自网络端口的调试命令。在初始化过程中初始化一个字符设备及其对应的读、写函数,用于向UDP端口接收和发送数据。开始时,命令行参数-dbg(用于控制进入间接调试的运行状态)使客户机的运行状态为0,等待调试器通过网络端口发送来命令(可能是设置断点,或继续运行),这时系统仿真平台的二进制翻译器一直处于循环检测,是否有I/O事件发生,如果有就处理,否则继续循环。然后,一旦检测到通过UDP端口发来的命令包,仿真平台进行解析,对相应的命令进行处理(向调试器),并相应设置客户机运行状态为0或1,当客户机继续运行后,遇到断点或单步则产生异常,并在基本块边界上对异常进行处理。图 2 GDB调试代理结构框图系统级仿真平台上的调试代理的结构框图如图2所示,我们主要实现了收包、发包、从缓冲区中读字节并处理、接收到完整的调试命令时,对它进行处理等模块。其中读取GDB发来的包并作处理的流程如图3所示。图 3 GDB 调试代理对GDB发送的信息的处理流程图3中的包处理函数对各种字符开头的命令进行相应处理,如果调试器用户发出继续运行的命令(continue),则调试代理将接收到一个以“c”开始的包,其处理过程是,首先查看其后是否有地址参数,如果有,就读入并设置系统仿真平台上运行的虚拟(客户)处理器的EIP为该地址,设置处理器运行标记为1,使其可以继续运行直到断点或单步点。如果用户发送来的命令为单步运行的命令,则调试代理会接收到“s”开头的命令,处理过程如下:如果后面有地址参数,设置虚拟处理器运行的EIP为该地址,设置单步标记,然后设置虚拟处理器运行标记为1,使其能够继续运行。如果用户设置断点,则调试代理将接收到“Z”开头的包,将其后的地址参数读入,并将它插入断点结构链表中进行管理,如果用户想删除断点,则调试代理将接收到“z”开头的包,将其后的地址参数读入,并将它从断点链表中删除。对“g”和“m”开头的包的处理依赖各处理器结构特点组织寄存器组内容或内存单元内容。这所有包的处理中,只有c和s两种包处理完毕后,使虚拟处理器继续运行,其余的命令继续等待远程GDB发来更多的命令,即不设置虚拟处理器的运行标记为1。3.2翻译缓冲对单步与断点处理的影响及解决为了解决引言中的第二个问题,我们定义了一个专门的标记来记录客户机单步运行的状态,当间接调试代理处理“s”命令(单步)时,设置该标记,在系统仿真平台上翻译运行虚拟机上的程序时检查该标记,如果它被置位,则设置基本块大小为一条指令,这样才能及时从翻译引擎中退出来,与GDB进行交互。如果客户机处于单步运行状态,翻译缓冲优化暂时被屏蔽,因为单条指令的翻译没有必要进行缓冲,对翻译缓冲的查找开销并不比翻译单条指令的开销更小。更何况,翻译缓存的空间有限,而单步调试状态都是短时间的,不具有太多的代码重用价值。在系统仿真器上调试操作系统或其它客户机应用时,单步调试会受到时钟中断的影响,用户在系统仿真平台上调试客户机的操作系统时,肯定不愿看到频繁落入时钟中断处理程序中,在那里没完没了地进行单步翻译、运行。从实用的角度出发,我们在翻译引擎中将这种频繁发生的中断处理识别出来,并暂时屏蔽单步控制,直到退出这种中断处理程序,这样就解决了引言中的第三个问题。对于断点的处理,我们不能将翻译代码缓冲这种优化进行屏蔽,因为断点设置完成后,可能需要运行很长时间才到达断点处,如果不使用翻译代码缓冲的优化方法,系统仿真器的运行效率非常低,对于非基本块边界上的断点,我们需要对翻译代码缓冲块内的源指令地址进行缓存,以备进行断点检测。我们建立了一个断点循环链表,每设置一个断点就插入一个结点到该链表中,删除一个就从该链表中删除相应结点。断点的设置与删除是在GDB STUB接收到“Z”和“z”命令时处理的,在系统级仿真平台上翻译运行虚拟(客户)机上的软件时,如果首次遇到该断点,在客户机指令进行解码时进行断点的判断,按照惯例,断点是断在断点之前,如果在解码阶段进行判断,可能会使断点断在断点指令之后,需要作一些处理,才能将基本块断在断点指令之前。如果断点处于翻译代码缓冲块内部,那么在查找目标代码缓冲块命中时,应该对其中的每条指令地址与断点进行比对,如果发现断点,需要停止使用该缓冲块,而是采用重新对该基本块进行译码,以便从断点处生成新的基本块,并断在该断点指令之前。4. 进一步工作在系统级仿真平台中,为了加快虚拟机上软件的翻译、运行,不仅对翻译后的基本块的目标代码进行了缓存,而且将相邻的目标代码块进行了链接,形成块链,每次都首先在该缓冲区中查找,如果在该缓冲区中存在,则直接取出运行,并且在基本块边界上不再进行上下文切换,进一步加快了客户机程序的运行。但这一优化措施,给调试断点的判断带来了困难,这就是引言中提出的第四个问题。一般情况下,断点的设置位于首次运行该代码之前,这时没有问题,因为首次遇到该代码时会经历译码、翻译过程,是可以正常捕获断点,但如果紧接着翻译后的代码进行块链链接后,再次遇到该断点时,就不好判断了,这种情况,我们通过在首次发现该断点时,将该基本块标志为块链结束,这样既保证了大部分代码可以形成块链加快翻译运行,又无需增加在块链中查找断点的开销,同时还保证了断点的及时检测与处理。但如果断点的设置是在相应目标代码的块链已经形成并且缓存,这时是很难捕获的。如果在已形成块链的目标代码中检测断点,必将对系统效率造成比较大的影响。对这种情况的处理在现有文献中还未有说明12,13,14,15,我们的处理方法是依赖在块链形成之前进行标志。5. 总结在系统级仿真平台中设计了间接调试模块后,调试虚拟机上的操作系统就无需在超长的日志文件中寻找调试信息了,直接设置地址就可中断在任意一个地方,再使用单步运行模式就可以发现在虚拟机上运行的软件或仿真软件本身的bug所在了,在我们的系统级仿真平台上进行间接调试,比如设置断点,增加的运行时间开销几乎察觉不到。在调试过程中,虚拟机的系统结构如果与运行GDB的机器的系统结构不一致,可能会出现一些小的问题:GDB在解析调试代理发过来的机器运行时状态信息时,显示的名字和顺序会不对,在查看某地址开始的反汇编指令流时,GDB对指令流的反汇编也会出错,这是因为GDB实现反汇编与特定的系统结构是相关的。参考文献1 Erik R. Altman, David Kaeli and Yaron Sheffer, Welcome to the Opportunities of Binary TranslationJ. Computer, 2000, 33(3): 40-45.2 Naveen Kumar, Bruce R. Childers, Mary Lou Soffa, Tdb: A Source-lever Debugger for Kynamically Translated ProgramsC, AADEBUG 05, 2005.3 Fabrice Bellard. QEMU, a Fast and Portable Dynamic TranslatorC. In Proceedings of the FREENIX Track: 2005 USENIX Annual Technical Conference, 2005: 41-46.4 Vasanth Bala, Evelyn Duesterwald, Sanjeev Banerjia. Dynamo: A Transparent Dynamic Optimization SystemC, In Proceedings of the ACM SIGPLAN 2000 conference on Programming language design and implementation, PLDI2000, 2000.5 郑举育,管海兵,梁阿磊. 动态二进制翻译系统的调试器框架J. 计算机工程. 2009, 35(2): 283-285.6 Anton Chernoff, Mark Herdeg, Ray Hookway, et al. FX!32: A profile-directed binary translator J. IEEE Trans on Micro, 1998, 18(2): 56-64.7 Weiwu Hu, Jian Wang, Xiang Gao, Yunji Chen, Qi Liu, Guojie Li. Godson-3: A Scalable Multicore RISC Processor With x86 Emulation, IEEE Micro, 2009, 29(2): 17-29.8 Cristina Ci

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论