用于在调试集成可执行代码时映射调试信息的方法和装置的制作方法

文档序号:6419867阅读:87来源:国知局
专利名称:用于在调试集成可执行代码时映射调试信息的方法和装置的制作方法
技术领域
本发明通常涉及多道处理,并且尤其是涉及调试运行在分开的处理器上的链接软件。
背景技术
并行处理在计算机工业中具有大的重要性,其中该并行处理通常包含使用多个连接到同一个计算机系统以同时处理一批数据的微处理器。通常有三种主要类型的并行处理。这些是使用共享存储器或者分布式存储器或者两者的组合的并行处理系统。典型地,共享存储器是能够由多个处理器在单个操作、诸如“加载”或者“读取”命令中访问的存储器。分布存储器是被定位到单个处理器的存储器。换句话说,在分布式系统中,每个处理器能够在单个存取操作中访问它自己的相关存储器,但是通常不能在单个操作中访问与另一个处理器有关的存储器。最后,有一种混合的、或“不同种类的”(heterogeneous)并行处理,其中某些系统存储器可由一个或多个处理器访问,而某些存储器被分布到至少一个处理器并且供其本地使用。
这样一种混合并行处理器系统的例子包含至少一个精简指令集(RISC)主处理器单元(MPU)、诸如PowerPCTM处理器,和至少一个专用或“附加”的处理器单元(APU)、诸如SynergisticTMAPU(SPU)。典型地,使用MPU来执行通用代码,其中该通用代码包含复杂的控制流,并且编制总的混合并行处理功能。MPU可以访问系统存储器的全部范围。APU通常被用来执行数据流操作。换句话说,APU计算高度重复的多媒体、图形、信号、或通过高级计算标识以控制判定率的网络处理工作量。在传统的混合系统中,APU不能访问系统存储器,而且它们自己的存储器、局部存储器通常小于共享的存储器。
通常,虽然混合系统的使用提供了较高的计算性能,但是它向程序设计模型提出了重大的挑战。这样的一个问题涉及APU。APU不能直接访问系统存储器。因此,将要在APU上运行的任何代码不得不在能够在APU上执行这个代码之前被转移到APU的一个相关局部存储器。这在链接/结合(binding)过程中产生了问题。
为了帮助解决在软件设计和实现期间的各种问题,程序员使用了调试器(debugger)。典型地,由调试器使用的低级操作被分类为三种基本类型之一。第一调试器基本类型涉及在一个明确定义的位置处停止一个程序。这要求调试器(1)标识与一个函数名有关的地址、文件/行号、或其它唯一标识源代码的结构,和(2)设置一个断点。
第二调试器基本类型涉及映射一个程序存储位置到文件/行号、函数名或其它唯一地标识源代码的结构。这要求调试器映射一个存储器地址到这种源结构。映射的存储器地址通常是用于通过调试器重新读取PC寄存器的值的程序计数器PC的当前地址。象本领域技术人员理解的那样,程序计数器包含当前正在被执行的指令的存储器地址。
第三调试器基本类型允许读和写程序数据。这要求调试器标识与一个数据对象或变量有关的存储器地址。典型地,与访问地址存储单元内容的读或写操作一起设置一个断点。
通常,以上三种基本类型中的每一种都包含一个映射步骤(1)和一个操作步骤(2)。映射步骤标识在可执行的目标代码和源代码之间的相关性或某些其它映射标记,而操作步骤包含由调试器执行的其它操作。为了执行映射步骤,调试器使用最初由编译器(compiler)生成并且由运行时环境更新的至少一个映射标记表和一个调试表。映射表具有与每个程序对象的位置、每个映射名称、在文件/行号和对象地址之间的相关性、变量布局、堆栈布局等有关的信息。这些映射标记表能够例如被表示为符号表、调试条目等的形式。
典型地,在常规的系统中,映射实质上是静态的。换句话说,典型地,与特定对象有关的地址在编译时被固定,并且在执行程序的过程中不会被改变。然而,分配给一个堆栈的自动变量实质上能够是动态的,其中在相对于一个变化的堆栈、帧、基址(base)或其它这种通常在一个处理器硬件寄存器中维持的堆栈管理指针的固定的和预先确定的偏移量处引用该自动变量。
在不同种类的处理系统中用于调试器的映射静态实现是不足够的。例如,由于从系统存储器中向APU的局部存储器加载和卸载代码和数据,所以代码和数据的存储器地址将会改变。此外,保存在APU的局部存储器中的代码将被重写,因此使得不是所有的符号都是一直可用的。
因此,需要一种用于调试克服了常规调试器的缺陷的不同种类体系结构的调试器。

发明内容
本发明提供了从一个映射标记到一个存储器地址或其它寄存器地址的动态映射。如果确定映射标记具有与一个选定的单独执行环境有关的类型,则选择至少一个其中定位了映射标记的模块。选择的模块也与所选择的单独执行环境有关。如果确定与映射标记有关的至少一个模块被加载到所选择的单独执行环境的存储器中,则提供该映射标记的至少一个存储器地址。


为了更完整地理解本发明以及它的优点,参考以下结合附图给出的详细说明,其中图1示意性地描述了一个混合并行处理环境,其中使用了用于在不同种类的指令集体系结构中映射调试信息的当前发明;
图2A示意性地描述了三个链接的静态数据映射表和一个链接的动态映射表的实施例,其中每个表都包含多个数据字段;图2B示意性地描述了在静态和动态映射表中的数据字段和不同种类的并行处理环境之间的关系;图3A说明了一个用于确定一个选定映射标记的存储器地址和位置的方法框图;图3B说明了用于确定一个选定映射标记的存储器地址和位置的方法的伪代码;图4A说明了一个用于当在同一个局部存储器中同时仅仅可加载一个模块时确定与模块有关的映射标记的方法框图;图4B说明了一个用于当在同一个局部存储器中可同时加载超过一个模块时确定与模块有关的映射标记的方法框图;以及图5说明了一个用于运行时环境、以动态地更新动态系统映射的方法框图。
具体实施例方式
在下面的讨论中,阐述了许多具体的细节以便提供对本发明的一个彻底理解。然而,本领域技术人员来将会理解,没有这样的特定细节也可以实践本发明。在其它情况中,为了避免以不必要的细节模糊本发明,已经以示意性或方框图的形式说明了众所周知的单元。另外,在很大程度上,由于涉及网络通信、电磁信号发送技术等的细节没有被认为是为获得对本发明的完整理解所必需的,并且被认为是在本领域普通技术人员的理解力范围之内的,所以这些细节已经被省略了。
进一步注意到,除非另外标明,否则在此描述的所有功能都可以以硬件或软件、或者它们的某些组合来实现。然而,在一个最佳实施例中,除非另外标明,否则这些功能由一个处理器、诸如计算机或电子数据处理器依据代码、诸如计算机程序代码、软件、和/或被编码用于实现这种功能的集成电路来实现。
参见图1,参考数字100通常指定不同种类的并行处理体系结构,其通过使用存根函数(stub function)为信息的通过提供一个环境。体系结构100包含分布式计算环境110和一个共享的系统存储器160,这两者通过一个接口150电连接。环境110包含多个APU120,每个都具有它相应的局部存储器125。环境110进一步包含一个MPU 130、诸如RISC处理器,和它的一级高速缓存135。在一个实施例中,MPU 130通过一条信号通路145连接到系统存储器160。在一个实施例中,APU 120包含一个SPU。在一个实施例中,使用了单个MPU 130。在一个进一步的实施例中,使用了多个MPU 130。
环境110进一步包含一个存储器流控制器(MFC)140。通常,MFC 140允许在MPU 130和APU 120处理器之间的数据移动和同步性能,并且为在主系统存储器160和局部存储器125之间的数据传输作好准备。在图1中,MFC 140通过接口150连接到系统存储器160。
通常,应主处理器130或APU 120的请求,MFC 140允许在系统存储器160和APU 120的局部存储器125之间的信息、即文字(即代码)和数据的移动。由于APU 120不能直接访问系统存储器160,所以MFC 140应在APU 120或者MPU 130上运行的传输函数、诸如存根函数的请求,在系统存储器160和APU 120的局部存储器125之间传输信息。在一个实施例中,MFC 140包含一个直接存储器存取(DMA)设备。
体系结构100是一个其中运行可执行程序的环境,该可执行程序包含在MPU 130上执行的第一组函数和在一个或多个APU处理器120上执行的一个或多个模块。在一个实施例中,在MPU 130上执行的程序代码执行存根函数以动态地从系统存储器160中加载模块到一个或多个局部存储器125。在存根函数中,将要由APU 120使用的代码和数据被封装为一个软件“对象”。通常,存根函数命令MFC 140在两个单独的执行环境、诸如系统存储器160和局部存储器125之间传输信息。存根函数允许MPU 130传输代码和数据到APU 120的局部存储器125进行处理,使APU 120执行该处理,然后使APU 120传输处理过的数据回到MPU 130。由APU 120执行的数据和代码的这个处理对MPU 130来说是不可见的,并且允许MPU130同时执行其它数据处理或程序流控制任务。
典型地,存根函数命令MFC 140从系统存储器160中的指定地址流传输代码和数据到在一个选定APU 120的局部存储器125内的一个指定地址。存根函数还命令MFC 140以命令APU 120处理数据。从存根函数发出给APU 120的命令是远程命令。通常,远程命令是从第一执行环境中发送到第二执行环境的命令。典型地,存根函数是到APU 120的单入口点。换句话说,APU 120或者它的相关局部存储器125通常只可通过存根函数访问。
当存根对象被保存在APUs 120的局部存储器125中时,它们的相应存储器地址改变了。这个信息在动态映射信息的表格中被改变了,并且由动态调试器访问。
下面转向图2A,其中举例说明了信息表格200。表格200包含静态映射标记表格209、符号记录表格219、静态加载表格239和动态信息表格255。静态映射标记表格209包含映射标记210和记录符号212。静态记录符号表格包含目标处理器标记220、存储器偏移量230、和静态模块标识符240。静态模块加载表格包含静态模块标识符240和静态模块存储器位置250。动态模块加载表格255包含静态模块标识符240、动态模块存储器位置260、和动态局部存储器标记265。表格212和表格219通过静态记录符号212链接起来。表格219通过静态模块标识符240链接到表格239和表格255。
动态模块加载表格255由运行时环境、环境100中的操作系统、或者某些其它机构动态地更新。通常,编译器创建静态表格212、219、和239,而且运行时环境、操作系统、或者某些其它函数创建和更新动态加载表格255。在一个实施例中,当一个模块(代码模块、数据模块、或者混合的模块)在运行时间期间被加载到单独的执行空间、诸如局部存储器125中或者从其中卸载时,动态链接器在运行时间期间更新动态模块加载表格255。被更新的信息是字段240、260和265。在另一个实施例中,动态模块加载表格255允许使用调试器的程序员为与至少一个APU 120有关的单独存储器确定在其中加载了哪些模块。
表格200还允许使用调试器的程序员通过使用动态模块加载表格中的字段240、260和265确定所选择的一个模块是否已经被加载到一个或者多个存储器(诸如局部存储器125)中了,并且如果是这样的话,则还确定是哪一个或多个存储器。通常,动态映射255的动态信息在运行时间被创建。在另一个实施例中,静态表格209、219和239由编译器创建。
典型地,由于代码模块被加载和卸载到一个或多个附加处理器单元120的相关局部存储器125中,所以所述模块在局部存储器125中的位置能够随着加载的变化而变化。因此,操作系统、运行时环境等动态地用新的模块加载地址更新动态模块加载表格255。然后由动态调试器使用表格200以传送调试信息到一个程序员,其中该调试信息能够包含一个特定模块的特定函数的地址偏移量230、和那个模块的加载地址260、和由加载的模块使用的局部存储器,如同由动态局部存储器标记265指示的那样。尽管表格200在图2A中被说明为包含多个表格,但是本领域技术人员会明白能够在一个或多个表格中包含不同的字段,其中这些表格相互引用。
在图2A中,表格209包含两个字段。这些字段是映射标记210、和符号记录220。通常,映射标记210包含一个符号或者类似的信息。象本领域技术人员理解的那样,符号通常包含函数名、变量名、或者其它这样可以被用来以符号指向一个地址、或者寄存器号、或者其它这样的结构的名称。在进一步的一个实施例中,寄存器号包含在一个处理器内、在一个被称为寄存器堆的一个单独存储器中的一个寄存器的地址。映射标记210能够进一步包含其它映射信息,诸如成对的文件名和行号。符号记录212指示在表格209和符号记录表格219之间的链接。在一个实施例中,符号记录212是一个指向表格219中的一个特定条目的指针。
符号记录符号表格219包含一个目标处理器标记220、至少一个存储器偏移量230、和一个模块标识符240。在一个实施例中,在一个模块中符号标记210的每次出现被输入到记录表格219中,并且与模块标识符240、以及相关的字段信息相关联。目标处理器标记220通常是指映射标记210对应的至少一个处理器、诸如APU 120或者MPU 130。取决于可执行代码是如何生成的,能够同时在APU 120和MPU 130中或者在多个APUs 120中定义具有相同名称的符号(或者其它这种映射标记210)。因此,目标标记220向调试器发信号,由此向人类程序员、包含模块标识符240对应的MPU 130的那类处理器发信号。
至少一个存储器偏移量230通常是指在一个确定的参考点,诸如模块的起点、和映射标记210的存储器地址之间的存储器距离的大小。在一个实施例中,偏移量是一个特定函数、变量或者具有可加载模块的代码行。在进一步的一个实施例中,由于一个给定的映射标记210能够存在于一个以上的模块中,所以偏移量230包含多个偏移量,因此在表格219中创建了多个相关的条目。确定的参考点能够位于一个模块的起点,或者相对于文本或者数据空间的起点,或者是距一个另外的确定值、诸如堆栈指针、帧指针、变量指针、全局区域指针、寄存器、指定的存储器位置等的偏移量处。
符号记录表格219进一步包含一个模块标识符240。通常,模块标识符240标识映射标记210对应的那个模块。这个信息被保持在符号记录表格219中。在一个实施例中,当模块没有被加载到单独的执行环境信息上时符号记录表格219信息表格仍然被维护和保持。典型地,映射标记210与一个以上的模块标识符240相关联。
例如,由于诸如为了并行化和复制某些通用函数以减少中间模块调用的自动程序分区的因素,库单元或者其它形式的映射标记210能够被链接到不同的模块中。如果映射标记210一个单独的库模块中维持,则在一个实施例中加载该整个模块以复制需要的一个或者两个函数。在另一个例子中,在一个实施例中,如果环境100将使用一个平方根函数,则整个数学库模块被加载到所选择的APU 120的局部存储器125中。因此,每个模块能够具有一个不同的、与涉及在这个模块中的一个地址的映射标记210相关联的偏移量230,由此引用在该模块内特别期望的函数。因此,映射标记210在一个模块中的每次出现在符号行记录表格220中都有它自己的条目。
静态模块加载表格200包含模块标识符240和一个卸载的存储器位置250。卸载的存储器位置250通常对应于在系统存储器160中(映射标记210对应的)模块240的映象的存储器基地址。模块的映象存在于系统存储器160中,以在存根函数中被复制和流传输到APU 120的局部存储器125。
然而,当模块被加载到第二执行环境、诸如所选择的APU 120的局部存储器125中时,使用动态模块加载表格255。静态模块标识符240指示哪个模块已经被加载到第二执行环境中了。通常,存储器位置260指示模块加载到第二执行环境、诸如局部存储器125中的加载地址。能够把存储器偏移量230和这个存储器位置260求和以为调试器生成一个想要的对应地址。或者是其它这种需要在一个映射标记和一个存储器地址之间执行映射步骤的程序,或者反之亦然。
还使用了APU位置265。APU位置265指示模块被加载到哪个特定APU。通常,动态映射200包含在APU 120的局部存储器125中、在一个已加载模块的存储器中的位置标记。
下面转向图2B,公开了映射表格200中的数据字段210、212、220、230、240、250、260、和265与第一和第二执行环境的关系的一个实施例。在图2B中,一个映射标记表格209被逻辑地连接到每个符号表219。映射标记表格265中的各个行、“行x”和“行y”对应于一个唯一的映射标记210,其中每个映射标记210与在每一符号(per-symbol)记录表格219中的至少一个每一符号记录相关联。每个每一符号记录列出了在MPU系统存储器160中或者在一个或多个APU局部存储器125中的一个或多个定义。通常,定义是对应于在一个模块中的映射标记210中的每个实例的一行或多行信息中的字段220、230和240。此外,每个每一符号记录表格219对应于在它中的模块数目的计数。在图2A中,“main”在第一个每一符号记录表格219中具有计数“ 1”,并且“printf”对应于计数“3”。通常,每个计数对应于一个给定的映射标记210在被加载到MPU 130的模块映象中被引用了多少次。
在图2B中,每一个模块的映象被保存在系统存储器160中它们自己相应的地址281、282中。在系统存储器160的一个实施例中,映射信息280是静态表格209、219和239位于其中的存储器区域。
模块表格239逻辑地连接到共享存储器260。通常,静态模块表格239包含字段240和250。使用这些字段以把一个模块从第一执行环境中加载到第二执行环境中,诸如从一个MPU 140的共享存储器160中加载到一个APU 120的局部存储器120中。
静态模块表格239连接到动态加载表格255。动态加载表格255包含模块在第二执行环境、诸如局部存储器125中的位置地址260的存储器位置。通常,动态模块加载表格255包含字段模块标识符字段240、模块加载偏移量260和目标265。在动态模块加载表格255中的字段因此能由调试器和人们读取,以确定对应的映射标记210。
下面转向图3A,说明了一种用于发现在映射标记210和动态模块加载表格255的字段之间的相关性的方法300。通常,方法300为在和对应的映射标记210相关的一个加载模块内的一个给定函数确定对应的存储器地址(包含一个偏移量230)。这能够被实现为偏移量230和位置260的求和。
在步骤开始302之后,在步骤305中,访问由字段212标识的静态符号记录、位于符号行记录表格219中的一行。在步骤310中,方法300初始化一个数组以为符号记录表格219中的一个给定行放置对应于对应的期望映射标记210的存储器地址。在步骤312,方法300然后选择表格219中的第一定义。
在步骤320,方法300使用表格219中的字段220以确定静态定义是对应于第一处理器、诸如MPU 130,还是第二处理器、诸如APU 120。如果目标处理器标记220指向第一处理器、诸如MPU140,则在步骤330,表格219产生对应的存储器偏移量230。这被加到一个已知的基地址上。在一个实施例中,仅仅使用了一个已知的存储器地址。这个地址是整个集成的可执行代码的基地址,并且这可以被保存在一个数据单元、诸如系统存储器160中。在另一个实施例中,基地址将会总是零,诸如在使用用于系统存储器的虚拟内存的系统中。
然而,如果目标标记220指向第二处理器或者执行环境,则方法300在步骤325中读取在动态模块加载表格255中的条目。尽管方法300说明了顺序选择,但是本领域技术人员将会明白其它选择方法也在本发明的范围之内。在步骤350,方法300参考在动态模块加载表格260中的模块标识符240以确定映射标记210与哪个模块有关。通常,步骤350测试在动态加载表格255中的条目240是否引用在每一记录符号表219中被标识的模块240。如果动态表格255中的模块240描述了一个没有对应于当前被处理的静态定义219中的模块240的模块的加载,则作为替代执行步骤393。
在步骤350之后,如果动态映射255中的模块标识符240对应于每一符号记录表格219中的模块标识符240,则执行步骤360。通常,步骤360把静态表格219中的存储器偏移量230和动态映射255中的存储器位置260相加,以给出想要的映射标记210的地址,这就象它被加载到所选择的执行环境中那样。把这个信息给与调试器以传送给程序员。
然后,步骤393测试在表格255中是否有涉及对应于表格255中的模块标识符240的、在表格219中的模块标识符240的任何更多的模块,象被加载在执行环境中那样。换句话说,通过访问动态表格255,使用步骤393以发现其中模块240被加载到可能许多APU局部存储器125中的所有位置。在一个实施例中,这通过步骤393、通过为每个加载模块条目240测试动态表格255中的条目240是否指向由来自每一符号记录的静态定义引用到标识符的模块来实现。
通常,在步骤393,方法300确定与由对应于模块标识符240的当前处理的静态定义引用的模块相比是否有更多动态加载的模块。如果在动态表格255中有更多的条目,则执行步骤325。如果不是,则执行步骤395。步骤395确定在静态表格219内是否有任何更多与映射标记210相关的模块240。如果在表格219中有更多行与映射标记210相关的条目,则再次执行步骤312。如果不是,则在步骤397把地址列表返回给调试器,并且方法在步骤399结束。
通常,在方法300中,从312到395的循环使用来自表格219的字段240测试是否有包含映射标记的模块,并且从325到393的循环使用在动态加载表格255中的模块指示符240和其它条目测试这些模块是否被加载了。从325到393的循环测试在哪儿有加载到第二执行环境中的模块的其它多个拷贝。
下面转向图3B,公开了一个用于发现映射标记210的动态出现的伪代码。通常,图3B说明了伪代码执行方法300。
在图3B中,初始化一个空列表,并且依次检查映射标记在不同模块中的所有出现(由字段symbol record.entrycount标识的这种出现的数目)。在一个实施例中,在图2B中说明了出现的数目。例如,“main”在符号记录表格219中具有1次出现,“printf”在符号记录表格219中具有3次出现,等等。就在符号记录表格219中的一个对应条目来说,如果模块标识符240指示一个MPU 130,则MPU 130标记、和偏移量230被添加到动态出现列表上。如果模块标识符240指示一个APU 120,则来自模块标识符240的APU 120标记、存储器偏移量230、和存储器位置260也被加载到动态出现列表上。一旦所有模块标识符240都完成了,则列表结束。
下面转向图4A,说明了一个用于在不同种类的体系结构中把映射标记210确定为存储器地址的一个函数的方法框图400。在方法400中,一个比较存储器地址与目标处理器标记220(其选择系统存储器160或者本地APU存储器125中的一个)和在这种存储器内的一个地址有关,其中在这种存储器内的地址是存储器偏移量230的一个函数。在进一步的一个实施例中,不同种类的地址也是存储器位置260的一个函数。
在开始410之后,在步骤420,方法400确定一个存储器地址是(被包含)在第一执行环境、诸如系统存储器160内,还是被包含在第二执行环境、诸如局部存储器125中的一个内。这通过把字段265与连同比较存储器地址一起提供的一个存储器空间指示符进行比较来标识。通常,为了诸如测试以确定在一个比较地址和表格219中的值之间的相关性这样的目的,存储器空间指示符和比较存储器地址能够由调试器提供。
如果对应于模块加载地址260和与存储器空间指示符有关的存储器偏移量230的比较存储器地址对应于系统存储器160,则执行步骤430。在一个实施例中,比较存储器地址和存储器空间指示符由调试器提供。如果包含与提供的存储器空间指示符有关的存储器偏移量230的存储器地址被发现具有与局部存储器125相关的信息,则执行步骤440。通常,存储器空间指示符指示一个模块被测试为要被加载到哪个特定存储器、诸如第一局部存储器125、第二局部存储器125、或者系统存储器160中。然后这个假定由方法400测试。
如果执行了步骤430,则通过方法400在表格219中搜索是否有任何对应于存储器地址偏移量230的映射代码标记210,并且在其之后执行步骤435、即结束步骤。在进一步的一个实施例中,把主要的附加模块的加载地址与存储器地址偏移量230进行求和。
然而,如果存储器空间指示符涉及第二执行环境、诸如APU120中的局部存储器125,则执行步骤440。在步骤440,方法400从表格255中检索模块标识符240。步骤440然后通过存储器偏移量230和存储器位置260的使用,从模块标识符240中确定所选择的存储器地址与哪个模块或者哪些模块相关。如果没有模块被加载到局部存储器125,这通过在表格255中没有模块标识符240来确定,则就存储器空间指示符来说,方法400在步骤445返回消息“没有加载”,并且在步骤447停止。
然而,如果一个模块被加载到一个局部存储器125中,则通过方法400在表格219中搜索是否有对应于存储器地址偏移量230的映射代码标记210,并且在其之后执行步骤449、即结束步骤。在进一步的一个实施例中,把主要的附加模块的加载地址与存储器地址偏移量230进行求和。在一个实施例中,由方法400使用的存储器地址包含在方法300的步骤360中返回的存储器偏移量230的一个函数。
下面转向图4B,说明了一种用于在环境100中把映射标记210确定为存储器地址的一个函数的方法450。在方法450中,可使用局部存储器125以同时加载多个模块。
在开始460之后,在步骤470,方法400确定一个存储器地址是(被包含)在第一执行环境、诸如系统存储器160内,还是被包含在第二执行环境、诸如局部存储器125中的一个内。这通过读取连同存储器地址一起提供的目标处理器标记来确定。如果存储器地址对应于系统存储器160,则执行步骤480。如果与提供的目标处理器标记有关的存储器地址对应于局部存储器125,则执行步骤490。
如果执行了步骤480,则通过方法400在表格209中搜索是否有对应于存储器地址偏移量230的映射代码标记210,并且在其之后执行步骤435、即结束步骤。在进一步的一个实施例中,把主要的附加模块的加载地址与存储器地址偏移量230进行求和。然而,如果存储器地址涉及第二执行环境、诸如与APU 120有关的局部存储器125,则执行步骤490。在步骤490,方法450在动态表格255中检索来自表格219的模块标识符240,并且把它与存储器空间指示符进行比较,以便确定存储器地址与哪个或者哪些模块相关。
在步骤491,方法450通过使用动态映射表格255中的模块标识符240、通过使用加载地址,选择将被链接的下一个映射标记210。在步骤492,方法450确定请求的地址是否等于与偏移量230求和的模块加载地址260。如果是的,则链接的映射标记表格209在步骤493返回匹配的标记,并且在步骤494结束。在一个实施例中,由方法450使用的存储器地址包含存储器偏移量230和模块加载位置260的一个函数,其中该存储器地址在步骤方法300的步骤360中返回。
在步骤496,方法450确定与动态表格255中的一个模块140有关的所有映射标记210是否已经被检查了。如果有将被检查的、与给定模块有关的更多映射标记210,则方法450选择下一个映射标记210。然而,如果所有映射标记210都已经被检查了,则步骤497通过使用动态表格255中的模块标识符240确定是否有更多的模块被加载到局部存储器125中。如果依据动态映射255中的模块加载140有保存在一个局部存储器125中的另一个模块,则再次执行步骤490。如果没有更多被加载到局部存储器125中的模块,则步骤498返回值“unmapped”,并且步骤499结束方法450。
下面转向图5,说明了一种用于创建和使用动态映射信息的方法500。在步骤510,编译器把不同的源代码部分分开为独立的模块,并且把它们转换成为目标代码。在步骤520,编译器创建将被保存在静态表格中的信息,诸如在静态字段210、212、220、230、240、和250中的值。在步骤530,链接器把这些模块彼此链接并且相关联。典型地,链接器首先把面向APU 120的所有模块一起相关联,然后把目标代码的这个结合部分与为MPU 130指定的目标代码模块相关联。
在步骤540,在相互链接各个编译了的模块之后,链接器然后把初始值输入到动态系统映射200中。在步骤550,在运行时间,环境100建立和修改动态表格。在一个实施例中,动态字段是模块标识符240、存储器位置260、和存储的APU 265。通常,在步骤550,当模块被加载到APU 120的一个或多个局部存储器125上或是从其中卸载时,由环境100中的操作系统动态地创建和更新动态系统映射200,以及判定一个模块是否已经被加载到多个APU 120的一个或多个局部存储器125中,并且如果是这样的话,是哪个APU 120。
应当理解,本发明能够采取许多形式和实施例。因此,可以在上文中做出几种变化而没有背离本发明的精神或者范围。在此提出的性能考虑了各种程序设计模型的可能性。这个公开不应该被视为推荐任何特定的程序设计模型,但是作为替代提出了能够在其上构建这些程序设计模型的基础机构。
虽然已经通过参考本发明的最佳实施例描述了本发明,但是应当注意到,公开的这些实施例实际上是说明性的而不是限制,并且在以上的公开中设想了大量的变化、修改、改变和替换,而且在有些情况下,可以使用本发明的某些特征而没有对应使用其它特征。基于对最佳实施例的以上描述的回顾,许多这样的变化和修改对本领域技术人员来说可以被认为是显然的和可想到的。因此,附加权利要求被广泛地解释并且在某种意义上与本发明的范围一致是适当的。
权利要求
1.一种用于动态地从一个映射标记映射到一个存储器地址或者其它寄存器地址的方法,该方法包含确定映射标记是否为与一个所选择的单独执行环境有关的类型;选择映射标记位于其中的至少一个模块,其中选择的模块也与所选择的单独执行环境有关;确定所选择的至少一个模块是否被加载到所选择的单独执行环境的存储器中;以及如果所选择的至少一个模块被加载到所选择的单独执行环境的存储器中,则提供该映射标记的至少一个存储器地址。
2.如权利要求1所述的方法,进一步包含提供至少一个与所期望的映射标记有关的存储器偏移量的步骤。
3.如权利要求1所述的方法,进一步包含发信号通知存储器模块没有被加载到所选择的执行环境中。
4.如权利要求1所述的方法,进一步包含确定在一个系统存储器内一个已卸载模块的存储器位置。
5.如权利要求1所述的方法,进一步包含当至少一个模块在运行时间被加载到所选择的单独执行环境中时动态地更新一个动态加载映射的步骤。
6.如权利要求1所述的方法,进一步包含当至少一个模块在运行时间从所选择的单独执行环境中被卸载时动态地更新一个动态加载映射的步骤。
7.如权利要求1所述的方法,进一步包含提供多个与期望的映射标记相关的存储器偏移量。
8.如权利要求1所述的方法,其中确定映射标记位于其中的至少一个模块的步骤进一步包含确定多个模块而映射标记位于其中的每个模块中。
9.如权利要求1所述的方法,其中确定映射标记是否为与所选择的单独执行环境有关的类型的步骤进一步包含确定映射标记是否为与一个附加的处理器单元有关的类型。
10.一种用于从一个存储器地址映射到映射标记的方法,该方法包含确定存储器地址是否为与一个所选择的单独执行环境有关的类型;选择与存储器地址相关的至少一个模块,其中所选择的模块与该单独执行环境有关;确定与存储器地址相关的至少一个模块是否被加载到单独执行环境中;以及如果至少一个模块被加载到单独执行环境中,则从单独执行环境中返回映射标记,其中该映射标记对应于该存储器地址。
11.如权利要求10所述的方法,其中选择与存储器地址相关的至少一个模块的步骤进一步包含确定多个其中存储器地址被相关的模块。
12.如权利要求10所述的方法,进一步包含通过在单独执行环境中的模块加载地址和映射标记的存储器偏移量标识映射标记的步骤。
13.如权利要求10所述的方法,进一步包含发信号通知该至少一个模块被加载到由存储器地址指定的存储器寄存器中的步骤。
14.一个用于在至少两个单独的执行环境之间进行映射的系统数据映射,其中该系统映射包含映射标记;距一个确定的存储器位置的映射标记的至少一个存储器偏移量;以及单独执行环境的标记。
15.如权利要求14所述的系统数据映射,其中至少一个偏移量包含映射标记地址的多个偏移量。
16.如权利要求15所述的系统数据映射,其中映射存储器地址的多个偏移量对应于多个单独的执行环境。
17.如权利要求14所述的系统数据映射,进一步包含映射标记驻留于其中的一个模块的标记。
18.如权利要求14所述的系统数据映射,进一步包含一个模块的一个卸载拷贝在系统存储器的存储空间中的存储器地址标记,其中映射标记驻留于该标记中。
19.如权利要求14所述的系统数据映射,其中映射标记包含一个符号。
20.如权利要求14所述的系统数据映射,其中映射标记包含一个文件名和一个行号。
21.一种用于在映射信息和存储器地址之间进行映射的方法,包含依据一个目标处理器对信息进行分类;把多个软件模块信息与多个符号相关联;以及在运行时间跟踪多个模块的加载和卸载,以提供有关系统状态的准确信息。
22.一种用于从一个映射标记动态地映射到一个存储器地址或者其它寄存器地址的计算机程序产品,该计算机程序产品具有一个在其上包含了一个计算机程序的介质,该计算机程序包含用于确定映射标记是否为与一个所选择的单独执行环境有关的类型的计算机代码;用于选择映射标记位于其中的至少一个模块的计算机代码,其中该模块也与所选择的单独执行环境有关;用于确定与映射标记有关的该至少一个模块是否被加载到所选择的单独执行环境的存储器中的计算机代码;以及用于如果该至少一个模块被加载到所选择的单独执行环境的存储器中则提供想要的映射标记的至少一个存储器地址的计算机代码。
23.一种用于从一个映射标记动态地映射到一个存储器地址或者其它寄存器地址的处理器,该处理器包括一个计算机程序,该计算机程序包含用于确定映射标记是否为与一个所选择的单独执行环境有关的类型的计算机代码;用于选择映射标记位于其中的至少一个模块的计算机代码,其中该模块也与所选择的单独执行环境有关;用于确定与映射标记有关的该至少一个模块是否被加载到所选择的单独执行环境的存储器中的计算机代码;以及用于如果该至少一个模块被加载到所选择的单独执行环境的存储器中则提供想要的映射标记的至少一个存储器地址的计算机代码。
全文摘要
本发明提供了用于当在不同种类的体系结构中调试集成可执行代码时映射调试信息的方法和装置。这通过在一个映射表格中在运行时间动态地更新映射信息来实现,其中该映射表格由该动态调试器读取。
文档编号G06F11/36GK1506808SQ20031010108
公开日2004年6月23日 申请日期2003年10月15日 优先权日2002年10月24日
发明者迈克尔·K·克施温德, 凯瑟琳·M·奥布莱恩, 约翰·K·奥布莱恩, 瓦伦蒂纳·萨拉普罗, M 奥布莱恩, K 奥布莱恩, 纳 萨拉普罗, 迈克尔 K 克施温德 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1