具体实施方式
以下基于实施例对本公开进行描述,但是本公开并不仅仅限于这些实施例。在下文对本公开的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本公开。为了避免混淆本公开的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。
在介绍本公开的各个实施例之前,先对本公开所使用的一些术语或者概念进行解释和澄清。
指令流水线,指令流水线是为提高处理器执行指令的效率,把一条指令的操作分成多个细小的步骤,每个步骤由专门的电路完成的方式。目前主流的指令流水线的技术有三级、四级、五级、七级和超级指令流水线,等等。例如教课书示例的五级指令流水线包括取指、译码、执行、访存和写回。
调试系统
应该说明的是,由于本公开实施例的目的是描述关于处理器中关于调试功能的改进方案,因此附图和文中都将着重描述与调试功能相关的部件。图1显示了一个实现调试功能的系统的示意图。
如图上所示,该系统包括调试主机101、调试传输硬件102和调试系统103。调试主机101例如为笔记本电脑、台式机、掌上电脑等电子产品,其上部署调试工具(例如gdb)1011和转换器1012。调试工具调试工具1011与转换器1012通信,转换器1012(例如OpenOCD,包括硬件驱动程序)与调试传输硬件(例如Olimex USB-JTAG适配器)102通信。调试传输硬件102在调试主机101和调试系统103之间建立通信。
调试系统103包括调试传输模块(Debug Transport Module,DTM)1031、调试模块接口(Debug Module Interface,DMI)1032、调试模块(Debug Module,DM)1033、程序缓存区1034、系统总线1035和一个或多个处理器核1036。传输实现模块1031使用一个或多个传输接口模块1032访问调试模块1033。传输实现模块1031基于传输元件(例如为JTAG或USB组件)实现访问调试模块1032。调试系统103可支持多个传输实现模块1031,以允许采用其中之一的传输实现模块1031对调试模块1033进行访问,但前提是该传输实现模块1031对传输接口模块1032有访问权限。
传输接口模块1032可以是带有一主一从的次级总线,或者类似于TileLink或AMBA高级外围总线等功能更全的总线,用于实现用户提供的抽象调试命令和具体实施之间的转换接口。如此,调试模块1033从属于被称为调试模块接口(DMI)1032的总线。
可以传输实现模块1031和传输接口模块1032作为一个整体来理解,即两个部件组成一个协议接口模块,该协议接口模块用于从外部接收调试命令,对所述调试命令进行转换,并将经过转换的调试命令发送给调试模块1033。
调试模块1033可控制一个或多个处理器核1036。多个处理器核1036可能是异构的或同构的,并不加以限制。调试模块的数量可以有多个,多个处理器核1036和多个调试模块之间的映射也没有进一步限制,但通常,单个处理器(或片上系统)内的所有处理器核都由同一个调试模块控制。当用户启动一个调试工具调试工具1011后,相应地,调试模块1033将选定一个处理器核以进行调试,之后用户通过调试工具调试工具1011输入的各种命令都是由这个处理器核执行。同时,用户可通过调试工具调试工具1011输入对该处理核的各种控制命令,例如暂停(halt)、继续(resume)、重置(reset)、等等。
图上调试模块1033只示意了三类功能:重置/暂停控制(reset/halt control)10331、抽象命令集10332和总线访问10333。重置/暂停控制(reset/halt control)10331是指对于一个或多个处理器核的控制命令的具体功能实现,抽象命令集10332是针对一个或多个处理核的命令集合,总线访问10333是总线访问接口。调试模块1033对于一个或多个处理器核,定义了多个状态,并可通过抽象命令集10332中的特定命令持续跟踪它的状态变化。
抽象命令集10332包括一系列的抽象命令的功能实现,其中的大多命令是可选的。不同调试工具101可支持其中的一种或几种抽象命令。在操作时,用户可通过调试工具在调试状态发送一个抽象命令,然后执行错误查看命令以确定该命令的执行是否成功,通过这种方式,可以确定用户在调试工具中可以使用哪些抽象命令。此外,每个抽象命令都有自己支持的选项,当向一个抽象命令提供了它不支持的选项时,该抽象命令产生错误信息,该错误信息同样使用错误查看命令查看。
在一些实施例中,抽象命令集10332包括三类抽象命令。第一类抽象命令驱动调试工具访问寄存器并允许它执行程序缓冲器1034内的程序指令。第二类抽象命令驱动处理器核进入调试模式,然后执行程序缓冲器1034内的程序指令。第三类抽象命令允许调试工具以完全相同的内存视图和所选处理器核具有的权限执行内存访问。
总线访问10333用于不经由处理器核实现内存访问。由此,调试工具调试工具1011可以使用程序缓冲区或抽象访问内存命令(包含在抽象命令集10332)经由总线访问10333访问内存。总线访问10333存在的必要在于,根据微体系结构的不同,通过总线访问10333访问的内存数据可能并不总是如此与在每个处理器核观察到的内存数据一致,例如,通过总线访问10333向内存映射的特殊区域写入数据但无法通过处理器核写入。但总线访问10333为可选项,芯片设计者会根据实际产品需求确定是否在处理器核包含总线访问10333。
为了支持在所选的处理核上执行命令,系统103还包括一种程序缓存机制,该机制通过向程序缓存区(program buffer)1034写入一段程序代码(通常是调试指令),进而驱动所选的处理器核执行该段代码。具体操作为:调试工具调试工具1011先将程序指令写入该缓冲区,然后处理器核通过抽象命令集10332中的特定命令访问该缓存区,以执行该缓存区的程序指令,为了在执行完程序缓存区1034的程序指令之后能够返回去处理调试模块1033发送的命令,需要将程序缓存器中的程序指令以ebreak或c.ebreak结束,当处理器核执行到ebreak或c.ebreak时,会跳出对于程序缓冲器1034中的指令执行。有了这个特性,一个只有32位的程序缓冲器就可以提供高效的调试。在上文中说过,用户可以通过调试工具调试工具1011控制和观察目标程序在服务器上执行的过程。一些编程软件会内嵌调试工具调试工具1011,并通过调试工具1011可使程序运行进入调试模式(程序运行模式包括调试模式和正常工作模式)调试工具。用户对调试工具的相应操作会被转换器1012转换为启动命令,该命令经由调试传输硬件102发送给调试系统103中的调试模块1033,期间经由传输功能模块1031和传输接口模块1032。调试模块1033确定待调试程序运行在哪个处理器核上,后续用户可以输入各种命令来查看待调试程序在该处理器核上的运行情况。
处理器核1036是用于计算、接受/存储命令、处理数据的核心部件。处理器核1036具有复杂的软硬件结构。如图上所示,按照指令集架构划分,处理器核1036可包括取指令单元10361、指令译码单元10362、指令执行单元10363和指令提交单元10364。取指令单元3021可以从耦合到处理器核302内部的指令高速缓存(未示出)或外部的存储器中,根据程序指针(程序PC)获取物理地址并获取指令包。指令译码单元10362根据封装在处理器核内的指令集对当前指令进行译码,通过译码得到当前指令的操作码、源寄存器、目的寄存器和立即数。指令执行单元10363包括各种硬件执行单元,用于根据指令译码单元10362的译码结果执行各种运算,并将执行结果发送给指令提交单元10364。指令提交单元10364用于将执行结果(例如各种运算的计算结果存储在寄存器中)写入到处理器核内部的数据高速缓存或外部的存储器中。
在此基础上,处理器核还用于处理调试请求,根据调试请求从正常工作模式切换到调试模式,如果从正常工作模式到调试模式切换失败,则将进入调试响应异常。处理器核对于调试请求提供两种响应方式:第一种是处理器核在接收到调试请求之后,将响应调试请求的程序指令执行完毕后,再进入调试模式(或响应调试异常);第二种是处理器核在接收到调试请求之后,不执行或取消响应调试请求的程序指令内的指令,之后进入调试模式(或响应调试异常)。处理器核具体采用哪种响应方式,取决于调试请求所携带的信息。
图2是一个内嵌调试工具的编程软件的图形界面的示例图。下面以图2为示例继续说明处理器核1036如何实现调试。
图上调试的目标程序为a.out,启动的调试工具为kDbg,参考图上所示,用户在程序指令“str[i]=‘a’”上设置了调试断点。当启动调试工具kDbg后,kDbg向处理器核1036发送一个调试请求,处理器核1036接收到调试请求之后,先确定响应该调试请求的程序指令,即图3中的程序指令“str[i]=‘a’”,然后读取调试请求中的调试时机,调试时机可由调试工具1011或调试模块1033设置。本实施例设定调试时机有两种赋值:第一值(例如0)和第二值(例如1),当调试时机等于第一值时,判断响应调试请求的程序指令是否已经执行完成,如果是,则取消响应调试请求的程序指令的执行结果,如果否,则阻止程序指令的执行;当调试时机等于第二值时,判断响应调试请求的程序指令是否已经执行完成,如果是,则提交响应调试请求的程序指令的执行结果,如果否,则等待程序指令的执行完成,然后处理器核进入到调试模式或响应调试异常,继续以图2为例进行解释:处理器核1036判断调试时机(对应调试请求中的字段timing)等于第一值(例如0)时,判断“str[i]=‘a’”这条指令是否已经执行完成,如果是,则取消“str[i]=‘a’”这条指令的执行结果,如果否,则阻止“str[i]=‘a’”这条指令的执行;如果调试时机等于第二值(例如1)时,则提交“str[i]=‘a’”这条指令的执行结果,然后处理器核进入调试模式或响应调试异常。
但是上述处理调试请求的方案处理器核需要较多的逻辑判断元件,硬件结构比较复杂。
图3是在图1基础上的、由本公开实施例提供的实现调试功能的系统的结构性框图。其中,调试系统301可包括本公开实施例提供的一个或多个处理器核302。
处理器核302根据封装在处理器核内的指令集对程序代码进行取指、译码、执行等操作。处理器核302通常包括取指令单元3021、指令译码单元3022、普通执行单元30243023、特殊执行单元3024、指令提交单元3025和调试单元3026。
其中,取指令单元3021可以从耦合到处理器核302内部的指令高速缓存(未示出)或外部的存储器中,根据程序指针(程序PC)获取物理地址并获取指令包。在一些实施例中,取指令单元3021还可以包括一个预译码单元,用于对指令包内的各个指令进行预译码以确定各个指令的指令类型。例如,指令类型可以是通常指令和访存指令中的一种,这里的访存指令包括存储指令(store指令)和载入指令(load指令),通常指令可以是除访存指令之外的其他指令,包括分支指令、数据传送指令等。预译码模块根据指令类型进行不同操作。
指令译码单元3022根据封装在处理器核内的指令集对当前指令进行译码,通过译码得到当前指令的操作码、源寄存器、目的寄存器和立即数。封装在处理器核内的指令集由处理器的生产厂商决定,在编译阶段,通过编译器将源代码编译为各种指令集支持的程序指令。但如果编译得到的程序指令不被当前指令集支持,则指令译码单元202无法理解该程序指令表达的含义,指令译码失败。
指令提交单元3025用于将执行结果(例如各种运算的计算结果存储在寄存器中)写入到处理器核内部的数据高速缓存或外部的存储器中。
指令执行单元包括特殊执行单元3023和普通执行单元3024,特殊执行单元3023不产生执行结果,但特殊执行单元3023会将指令信息发送给指令提交单元3025,普通执行单元3024正常执行程序指令并发送执行结果给指令提交单元3025。
在上述处理器组件的基础上,处理器核302还包括了调试单元3026。调试单元3026分别与取指令单元3021和指令提交单元3025耦接。调试单元3026用于持续接收第一调试请求,所述第一调试请求来自于外部的调试模块1033,调试单元3026判断第一调试请求,如果确定第一调试请求表示在第一程序指令执行完成之后进入调试模式,则根据第一调试请求产生第二调试请求,第二调试请求表示在第二程序指令之前进入调试模式,第二程序指令是第一程序指令的下一条指令,然后可将第一调试请求和第二调试请求都发送给取指令单元3021,但如果确定第一调试请求表示在第一程序指令执行完成之前进入调试模式,则不根据第一调试请求产生第二调试请求,而是直接将第一调试请求发送给取指令单元3021。在一些实施例中,调试单元3026通过调用内置于其中的硬件触发模块产生第二调试请求。
取指令单元3021会从与其耦接的高速缓存中获取指令包,因此取指令单元3021会将第一程序指令和第二程序指令以及第一调试请求或第二调试请求发送给指令译码单元3022。
指令译码单元3022对程序指令进行译码,如果判断第一调试请求表示在第一程序指令执行完成之前进入调试模式,则将第一程序指令的译码结果提供给特殊执行单元3024,如果判断第一调试请求表示在第一程序指令执行完成之后进入调试模式,或判断第二调试请求表示在第二程序指令执行完成之前进入调试模式,则将第一程序指令的译码结果提供给普通执行单元3023,以及将第二程序指令的译码结果提供给特殊执行单元3024。
特殊执行单元3023不产生执行结果,但特殊执行单元3023会将指令信息发送给指令提交单元3025,普通执行单元3024正常执行程序指令并发送执行结果给指令提交单元3025。
指令提交单元3025提交由普通执行单元3024发送过的执行结果,即将指令执行单元503的结果寄存器的执行结果提交到存储器,然后根据指令信息或执行结果进入调试模式或响应调试异常。
应该理解,当调试单元3026从外部接收第一调试请求时,该请求指定的程序指令可能已经在指令流水线中已经译码、执行甚至已经完成执行(即经由指令提交单元3025提交到存储器),因此,可选地,调试单元3026将第一调试请求发送给指令提交单元3025,指令提交单元3025接收到第一调试请求之后,判断如果第一调试请求表示在第一程序指令执行之前进入调试模式,但实际上通过从普通执行单元3024返回的执行结果发现,第一程序指令经过普通执行单元3024已经执行,则可以取消或者阻止提交该第一程序指令的执行结果(取消和阻止提交都是为了不将指令执行单元503产生的结果寄存器的执行结果提交到存储器,并可清除结果寄存器)。处理器核在进入调试模式之前,会清空指令流行线,以便于处理器核重新自调试模块1033接收调试指令并进行处理。考虑到在某些情况下(例如延迟),使得普通执行单元3024处理了本该由特殊执行单元3023处理的第一程序指令,导致该第一程序指令的执行结果发送给指令提交单元,因此通过指令提交单元3025取消提交或者阻止提交能够使处理器核回到未执行该第一程序指令的状态。
图4和5是本公开实施例提供的基于图3所示的处理器核实现的调试功能的流程图。该流程图具体包括以下步骤。
在步骤S401中,调试单元3026向取指令单元3021发送调试请求。该调试请求可以包括上述的第一调试请求和第二调试请求,且调试请求包括调试时机(timing)和响应该调试请求的程序指令。如果调试请求的timing等于0且指定响应调试请求的程序指令为第一程序指令,表示在第一程序指令执行完成之前进入调试模式;如果调试请求的timing等于1且响应调试请求的程序指令为第一程序指令,表示在第一程序指令执行完成之后进入调试模式。
在步骤S402中,取指令单元3021判断该指令是否收到调试请求。如果是,则执行步骤S403,否则执行步骤S404。
在步骤S403中,取指令单元3021将指令和调试请求信息发送至指令译码单元3022。
在步骤S404中,取指令单元3021将指令发送至指令译码单元3022。
在步骤S405中,指令译码单元3022判断该指令是否有调试请求,如果有则执行步骤S406,否则执行步骤S411。
在步骤S406中,指令译码单元3022判断调试请求的timing,如果等于0,则执行步骤S407,如果等于1,则执行步骤S409。
在步骤S407中,指令译码单元3022将相应指令的译码结果发送至特殊执行单元3023。
在步骤S408中,特殊执行单元3023不产生执行结果,将指令信息发送至指令提交单元3025。
在步骤S409中,指令译码单元3022将相应指令的译码结果发送至普通执行单元3024。
在步骤S410中,普通执行单元3024产生执行结果,将执行结果发送至指令提交单元3025。
在步骤S411中,指令译码单元3022将译码结果发送至普通执行单元3024。
在步骤S412中,普通执行单元3024产生执行结果,将执行结果发送至指令提交单元3025。
在步骤S413中,调试单元3026向指令提交单元3025发送调试请求。该调试请求可以为timing等于0或等于1的调试请求。具体而言,初始时,调试单元3026对于接收到的任何调试请求(timing=0或1)发给取指令单元3021和指令提交单元3025各自一份,同时调试单元3026对于timing等于1的调试请求会新构建一个timing等于0的调试请求,新构建的timing为0的响应程序指令为下一条指令,并将新构建的timing等于0的调试请求也发送给取指令单元3021。
在步骤S414中,指令提交单元3025判断指令提交单元3025判断指令是否有调试请求,如果有,执行步骤S419,否则执行步骤S415。
在步骤S415中,指令提交单元3025提交执行结果。
在步骤S416中,取指令单元3021取得新指令。然后继续跳转步骤S402继续执行。
在步骤S417中,指令提交单元3025判断该指令是否有执行结果,如果是有,则执行步骤S418,否则执行步骤S423。
在步骤S418中,指令提交单元3025取消(丢弃)执行结果。
在步骤S419中,指令提交单元3025判断调试请求的Timing,如果等于1,则执行步骤S420,如果等于0,则执行步骤S417。
在步骤S420中,指令提交单元3025提交执行结果。
在步骤S421中,指令提交单元3025向调试单元3026发送响应了Timing为1的调试请求的信息。
在步骤S422中,调试单元3026向下一条指令产生Timing为0的pending调试请求。然后继续跳转步骤S402继续执行。
Pending调试请求(上述第二调试请求即指pending调试请求)是新增的请求类型。Pending调试请求中,调试时机设置为0,请求类型设置为’pending’,该请求是系统定义的不进行任何实际操作的请求,其作用是使处理器核进入到调试模式或响应调试异常。并且为了使处理器核在下一条指令执行之前进入调试模式或响应调试异常,还可将该请求的优先级设置得高于下一条指令执行过程中产生的任何结果,即使这些结果(例如产生非调试异常、或响应中断等)的优先级高于时机为第一值的调试请求。类似的,pending调试请求的优先级也高于下一条指令的其它调试请求。Pending调试请求经由步骤S413提供给指令提交单元3025。
在步骤S423中,指令提交单元3025进入调试模式或响应调试异常,并通知调试工具。
在一些实施例中,处理器核在响应进入调试模式的调试请求时,需要记录调试请求的类型,处理器在响应触发调试异常的调试请求时,需要记录异常信息。
以图2为例说明本实施例的技术效果与现有技术没有区别。图2中,响应调试请求的程序指令为“str[i]=‘a’”这条指令,当调试请求的时机等于1时,处理器核将“str[i]=‘a’”这条指令执行完成并提交执行结果,然后调试单元3026在下一条指令“for(i=0;i<9;i++)”发送一个timing为0的pending调试请求。按照上述流程图,处理器核是在“str[i]=‘a’”这条指令执行完成并提交但是下一条指令“for(i=0;i<9;i++)”没有执行的情况下进入调试模式,而现有技术也是在“str[i]=‘a’”这条指令执行完成并提交但是下一条指令“for(i=0;i<9;i++)”没有执行的情况下进入调试模式。
下面基于一个示例更详尽地介绍本公开实施例。
按照调试请求的调试时机timing,有两种类型的调试请求:(a)timing为0的调试请求;(b)timing为1的调试请求。调试请求的告知方式也存在两种:I.在取指令阶段告知调试请求,II.在指令提交阶段告知调试请求。因此构成调试请求的四种处理场景:
场景一:(a)timing为1的调试请求,I.在取指令阶段告知调试请求。以下指令序列为示例进行说明:
指令A:add(加法)指令;
指令B:sub(减法)指令。
调试单元3026指示在A指令上产生timing为1的调试请求。响应过程如下:
1.取指令单元3021取到A指令,调试单元3026告知取指令单元3021在指令A上应响应timing为1的调试请求。
2.取指令单元3021将A指令发送至指令译码单元3022,指令译码单元3022仍然将该指令发送至普通执行单元3024(即ALU,算术运算)。
3.普通执行单元3024完成A指令执行后,将执行结果发送至指令提交单元3025。
4.指令提交单元3025提交A指令的执行结果,并告知调试单元A指令响应了timing为1的调试请求。调试单元将会在A指令的下一条指令B上产生timing为0的pending调试请求。
5.取指令单元3021取到B指令,调试单元3026告知取指令单元3021在指令B上响应timing为0的(pending)调试请求。
6.取指令单元3021将B指令发送至指令译码单元3022,指令译码单元3022将B指令发送至特殊指令执行单元,而不是普通执行单元3024。
7.特殊指令执行单元不会产生B指令的执行(减法)结果,但仍然会发送B指令信息至指令提交单元3025。
8.指令提交单元3025不会提交B指令的执行结果,并且告知调试单元3026响应了timing为0的调试请求,然后进入调试模式或响应调试异常。
场景二:(a)timing为1的调试请求,II.在指令提交阶段告知调试请求。
与上述步骤1~8类似,区别在于:
1.取指令单元3021取到A指令,调试单元不会告知取指令单元3021在指令A上应响应timing为1的调试请求。
2.取指令单元3021将A指令发送至指令译码单元3022,指令译码单元3022仍然将该指令发送至普通执行单元3024。
3.指令执行单元503完成A指令执行后,将执行结果发送至指令提交单元3025。
4.指令提交单元3025在提交A指令的执行结果时,调试单元告知A指令应响应timing为1的调试请求,指令提交单元3025还会做一系列判断,以确定A指令是否响应调试请求,确定响应后,再告知调试单元3026关于A指令已经响应该调试请求,即,指令提交单元3025会告知调试单元3026关于A指令响应了timing为1的调试请求。调试单元将会在A指令的下一条指令B上产生timing为0的pending调试请求。
5.取指令单元3021取到B指令,调试单元告知取指令单元3021在指令B上响应timing为0的(pending)调试请求。
6.取指令单元3021将B指令发送至指令译码单元3022,指令译码单元3022将B指令发送至特殊指令执行单元503,而不是普通执行单元3024。
7.特殊指令执行单元不会产生B指令的执行(减法)结果,但仍然会发送B指令信息至指令提交单元3025。
8.指令提交单元3025不会提交B指令的执行结果,并且告知调试单元3026响应了timing为0的调试请求,然后进入调试模式或产生调试异常。
场景三:(b)timing为0的调试请求(比如pending调试请求和其它类型的调试请求),I.在取指令阶段告知调试请求。与上述步骤5~8类似。下面以下指令序列为例:指令A:add(加法)指令。
调试单元指示在A指令上产生timing为0的调试请求。响应过程如下:
1.取指令单元3021取到A指令,调试单元告知取指令单元3021在指令A上响应timing为0的调试请求。
2.取指令单元3021将A指令发送至指令译码单元3022,指令译码单元3022将A指令发送至特殊指令执行单元503,而不是普通执行单元3024。
3.特殊指令执行单元503不会产生A指令的执行(加法)结果,但仍然会发送A指令信息至指令提交单元3025。
4.指令提交单元3025不会提交A指令的执行结果,并且告知调试单元响应了timing为0的调试请求,然后进入调试模式或产生调试异常。
场景四:(b)timing为0的调试请求(比如pending调试请求和其它类型的调试请求),II.在指令提交阶段告知调试请求。
1.取指令单元3021取到A指令,调试单元不会告知取指令单元3021在指令A上响应timing为0的调试请求。
2.取指令单元3021将A指令发送至指令译码单元3022,指令译码单元3022仍然将该指令发送至普通执行单元3024。
3.指令执行单元503完成A指令执行后,将执行结果发送至指令提交单元3025。
4.指令提交单元3025在提交A指令的执行结果时,调试单元告知A指令应响应timing为1的调试请求。指令提交单元3025会取消A指令的执行结果,并且告知调试单元响应了timing为0的调试请求,然后进入调试模式或产生调试异常。
综上所述,本公开实施例提供的处理器核,当第一调试请求表征在第一程序指令之后进入调试模式,产生了第二调试请求,第二调试请求表征在第二程序指令之前进入调试模式,由此处理器核根据第二调试请求而不是第一调试请求进入调试模式,即处理器核永远都是根据表征某一程序指令之前进入调试模式的调试请求进入调试模式,和现有技术相比,这样做能够减少处理器核中逻辑判断元件的数量,使处理器核的硬件结构上更加简单,从而降低处理器核的制造成本。
本公开实施例提供的处理器的具体应用
图6示出了本公开实施例所应用的通用的计算机体系结构。如图上所示,计算机系统600可以包括一个或多个处理器12,以及存储器14。其中,上述实施例提供的处理器可作为处理器12。
计算机系统600中的存储器14可以主存储器(简称为主存或内存)。用于存储由数据信号表示的指令信息和/或数据信息,例如存放处理器12提供的数据(例如为运算结果),也可以用于实现处理器12与外部存储设备16(或称为辅助存储器或外部存储器)之间的数据交换。
在一些情形下,处理器12可能需要访问存储器14,以获取存储器14中的数据或对存储器14中的数据进行修改。由于存储器14的访问速度较慢,为了缓解处理器12与存储器14之间的速度差距,计算机系统600还包括与总线11耦合的高速缓冲存储器18,高速缓冲存储器18用于对存储器14中的一些可能会被反复调用的程序数据或者报文数据等数据进行缓存。高速缓冲存储器18例如由静态随机存储器(Static Random Access Memory,简称为SRAM)等类型的存储装置实现。高速缓冲存储器18可以为多级结构,例如具有一级缓存(L1Cache)、二级缓存(L2 Cache)和三级缓存(L3 Cache)的三级缓存结构,也可以是三级以上的缓存结构或其他类型缓存结构。在一些实施例中,高速缓冲存储器18的一部分(例如一级缓存,或一级缓存和二级缓存)可以集成在处理器12内部或与处理器12集成于同一片上系统中。
基于此,处理器12可以包括指令执行单元121、内存管理单元122等部分。指令执行单元121在执行一些需要修改内存的指令时发起写访问请求,该写访问请求指定了需要写入内存中的写入数据和相应的物理地址;内存管理单元122用于将这些指令指定的虚拟地址转译为该虚拟地址映射的物理地址,写访问请求指定的物理地址与相应指令指定的物理地址可以一致。
存储器14和高速缓冲存储器18之间的信息交互通常按块来组织。在一些实施例中,高速缓冲存储器18和存储器14可以按照相同的空间尺寸被划分成数据块,数据块可以作为高速缓冲存储器18和存储器14之间的数据交换的最小单位(包括预设长度的一个或多个数据)。为了表述简洁清晰,下面将高速缓冲存储器18中的各个数据块简称为缓存块(可以称为cacheline或高速缓存线),且不同的缓存块具有不同的缓存块地址;将存储器14中的各个数据块简称为内存块,且不同的内存块具有不同的内存块地址。缓存块地址例如包括用于定位数据块的物理地址标签。
由于受到空间和资源的限制,高速缓冲存储器18无法对存储器14中的全部内容都进行缓存,即高速缓冲存储器18的存储容量通常小于存储器14,高速缓冲存储器18提供的各个缓存块地址无法对应存储器14提供的全部内存块地址。处理器12在需要访问内存时,首先经总线11访问高速缓冲存储器18,以判断所要访问的内容是否已被存储于高速缓冲存储器18中,如果是,则高速缓冲存储器18命中,此时处理器12直接从高速缓冲存储器18中调用所要访问的内容;如果处理器12需要访问的内容不在高速缓冲存储器18中,则高速缓冲存储器18,处理器12需要经总线11访问存储器14,以在存储器14中查找相应的信息。因为高速缓冲存储器18的存取速率非常快,因此当高速缓冲存储器18命中时,处理器12的效率可以显著提高,进而也使整个计算机系统600的性能和效率得以提升。
此外,计算机系统600还可以包括存储设备16、显示设备13、音频设备19、鼠标/键盘15等输入/输出设备。存储设备16例如是通过相应接口与总线11耦合的硬盘、光盘以及闪存等用于信息存取的设备。显示设备13例如经相应的显卡与总线11耦合,用于根据总线11提供的显示信号进行显示。
计算机系统600通常还包括通信设备17,因此可以通过各种方式与网络或其他设备通信。通信设备17例如可以包括一种或多种通信模块,作为示例,通信设备17可以包括适用于特定的无线通信协议的无线通信模块。例如,通信设备17可以包括WLAN模块,用于实现符合电气和电子工程师协会(IEEE)制定的602.11标准的Wi-FiTM通信;通信设备17也可以包括WWAN模块,用于实现符合蜂窝或其他无线广域协议的无线广域通信;通信设备17还可以包括蓝牙模块等采用其它协议的通信模块,或其它自定义类型的通信模块;通信设备17也可以是用于串行传输数据的端口。
当然,不同的计算机系统根据主板、操作系统和指令集架构的不同,其结构也可能有所变化。例如目前很多计算机系统设置有连接在总线11和各个输入/输出设备之间的输入/输出控制中心,且该输入/输出控制中心可以集成于处理器12之内或独立于处理器12。
图7是本公开实施例所应用的嵌入式系统的结构图。上述实施例提供的处理器可用作处理器701。
虽然嵌入式系统在硬件结构上与计算机系统具有高度相似性,但是嵌入式系统应用上的特点致使嵌入式系统在硬件的组成和实现形式上与通用计算机系统又有较大区别。
首先,为满足嵌入式系统700在速度、体积和功耗上的要求,操作系统、应用软件、特殊数据等需要长期保存的数据,通常不使用磁盘这类具有大容量且速度较慢的存储介质,而大多使用随机存储器702或闪存(Flash Memory)703。
另外,在嵌入式系统700中,需要A/D(模拟/数字转换)接口705和串行接口706,用于测控的需要,这在通用计算机中用得很少。A/D接口705主要完成测试中所需要的模拟信号到数字信号的转换、和数字信号到模拟信号的转换。嵌入式系统700应用于工业生产时经常需要测试。由于单片机产生的是数字信号,在测试时需要转换成模拟信号用于测试,因此,与通用计算机不同,需要A/D(模拟/数字转换)接口705完成相关转换。另外,工业中经常需要多个嵌入式系统串接在一起,完成相关功能,因此需要用于将多个嵌入式系统串联的串行接口706,而在通用计算机中则大多不需要。
另外,嵌入式系统700作为一个基本的处理单元,常常在工业设计中需要将多个嵌入式系统700联成网络,因此需要将嵌入式系统700联入网络的网络接口707。这在通用计算机中大多也不需要。此外,根据实际应用和规模的不同,有些嵌入式系统700要采用外部总线704。随着嵌入式系统700应用领域的迅速扩张,嵌入式系统700越来越趋于个性化,根据自身特点采用总线的种类也越来越多。另外,为了对嵌入式处理器701内部电路进行测试,处理器芯片普遍采用了边界扫描测试技术。为了适应该测试,采用了调试接口708。
随着超大规模集成电路(Very Large Scale Integration)和半导体工艺的迅速发展,上述的嵌入式系统的部分或者全部可实现在一个硅片上,即为嵌入式片上系统(SoC)。
此外,本申请还公开了一种电子装置,该电子装置包括用于实现本文所述的各实施例的处理器核或处理器的装置。
本公开实施例的商业价值
本公开实施例实现能够减少处理器(或处理器核)中逻辑判断元件的数量,从而降低处理器成本。类似处理器可用于诸如笔记本和手机等终端设备以及某些消费型电子产品,因此本公开实施例具备了商业价值和经济价值。
需要领会,以上所述仅为本发明的优选实施例,并不用于限制本发明,对于本领域技术人员而言,本说明书的实施例存在许多变型。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
应该理解,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同或相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于装置和系统实施例中描述的方法,所以描述的比较简单,相关之处参见其他实施例的部分说明即可。
应该理解,上述对本说明书特定实施例进行了描述。其它实施例在权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
应该理解,本文用单数形式描述或者在附图中仅显示一个的元件并不代表将该元件的数量限于一个。此外,本文中被描述或示出为分开的模块或元件可被组合为单个模块或元件,且本文中被描述或示出为单个的模块或元件可被拆分为多个模块或元件。
还应理解,本文采用的术语和表述方式只是用于描述,本说明书的一个或多个实施例并不应局限于这些术语和表述。使用这些术语和表述并不意味着排除任何示意和描述(或其中部分)的等效特征,应认识到可能存在的各种修改也应包含在权利要求范围内。其他修改、变化和替换也可能存在。相应的,权利要求应视为覆盖所有这些等效物。