搜索
当前位置: 三分彩网站 > 断点开关 >

SPARC V8处理器断点调试的设计与实现研究

gecimao 发表于 2019-04-13 15:55 | 查看: | 回复:

  在嵌入式的交叉调试过程中,开发人员的调试手段有断点、触发和跟踪三种,其中断点是经常使用的调试手段。开发人员使用断点控制所要调试程序的运行和停止,使程序运行到自己想要调试的位置,通过观察在断点处的程序变量以及寄存器和存储器的值,检测所调试的程序运行是否正确。

  断点按照其实现方法分为软件断点和硬件断点,本文研究对象是软件断点调试。对于不同的嵌入式处理器或调试工具而言,软件断点的实现方法基本一样,都是通过在所要设置断点的地址上将其内存内容替换为指令陷阱,当这个指令被执行时就会产生软件中断,使处理器进入调试状态(或监控状态)。

  随着嵌入式计算机应用的发展,目前大部分处理器都内嵌有高速缓存(Cache)和内存管理单元(MMU),并由Cache、主存和磁盘构成三级存储系统。交叉调试中断点的实现与处理器中存储系统的构成有紧密的关系。MMU的存在使设置/移除断点时要考虑断点地址是虚拟地址还是物理地址,如果是虚拟地址则要进行虚实地址的转换。Cache的存在使设置/移除断点时要考虑Cache一致性的问题。如果所要设置的断点地址被Cache命中,则当用特定指令替换断点地址上的内存内容来实现断点功能时,就会使主存上的内容与Cache对应单元中的内容不一致,从而造成Cache与主存的不一致问题。这些问题的存在直接影响断点功能的正确实现。

  断点功能是交叉调试器的重要组成部分,在开发交叉调试器的过程中不可避免地会遇到上述问题。本文分析了一款具有Cache和MMU的SPARC V8处理器,主要研究其分级存储系统对实现断点功能的影响,提出了行之有效的解决办法,并应用到该处理器的调试工具中。

  Cache是一种高速缓冲存储器,在存储系统的层次结构中引入Cache是为了解决CPU与主存之间的速度差异,以提高CPU工作效率。通过在主存和高速CPU之间设置一个小容量的高速存储器,并在其中储存一份CPU最近访问的主存储器“内容拷贝”,使CPU在重复读取这部分内容时可以通过访问Cache完成数据的读写。由于Cache的速度快于主存的速度,从而缩短了数据读写的等待时间,系统的整体性能也得到提高。但同时它又带来了一些其他问题,如本文提到的一致性问题。

  Cache由控制部分和存储器部分组成,如图1所示,虚框内为控制部分。控制部分将来自CPU的数据读写请求传递给存储器进行相应处理。控制部分的主要功能是判断要访问的数据是否在Cache中命中。命中时进行Cache的寻址;未命中则按照替换策略将主存中的数据块载入到Cache存储器对应的数据块中。

  在某个内存地址上设置软件断点时,用软中断指令替换设置断点处的内存指令后,还要考虑该地址是否曾Cache命中,否则就会造成Cache不一致的问题。Cache数据与主存不一致是指:在采用Cache的系统中,同样一个数据可能存在于Cache中,也存在于主存中,两者数据相同则具有一致性,数据不相同就叫做不一致性。如果不能保证数据的一致性,则程序的运行就会出错。因此实现软件断点必须解决Cache一致性问题。

  现代计算机系统普遍采用了分级存储与虚拟存储技术相结合的存储管理体系。虚拟存储是在存储层次结构基础上,通过存储器管理部件MMU进行虚拟地址和物理地址自动变换而实现的,对每个编程者是透明的。MMU主要完成以下工作:(1)虚拟地址到物理地址的映射;(2)存储器访问权限的控制;(3)设置虚拟存储空间的Cache特性。

  在进行虚实地址转换时,处理器发出虚拟地址给MMU并被锁存于一个内部寄存器中。该虚拟地址与TLB中的虚拟地址标志进行比较。如果匹配,则TLB命中,物理地址可以直接产生;如果不匹配,则进行TLB行未命中处理,这时MMU会产生一个Table walk的动作,从CPU接管地址和数据总线,通过到主存查询页表的方法实现从虚拟地址到物理地址的转换,同时通过替换算法将新的地址信息存于TLB中[1][5]。

  启用MMU存储管理单元的处理器上运行的程序采用虚拟地址,调试时设置的断点地址用的是程序中的地址,也即虚拟地址。而CPU访问数据或读取指令的地址为物理地址。通常虚拟地址和物理地址不相同,调试器需用软件实现从虚拟地址到物理地址的转换,才能使断点设置在对应的物理地址上,实现断点调试的功能。

  本文以一款SPARC V8结构的处理器为例,详细分析如何解决层次存储系统对断点实现所产生的影响。该处理器包含了一个32位的整数单元(IU)、Cache子系统、SRMMU(SPARC reference MMU)、AMBA总线、存储控制器、UART和Watchdog等。

  在该处理器的存储系统中,采用了分离的指令Cache和数据Cache,即哈佛结构。哈佛结构消除了取数和取指之间的竞争,提高了Cache的命中率和处理器的性能。处理器存储系统的组织方式为虚拟地址Cache,如图2所示。在命中时可以省去MMU虚实地址转换的时间。但虚拟Cache可能会导致同一物理地址有不同的虚拟地址来访问,并且当系统进程切换时,同一虚拟地址可以指向不同的物理地址。因此在一个地址标识(Tag)中要增加一个进程标识(context number)。这样多个进程的数据可以放在一个Cache中,由进程标识来确定Cache中各行的数据是属于哪个进程。

  用软中断指令替换设置断点处的内存指令实现断点调试功能的同时,会造成Cache一致性的问题。虽然关掉Cache就可以解决一致性的问题,并且能够减小程序开发的复杂度,但是一个高性能的系统是需要Cache的,关掉Cache会大大降低系统的性能。因此,可以采用以下方法解决设置/移除断点时Cache一致性的问题:

  (1)利用MMU将可能出现一致性问题的存储区设为Cache不能访问的区域,即non-cacheable area。这种方法虽然比较保守,完全与Cache的设计初衷相悖,但是这种方法最为保险。

  (2)让存储此断点地址数据的Cache存储单元失效,使CPU重新读取主存的内容来更新Cache,保证Cache中的内容与主存的内容一致,以此来解决Cache一致性的问题。显然第二种方法效率比第一种高,能够发挥Cache的处理能力。

  在本文讨论的SPARC架构处理器中,可以利用Cache Tag寄存器实现解决Cache一致性问题的第二种方案。通过检测Cache Tag寄存器,判断设置/移除断点的地址是否曾Cache命中。如果Cache命中,则利用Cache Tag寄存器中的Valid有效位将存储此地址数据的Cache行置为无效;如果没有命中,则不对Cache做任何处理。

  在该处理器中,Cache可配置的模式有直接映射模式和2~4组相联的多组映射模式;可选的替换算法是LRU、LRR和伪随机。这里以直接相联映射模式的指令缓存ICache为例,简述如何利用Cache Tag寄存器解决设置/移除断点时Cache的一致性问题。

  在直接相联映射方式中,存储器中的每个区大小与Cache存储器的大小相等,区中的行与Cache存储器中的行一一对应。Cache分为Tag部分和Data部分,Tag部分用来存储标志位,与内存地址的标志位比较来判断Cache是否命中;Data部分用来存储与地址相对应的数据。如图3所示,ITag寄存器中的Valid[7:0]表示IData中相应的word是否有效;W0~W7表示IData中一行有8个word。当在某个地址设置/移除断点时,根据这个地址访问相对应的ITag寄存器,找到相对应的行,并将该行的ATAG位及有效位Valid取出。将ATAG位与地址中的Tag位进行比较,如果两者相等且对应的有效位为1,则表明访问的指令/数据在Data中,即Cache命中。Cache命中时要将该有效位清0,使Cache中的该行失效,然后再进行内存指令的替换。如果不相等或有效位为0,则访问的数据不在Data中,即Cache未命中,这时就直接进行内存指令的替换。

  本文通过使断点地址命中的Cache失效的方法,使处理器访问断点地址时访问主存,从而解决了断点调试中Cache的一致性问题,并且最大程度地发挥了Cache的作用。

  处理器启用MMU后,在调试器中设置软件断点产生了虚实地址转换问题。该问题的解决方法就是根据MMU的工作原理,在调试器中实现虚拟地址与物理地址的转换功能,取得虚拟地址对应的物理地址,并在该地址设置软中断指令,实现断点调试的功能。

  本文研究的处理器选用SRMMU来管理内存。SRMMU采用页式存储管理,主存中的3级页表用来存储全部的地址转换信息,通过页表中页表项的最低两位ET来判断是否要继续查找页表。SRMMU可实现不同级数的页表的访问,最少1级,最多4级[1]。

  SRMMU中虚拟地址到物理地址的转换过程如图4所示。虚拟地址Vaddr为所要设置/移除的断点地址;CTP和CTXNR都是SRMMU的寄存器,其中CTP为进程表的首地址,CTXNR为进程号;页表中的存储项如为PTD(Page Table Descriptors),则PTD是指向下一级页表的指针,如为PTE(Page Table Entry),则PTE是实地址的页号。在查找过程中由CTP和CTXNR得到页表的入口地址,读取该地址的内存内容判断是PTD还是PTE。如果得到PTE则不需再查找,这样每页有4GB的寻址空间;如果在level-1找到PTE,,则每页有16MB的寻址空间;如果在level-2找到PTE,则每页有256KB的寻址空间;如果在level-3找到PTE,则每页有4KB的寻址空间;如果找不到PTE,则提示错误。得到PTE后,由PTE中的Physical Page Number加上虚拟地址Vaddr的offset偏移地址,就可以得出实际的物理地址。

  在实现断点调试功能时,本文依据上述SRMMU虚实地址的转换原理,实现了一个软件SRMMU模块,用于仿真处理器硬件SRMMU的页表查询处理过程,在调试器中实现了虚实地址转换的功能。通过该方法,本文解决了断点调试中MMU产生的虚实地址转换问题,使设计的调试器可以正确处理用虚拟地址设置的断点。

  为了提高存储器的速度和存储容量,目前大部分处理器中,既有MMU也有Cache。本文通过对Cache的工作原理和MMU执行机制的详细研究,分析了开发人员在实现断点功能时所遇到的Cache一致性和MMU的地址转换等问题,并以一款SPARC V8处理器为例,剖析了软件断点的实现方法,并成功应用到该处理器的调试器设计中。本文虽然仅讨论SPARC V8架构的存储系统设计对软件断点功能实现的影响,但对于研究其他采用层次存储系统架构处理器的软件断点的设计实现也具有一定的参考价值。

本文链接:http://dogayoga.net/duandiankaiguan/31.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部