嵌入式利用体系的调试
发布日期:2011-04-17
调试是开辟进程中必不可少的关键,通用的桌面利用体系与嵌入式利用体系在调试环境上存在明显的差别。前者,调试器与被调试的步调通常是运行在同一台呆板、雷同的利用体系上的两个进程,调试器进程通过利用体系专门提供的调用接口(早期UNIX体系的ptrace调用、如今的进程文件体系等)控制、访问被调试进程。后者(又称为长途调试),为了向体系开辟职员提供机动、方便的调试界面,调试器还是运行于通用桌面利用体系的应用步调,被调试的步调则运行于基于特定硬件平台的嵌入式利用体系(目标利用体系)。这就带来以下标题:调试器与被调试步调怎样通讯,被调试步调孕育孕育产生非常怎样及时关照调试器,调试器怎样控制、访问被调试步调,调试器怎样辨认有关被调试步调的多任务信息并控制某一特定任务,调试器如那边理处罚某些与目标硬件平台干系的信息(如目标平台的寄存器信息、呆板代码的反汇编等)。 我们先容两种长途调试的方案,看它们怎样办理这些标题。
调试方案
一 插桩(stub)
第一种方案是在目标利用体系和调试器内分别参加某些结果模块,二者互通消息来举行调试。上述标题可通过以下途径办理:
(1)调试器与被调试步调的通讯调试器与目标利用体系通过指定通讯端口(串口、网卡、并口)依照长途调试协议举行通讯(长途调试协议详见http://rtos.ict.ac.cn/rtos/debugger/)。
(2)被调试步调孕育孕育产生非常及时关照调试器目标利用体系的全部非常处理惩罚处罚终极都要转向通讯模块,告知调试器当前的非常号;调试器据此向用户表现被调试步调孕育孕育产生了哪一类非常。
(3)调试器控制、访问被调试步调调试器的这类恳求实际上都将转换成对被调试步调的地点空间或目标平台的某些寄存器的访问,目标利用体系汲取到如许的恳求可以直接处理惩罚处罚。敷衍没有假造存储见解的大抵的嵌入式利用体系而言,完成这些任务非常容易。
(4)调试器辨认有关被调试步调的多任务信息并控制某一特定任务由目标利用体系提供干系接口。目标体系根据调试器发送的关于多任务的恳求,调用该接口提供相应信息或针对某一特定任务举行控制,并返复书息给调试器。
(5)调试器处理惩罚处罚与目标硬件平台干系的信息第2条所述调试器应能根据非常号辨认目标平台孕育孕育产生非常的典范也属于这一范畴,这类变乱完全可以由调试器独立完成。支持多种目标平台正是GNU GDB的一大特色。
综上所述,这一方案须要目标利用体系提供支持长途调试协议的通讯模块(包括大抵的配置驱动)和多任务调试接口,并改写非常处理惩罚处罚的有关部分。别的目标利用体系还须要定义一个设置断点的函数;由于有的硬件平台提供能孕育孕育产生特定调试陷阱非常(debug trap)的断点指令以支持调试(如X86的INT 3),而另一些呆板没有雷同的指令,就用恣意一条不克不及被表明实行的非法(生存)指令代替。目标利用体系添加的这些模块统称为"插桩"(见下图),驻留于ROM中则称为ROM monitor。通用利用体系也有具备这类模块的:编译运行于Alpha、Sparc或PowerPC平台的LINUX内核时若将kgdb开关打开,就相称于参加了插桩。
图1 体系布局
运行于目标利用体系的被调试的应用步调要在入口处调用这个设置断点的函数以孕育孕育产生非常,非常处理惩罚处罚步调调用调试端口通讯模块,等待主机(host)上的调试器发送信息。两边创建连接后调试器便等待用户发出调试下令,目标体系等待调试器根据用户下令天生的指令。这一进程如下图所示。
图2 指令流程图
这一方案的实质是用软件承继目标体系的全部非常处理惩罚处罚(exception handler)及部分克制处理惩罚处罚,在此中插入调试端口通讯模块,与主机的调试器交互。它只能在目标利用体系初始化,分外是调试通讯端口初始化完成后才起作用,以是一样通常只用于调试运行于目标利用体系之上的应用步调,而不宜用来调试目标利用体系,分外是无法调试目标利用体系的启动进程。并且由于它肯定要占用目标平台的某个通讯端口,该端口的通讯步调就无法调试了。最关键的是它必须窜改目标利用体系,这一窜改纵然没有对利用体系在调试进程中的表现导致倒霉影响,至少也会导致目标体系多了一个不消于正式颁发的调试版。
二 片上调试(On Chip Debugging)及Embedded PowerPC Background Debug Mode
片上调试是在处理惩罚处罚器内部嵌入分外的控制模块,当餍足了肯定的触发条件时进入某种分外状态。在该状态下,被调试步调克制运行,主机的调试器可以通过处理惩罚处罚器外部特设的通讯接口访问种种资源(寄存器、存储器等)并实行指令。为了实现主机通讯端口与目标板调试通讯接口各引脚信号的结婚,二者通常通过一块大抵的信号转换电路板连接(如下图所示)。内嵌的控制模块以基于微码的监控器(microcode monitor)或纯硬件资源的情势存在,包括一些提提供用户的接口(如断点寄存器等)。细致产品有Motorola CPU16、CPU32、Coldfire系列的BDM(Background Debug Mode),Motorola PowerPC 5xx、8xx系列的EPBDM(Embedded PowerPC Background Debug Mode),IBM、TI的JTAG(Joint Test Action Debug,IEEE标准),另有OnCE、MPSD等等。下面以MPC860的EPBDM为例先容片上调试要领。
图3
EPBDM的运作相称于用处理惩罚处罚器内嵌的调试模块承继克制及非常处理惩罚处罚。用户通过设置调试容许寄存器(debug enable register)来指定哪些克制或非常孕育产生后处理惩罚处罚器直接进入调试状态,而不是利用体系的处理惩罚处罚步调。进入调试状态后,内嵌调试模块向外部调试通讯接口发出信号,关照不绝在通讯接口监听的主机调试器,然后调试器便可通过调试模块使处理惩罚处罚器实行恣意体系指令(相称于特权态)。全部指令均通过调试模块获取,全部load/store 均直接访问内存,缓存(cache)及存储办理单位(MMU)均不可用;数据寄存器被映射为一个分外寄存器DPDR,通过mtspr和mfspr指令访问。调试器向处理惩罚处罚器送rfi(return from interrupt)指令便结束调试状态,被调试步调连续运行。
与插桩要领的缺点相映射,OCD不占用目标平台的通讯端口,无需修改目标利用体系,能调试目标利用体系的启动进程,大大方便了体系开辟职员。随之而来的缺点是软件变乱量的增长:调试器端除了需补充对目标利用体系多任务的辨认、控制等模块,还要针对利用同一芯片的差别开辟板编写种种ROM、RAM的初始化步调。
下面就以调试运行于MPC860的LINUX为例,阐发用OCD要领调试OS 启动的某些关键细节。
起首,LINUX内核模块以压缩后的zImage情势驻留于目标板的ROM,目标板上电后先运行ROM中指定位置的步调将内核移至RAM并解压缩,然后再跳转至内核入口处运行。要调试内核,必须在上电后ROM中的指令实行之前得到体系的控制权,即进入调试状态、设断点,如许才华开展调试进程。MPC860的EPBDM提供了这一本领。
MPC860没有雷同X86的INT 3那样能孕育孕育产生特定调试陷阱非常的指令,而利用体系内核通常具有针对非法指令的非常处理惩罚处罚;为了使对内核正常运行的滋扰降至最小,调试时应只管即便设置硬件断点,而不是利用非法指令孕育孕育产生非常的"软"断点。
LINUX实现了虚存办理,嵌入式LINUX通常也有这一结果。地点空间从实到虚的转换在内核启动进程中便完成了,不论调试内核还是应用步调,调试器都无法回避对目标体系虚地点空间的访问,不然断点掷中时底子无法根据步调计数器的虚地点表现当前指令,更不消说访问变量了。由于调试状态下转换旁视缓冲器(TranslationLookaside Buffer)无法利用,只能仿照LINUX内核TLB失效时的非常处理惩罚处罚步调,根据虚地点中的页表索引位访问特定寄存器查两级页表得出物理页面号,从而完成虚实地点的转换。MPC860采取哈佛布局(Harvard architecture),指令和数据缓存疏散设置(由于步调的指令段和数据段是疏散的,这种布局可以消除取指令和访问数据之间的辩论),二者的TLB也疏散设置;然而TLB失效时查找页表谋略物理地点的进程是雷同的,由于页表只有一个,不存在指令、数据疏散的标题。虚实地点转换这一任务固然完全落在了调试器一方,由于上述缘故因由,再加上调试东西是嵌入式体系,一样通常不会有外存配置,不必思量内存访问缺页的环境,以是增长的变乱量并不大。
深入话题
传统的调试要领可概括为如下进程:设断点--步调停息--观察步调状态--连续运行。被调试的要是是及时体系,纵然调试器支持批处理惩罚处罚下令克制了用户输入下令、观察结果带来的扩展,它与目标体系之间的通讯也完全大概错过对目标平台外设信号的相应。于是,针对某些调试器(如GDB)提供的监督点(trace point)这一分外调试本领,目标方的插桩在原有的底子上被改革,称为代理(agent)。调试时用户起首在调试器设置监督点,以源代码表达式的情势指定感兴趣的东西名。为了淘汰代理阐发表达式的变乱,调试器将表达式转换为大抵的字节码,发送至代理。步调运行后掷中监督点、唤醒代理,代理根据字节码记任命户所需数据存入特定缓冲区(不但仅是表达式的最驱逐果,另有中间结果),令步调连续运行;这一步调无需与调试器通讯。当调试器再度得到控制时,就可以发出下令,向代理查问历次监督记录。较之于插桩,代理增长了对承继到的字节码的阐发模块,相应的目标代码体积只有约莫3K字节;固然,监督记录缓冲区也要占用目标平台的存储空间,不过缓冲区的大小可在代理天生时由用户决定。总之,这一改革以有限的目标体系资源为代价,为及时监督提供了一个低资源的可行方案。
调试并不但仅意味着设断点--步调停息--观察--连续这一进程,通常还须要profiling、跟踪(trace)等多种本领,如今世微处理惩罚处罚器的技能进步却为这些调试本领的实行带来了困难。以跟踪为例,其目标无非是记录真实的步调运行流;可当代处理惩罚处罚器指令缓存都集成于芯片内(RISC处理惩罚处罚器尤为云云),运行指令时"取指"这一利用大多在芯片内部针对指令缓存举行,芯片外部总线上只能观察到多条指令的预取(prefetch),预取的指令并不肯定实行(由于跳转等缘故因由);别的,指令通常颠末动态调理后在流水线中乱序实行,怎样再现其原始序次也是个标题。办理方案大抵有以下三种:
有的处理惩罚处罚器除了正常运行外,还能以串行要领运行,全部的取指周期都可出现于片外总线(相称于禁用缓存与流水线)。如许一来,跟踪容易多了,处理惩罚处罚器性能也大大低沉了,底子不实用于及时恳求严格的体系。
编译器主动在指定的分支及函数出入口插入对特定内存地区的写指令(与gprof等profiling东西采取的本领雷同),它们都是不通过缓存而直接向内存写的,这就能反响于芯片外总线从而被外接的逻辑阐发仪记录,终极由主机真个调试东西阐发并连合标记表重构步调流。这种要领虽被广泛利用,但终究是滋扰式的(intrusive),对体系性能也有影响。
像上文所述的片上调试那样,也有处理惩罚处罚器在片内附加了跟踪电路,网络步调流运行时的"不连贯"(discontinuities)信息(分支和非常处理惩罚处罚的跳转目标及源地点等),压缩后送至特定端口,再由逻辑阐发仪捕获送至主机端调试东西重构步调流。该方案对体系性能影响最小。
总之,处理惩罚处罚器厂家提供集成于片内的调试电路为高等嵌入式体系开辟提供种种非滋扰式的调试本领早已是场合场面所趋。为了办理该范畴标准化的须要,一些处理惩罚处罚器厂家、东西开辟公司和仪器制造商于1998年构成了Nexus 5001 Forum,这是一个旨在为嵌入式控制应用孕育孕育产生和定义嵌入式处理惩罚处罚器调试接口标准的连合布局,已往的名称是Global Embedded Processor Debug Interface Standard Consortium(环球嵌入式处理惩罚处罚器调试接口标准协会)。Nexus如今有24个成员单位,包括首创成员Motorola、Infineon Technologies、日立、ETAS和HP等公司。该布局起首处理惩罚处罚的是汽车动力应用所须要的调试,如今已生长成为调试数据通讯、无线体系和其他及时嵌入式应用的通用接口。