电子设备,修补装置及方法

文档序号:6581034阅读:151来源:国知局

专利名称::电子设备,修补装置及方法
技术领域
:本发明有关于固件函数修补,且特别有关于电子设备,修补装置及修补方法。
背景技术
:电子设备通常使用只读存储器(Read-OnlyMemory,以下简称为ROM)存储固件(firmware)。因为存储在ROM的数据无法更改,故当固件出现错误时,可导致ROM故障。为解决这一问题,根据现有技术,通常使用快闪只读存储器(flashROM)代替所述R0M。快闪只读存储器为可被电擦除(erased)及改编(^programmed)的非易失性存储器(non-volatilememory)。然而,快闪只读存储器价格高昂。
发明内容有鉴于此,本发明特提供电子设备,修补装置及方法。在本发明的一个实施方式中,修补装置包括存储器,指令产生器,第一复用器以及修补决定单元。存储器包括只读存储器代码区域以及修补函数区域。只读存储器代码区域存储多个固件函数,修补函数区域存储修补函数,修补函数用来代替固件函数其中之一。第一复用器耦接至存储器及指令产生器。修补决定单元耦接至指令产生器及第一复用器,从处理器获得提取地址,并决定提取地址是否相应于被代替的固件函数。当提取地址不相应于被代替的固件函数时,修补决定单元指示第一复用器输出只读存储器代码区域的提取地址的指令以响应处理器。当提取地址相应于被代替的固件函数时,修补决定单元指示第一复用器输出指令产生器产生的人工指令以响应处理器。其中人工指令为相应于多个修补中间指令的一系列机器代码其中之一,修补中间指令用来指示处理器跳转至修补函数的开始地址。在本发明的另一个实施方式中,提供一种修补方法,利用修补函数代替多个固件函数至少其中之一,固件函数存储在ROM代码区域,所述方法包括从处理器获得提取地址,获得指向被代替固件函数的开始的源地址,决定提取地址是否位落在由源地址与源地址加上预定值之间的地址范围之内,当提取地址落在地址范围之内时,产生并以人工指令响应处理器;且当提取地址未落在地址范围之内时,提取并以来自提取地址的指令响应处理器。其中人工指令为相应于多个修补中间指令的一系列机器代码其中之一,修补中间指令用来指示处理器跳转至目的地址。本发明的又一个实施方式提供一种电子设备,包括存储器,处理器及指令提供单元。存储器包括只读存储器代码区域以及修补函数区域,只读存储器代码区域存储多个固件函数,修补函数区域存储修补函数,修补函数用来代替固件函数其中之一,其中,源地址指向被代替的固件函数的开始,及目的地址指向修补函数的开始。指令提供单元,耦接至存储器与处理器,从处理器获得多个提取地址,并且当来自源地址的多个提取地址不超过预定值时,以多个人工指令响应处理器。其中人工指令为相应于多个修补中间指令的一系列机器代码其中之一,修补中间指令用来指示处理器跳转至目的地址。本发明通过所提供的电子设备,修补装置及方法,方便地修补缺陷固件函数。图1为根据本发明的一个实施方式的电子设备的方块图。图2A为寄存器的一个实施方式的示意图。图2B为修补决定单元的一个实施方式的示意图。图2C为THUMB模式修补决定单元的一个实施方式的示意图。图2D为ARM模式修补决定单元的一个实施方式的示意图。图2E为ARM模式修补决定单元的另一个实施方式的示意图。图2F为指令产生器的一个实施方式的示意图。图2G为THUMB指令产生器的一个实施方式的示意图。图2H为THUMB指令产生器的另一个实施方式的示意图。图21为ARM指令产生器的一个实施方式的示意图。图2J为ARM指令产生器的另一个实施方式的示意图。图2K为ARM指令产生器的又一个实施方式的示意图。图3为修补配置文件区域的一个实施方式的数据结构的示意图。图4为分支指令的格式的示意图。图5为修补装置与处理器之间的范例操作示意图。图6为用于修补固件函数的修补方法的一个实施方式的流程图。图7为用于修补固件函数的修补方法的另一个实施方式的流程图。具体实施例方式为使本发明的上述和其它目的、特征、和优点能更明显易懂,下文特举出较佳实施方式,并配合附图,作详细说明如下。应注意,以下所述实施方式仅用来例示本发明的目的,其并非本发明的限制。本发明的权利范围应以权利要求为准。图1为根据本发明的一个实施方式的电子设备(electronicapparatus)的方块图。电子设备主要包括修补装置(patchingdevice)100及处理器(processor)102。处理器102为通用处理器(general-purposedprocessor)。修补装置100至少包括存储器104(memory)及指令提供单元(instructionprovidingunit)112。指令提供单元112至少包括寄存器(registers)116,修补决定单元(patchdeterminationunit)118,指令产生器(instructiongenerator)120,及复用器(multiplexer)128。本发明一个实施方式中,寄存器116包括多个寄存器。存储器104包括R0M代码区域106以存储固件函数,修补配置文件区域(patchprofileregion)108以存储配置文件信息,及修补函数区域(patchfunctionregion)110以存储多个修补函数,每一修补函数均可用来代替缺陷固件函数。ROM代码区域106可被配置于只读存储器,或可擦写存储器(rewritablememory)的只读区域,可擦写存储器例如为随机存取存储器(randomaccessmemory,RAM),闪存(flashmemory),或者其它存储器。存储在ROM代码区域106的一个或多个固件函数可能有缺陷(flawed),需要被替换为存储在修补函数区域110的修补函数。修补函数区域110可被配置于可擦写存储器,例如RAM,闪存,或者其它存储器。在处理器102运行ROM代码区域106的固件函数之前,修补函数可存储在修补函数区域110。修补配置文件区域108可被配置于可擦写存储器,例如RAM,闪存,或者其它存储器。在处理器102运行ROM代码区域106的固件函数之前,配置文件信息可存储在修补配置文件区域108。修补配置文件区域108的细节在后续段落描述。处理器102通过每一指令的存储器地址存取指令。典型地,处理器102包括程序计数器(programcounter),寄存器,用来指出系统(system)在其指令顺序中的位置。程序计数器存放下一待执行的指令的地址。程序计数器在每一指令周期自动增加,例如4或2,以使得指令从存储器104被正常地依次(sequentially)撷取。某些指令,如分支及子程序(subroutine)调用(call)与返回(return),通过在程序计数器中放置新值来中断这一顺序。为提取指令来执行,处理器102传送地址"Addr"(也可称做提取地址)至修补装置IOO。修补装置100决定收到的地址是否相应于需要被修补的缺陷函数。若相应,则产生并以人工指令(artificialinstruction)响应处理器102以再指示(redirect)程序执行相关的修补函数。否则,以所述提取地址的指令响应处理器102。修补装置100主要包括存储器104,寄存器116,修补决定单元118,指令产生器120及复用器128。存储器104至少包括ROM代码区域106,修补配置文件区域108及修补函数区域110。其中,ROM代码区域106及修补函数区域110分别存储固件函数及修补函数。每一固件函数及修补函数均可包括排列在连续空间的32位(4字节)或16位(2字节)指令组。寄存器116存储关于ROM代码区域106的固件函数需要被修补函数区域110的相关修补函数所代替的信息。修补决定单元118根据高速缓存(cached)在寄存器116的信息决定是否使能修补。若使能修补,则修补决定单元118将匹配索引(matchingindex)存储至寄存器116其中之一,并且使能复用器128来输出指令产生器120产生的人工指令。否则,修补决定装置118使能复用器128来输出R0M代码区域106的接收地址的指令(可称为R0M指令)或修补函数区域110的接收地址的指令(可称为修补指令)。代码产生器120根据高速缓存在寄存器116和/或修补配置文件区域108的信息产生人工指令。本段详细阐述寄存器116。图2A为寄存器的一个实施方式的示意图。寄存器116至少包括一对32位使能寄存器(enablingregister)211a与32位模式寄存器(moderegister)21lb,索引寄存器(indexregister)213及32对源地址寄存器(sourceaddressregisters)215a至215a[31]与目的地址寄存器(destinationaddressregisters)215b至215b[31]。也就是说,上述电子设备最多能代替32个固件函数。本领域的技术人员可设置电子设备以提供更多或更少修补能力,提供更多或更少对源地址寄存器与目的地址寄存器,并且使能寄存器211a与模式寄存器211b实际占用的位数相应改变。例如,当使用16对源地址寄存器与目的地址寄存器时,使能寄存器211a与模式寄存器211b均占用16位。图2A中,数字0表示使能寄存器211a与模式寄存器211b的第0位,相似的,数字1、2......29、30、31分别表示使能寄存器211a与模式寄存器211b的第1、2......29、30、31位。使能寄存器211a的第n位指示第n对源地址寄存器与目的地址寄存器的内容是否可用。其中,例如"l"代表第n对源地址寄存器与目的地址寄存器分别记录ROM代码区域106的缺陷函数的开始地址与修补函数区域110的修补函数的开始地址,并且"0"代表相反含义。当使能寄存器211a的第n位为"1"时,模式寄存器211b的第n位指示相应的缺陷或修补函数执行于进阶精简指令集机器(AdvancedReducedInstructionSetComputingMachine,以下简称为ARM)模式或拇指(以下简称为THUMB)模式。其中,例如"1"代表相应的缺陷函数执行于THUMB模式,而"0"代表相反的含义。本领域的技术人员应可理解,执行于ARM模式的缺陷或修补函数的每一指令占用4字节(即32位);并且执行于THUMB模式的缺陷或修补函数的每一指令占用2字节(即16位)。本领域的技术人员应可理解,相较于ARM模式,THUMB模式下,指令占用相对较少的位来表示待跳转的偏移量,由此,所占用的位难以覆盖存储器104待跳转的整个范围。索引寄存器213记录匹配索引。匹配索引相应于可用的源地址寄存器及目的地址寄存器对其中之一。匹配索引产生的详细过程将在下文描述。本段详细说明修补配置文件区域108。请参阅图3,图3为修补配置文件区域的一个实施方式的数据结构的示意图。修补配置文件区域始于起始地址"Profile—Start_Addr"。修补配置文件区域108至少包括32位(4字节)的使能位图(enablingbitmap)311、32位的模式位图(modebitmap)313、32个32位固件函数地址记录(firmwarefunctionaddressrecords)(即源地址记录)315、315[1]......315[31]以及32个32位修补函数地址记录(patchfunctionaddressrecords)(即目的地址记录)317、317[1]......317[31]。如图3所示,使能位图、模式位图、固件函数地址记录、修补函数地址记录可分别存储于从起始地址Profile_Start_Addr开始,且距离Profile_Start_Addr分别为0、0x4、0x8......0x84、0x88、0x8c......0x104的地址。使能位图311、模式位图313分别存储与使能寄存器211a、模式寄存器211b相同的信息。固件函数地址记录315至315[31]分别存储与源地址寄存器215a至215a[31]相同的信息,并且修补函数地址记录317至317[31]分别存储与目的地址寄存器215b至215b[31]相同的信息。本段详细说明修补决定单元118。图2B为修补决定单元的一个实施方式的示意图。例如,若电子设备设置为代替最多32个固件函数,则修补决定单元118包括32个THUMB模式修补决定单元118a、118a[1]......118a[31]、32个ARM模式修补决定单元118b、118b[1]......118b[31]、或门(orgate)231以及索引转换器(indexconverter)233。本领域的技术人员可设置电子设备以提供更多或更少修补能力,提供更多或更少对源地址寄存器与目的地址寄存器。每一THUMB模式修补决定单元118a......118a[31]及ARM模式修补决定单元118b......118b[31],耦接至处理器(例如图1的处理器102)及寄存器(例如图1的寄存器116),用来检测修补函数是否存在于修补函数区域中(例如图1的修补函数区域110),修补函数是否存在由使能寄存器(例如图2A的使能寄存器211a)的相关位、模式寄存器(例如图2A的模式寄存器211b)的相关位、来自处理器(例如图1的处理器102)的地址,以及源地址寄存器(例如图2A的源地址寄存器215a至215a[31])的相关源地址表示。地址表示为"Addr"。使能寄存器的位表示为"Enab1e_0"、"Enab1e_l"......"Enab1e_31"。模式寄存器的位表示为"Mode—O"、"Mode_l"......"Mode_31"。源地址寄存器表示为"Source"、"Source......"Source[31]"。对于每一THUMB模式修补决定单元或ARM模式修补决定单元,当检测到存在修补函数时,输出匹配信号"l"或者真作为或门231及索引转换器233的输入,否则,输出匹配信号"0"或者假。当THUMB模式修补决定单元或ARM模式修补决定单元输出"1"或者真时,或门231输出控制信号"1"或者真,表示为"Enable—Patch",以指示复用器(例如图1的复用器128)输出指令产生器(例如图1的指令产生器120)产生的人工指令。索引转换器233收集所有匹配信号且输出索引"MatchJndex"以指示哪个修补决定单元检测到存在修补函数。例如,当所有THUMB及ARM模式修补决定单元均输出"0"或者假时,索引转换器233输出专有样式(proprietarypattern)(例如"0xFFFFFFFF");当THUMB模式修补决定单元118[4]输出"1"或者真时,索引转换器233输出4。输出索引"Match—Index"被存储在索引寄存器(例如图2A的索引寄存器213)以用于后续参考。本段详细说明THUMB模式修补决定单元118a至118a[31]。图2C为THUMB模式修补决定单元118a[n]的一个实施方式的示意图。118a[n]至少包括比较器251与比较器252,以及与门(ANDgate)253,其中n表示0至31之间的一个值。比较器251与比较器252均获得来自处理器(例如图1的处理器102)的地址"Addr"(提取地址)以及存储在第n源地址寄存器的源地址"Source[n]"。当地址"Addr"大于或者等于源地址"Source[n]"时,比较器251输出"l"或者真。当地址"Addr"小于源地址加上一范围值(例如32)时,比较器252输出"1"或者真。与门253获得比较器251与比较器252的输出、使能寄存器(例如图2A的使能寄存器211a)的第n位"Enable—n"、以及模式寄存器(例如图2A的模式寄存器211b)的第n位"Mode—n"作为其输入。当所有输入均为"1"或者真时,与门253输出为"1"或者真的输出匹配信号"Match_T_n";否则,至少一输入不为"1"或者真时,与门253瑜出为"0"或者假的输出匹配信号"MatchJ^n"。请参阅图2B,THUMB模式修补决定单元118a、118a[1]......118a[31]分别输出匹配信号Match_T_0、Match—T—l......Match—T_31。本段详细说明ARM模式修补决定单元118b至118b[31]。图2D为ARM模式修补决定单元118b[n]的一个实施方式的示意图。ARM模式修补决定单元118b[n]至少包括比较器254与比较器255、反相器256、以及与门257,其中n表示0至31之间的一个值。比较器254与比较器255均获得来自处理器(例如图1的处理器102)的地址"Addr"以及存储在第n源地址寄存器的源地址"Source[n]"。当地址"Addr"大于或者等于源地址"Source[n]"时,比较器254输出"1"或者真。当地址"Addr"小于源地址加上一范围值(例如36)时,比较器255输出"1"或者真。反相器256将模式寄存器(例如图2B的模式寄存器211b)的第n位"Mode—n"反相并输出"Mode—n"的反相值。与门257获得比较器254与比较器255的输出、反相器256的输出、以及使能寄存器(例如图2A的使能寄存器211a)的第n位"Enable—n"作为其输入。当所有输入均为"1"或者真时,与门257输出为"1"或者真的匹配信号"Match—A—n";否则,至少一输入不为"l"或者真时,与门257输出为"0"或者假的输出匹配信号"Match—A—n"。请参阅图2B,ARM模式修补决定单元118b、118b[1]......118b[31]分别输出匹配信号Match_A_0、Match_A_l......Match_A_31。图2E为ARM模式修补决定单元118b[n]的另一个实施方式的示意图。ARM模式修补决定单元118b[n]至少包括比较器258、反相器259、以及与门260,其中n表示0至31之间的一个值。比较器258获得来自处理器(例如图1的处理器102)的地址"Addr"(即提取地址)以及存储在第n源地址寄存器的源地址"Source[n]";并且当地址"Addr"等于源地址"Source[n]"时,比较器258输出"1"或者真。反相器259将模式寄存器(例如图2B的模式寄存器211b)的第n位"Mode—n"反相并输出"Mode_n"的反相值。与门260获得比较器258的输出、反相器259的输出、以及使能寄存器(例如图2A的使能寄存器211a)的第n位"Enables"作为其输入。当所有输入均为"1"或者真时,与门260输出为"1"或者真的匹配信号"Match_A_n";否则,至少一输入不为"1"或者真时,与门260输出为"0"或者假的输出匹配信号"Match_A_n"。请参阅图2B,ARM模式修补决定单元118b、118b[1]......118b[31]分别输出匹配信号Match_A_0、Match_A_l......Match_A_31。本段详细说明指令产生器(instructiongenerator)120。图2F为指令产生器的一个实施方式的示意图。指令产生器120至少包括THUMB指令产生器271、ARM指令产生器272及复用器273。THUMB指令产生器271耦接至处理器(例如图1的处理器102)、寄存器(例如图1的寄存器116)及存储器(例如图1的存储器104),以从处理器(例如图1的处理器102)获得地址以及从索引寄存器(例如图2A的索引寄存器213)获得输出索引"Match—Index"。当获得的输出索引"Match—Index"显示获得的地址相应于ROM代码区域的需要被代替的固件函数时,THUMB指令产生器271可获得源地址"Source[Match—Index]"及目的地址"Destination[Match_Index]",并根据获得的地址"Addr"、源地址"Source[Match_Index]"及目的地址"Destination[MatchJndex]"产生并输出一系列THUMB人工指令。其中源地址"Source[Match_Index]"为第Match_Index个源地址寄存器(例如图2A的源地址寄存器215a至215a[31]之一)的源地址;目的地址"Destination[Match_Index]"为来自目的地址寄存器(例如图2A的目的地址寄存器215a至215a[31]之一)或者存储器的修补配置文件区域(例如图1的修补配置文件区域108)的第Match—Index个目的地址寄存器。ARM指令产生器272耦接至处理器(例如图1的处理器102),寄存器(例如图1的寄存器116)及存储器(例如图1的存储器104),以从处理器(例如图1的处理器102)获得地址以及从索引寄存器(例如图2A的索引寄存器213)获得输出索引"MatchJndex"。请同时参阅图2D所示的ARM模式修补决定单元的实施方式118b[MatchJndex],当获得的输出索引"MatchJndex"显示获得的地址相应于ROM代码区域的需要被代替的固件函数相应时,ARM指令产生器272可根据获得的地址"Addr"、源地址"Source[Match_Index]"及目的地址"Destination[Match—Index]"或它们的任意组合执行相似而又不同的操作以产生并输出一系列ARM人工指令。请同时参阅图2E所示的ARM模式修补决定单元的实施方式118b[Match_Index],当获得的输出索引"Match_Index"显示获得的地址与R0M代码区域的需要被代替的固件函数相应时,ARM指令产生器272可根据获得的地址"Addr"、源地址"Source[Match_Index]"及目的地址"Destination[Match_Index]"产生并输出ARM人工指令。复用器273耦接至THUMB指令产生器271及ARM指令产生器272的输出,根据模式寄存器(例如图2A的模式寄存器211b)的第Match_Index位"ModejMatchJndex)"选择性地输出THUMB人工指令或ARM人工指令作为输出的人工指令。更具体地,当模式寄存器的第Match—Index位为"1"时,复用器273输出THUMB人工指令,否则,输出ARM人工指令。本段详细说明THUMB指令产生器271。请同时参阅图2C所示的THUMB模式修补决定单元118a[Match_Index],图2G为THUMB指令产生器的一个实施方式的示意图。THUMB指令产生器至少包括减法器274,数据撷取器275及查找表276。查找表276可位于存储器(例如图1的104存储器),寄存器(例如图1的寄存器116),或者其它地方。如图2G所示,查找表276可相应于地址0x00、0x02、0x04、0x06、0x08、0x0a、0x0c、0xl0、0x14。查找表276包括相应于THUMB修补中间指令的一系列机器代码。范例机器代码及相关的THUMB修补中间指令可列于表1中。表1<table>tableseeoriginaldocumentpage11</column></row><table>当执行指令"PUSH(rl,r2,rl4}"的机器代码时,处理器将寄存器"rl"、"r2"及"rl4"的值压入(push)至堆栈,其中寄存器"rl4"存储返回地址。当执行指令"LDRrl,patch_idx"及"LDRr2,patch_fp"的机器代码时,处理器分别将变量"patch_idx"与"patch—fp"的值存储至寄存器"rl"与"r2",其中变量"patch—fp"的值指向修补函数区域(例如图1的修补函数区域110)的起始地址,变量"patchjdx"的值显示从修补函数区域开始处的偏移量,并且所述偏移量等于输出索引"Match—Index"乘以4。当执行指令"ADDr2,r2,rl"的机器代码时,处理器将寄存器"rl"的值加上寄存器"r2"的值并将计算结果存储在寄存器"r2"中,其中计算结果指向第[Match—Index]目的地址记录的地址。当执行指令"LDRr2,[r2]"的机器代码时,处理器提取寄存器"r2"的值指向的地址的值,并将提取的值存储至寄存器"r2"。其中,提取的值指向修补函数区域(例如图1的修补函数区域110)的第"MatchJndex"修补函数的起始地址。本领域的技术人员应可理解,上述"ADDr2,r2,rl"及"LDRr2,[r2]"的功能可直接从目的寄存器(例如图2A的目的寄存器215b至215b[31]之一)撷取第Match_Index目的地址寄存器的目的地址"Destination[Match_Index]"并将撷取的地址存储至寄存器"r2"。当执行指令"BLXr2"的机器代码时,处理器跳转至寄存器"r2"的值指向的地址,以旁路(bypass)相应固件函数并且执行第[Match_Index]修补函数。当执行指令"P0P(rl,r2,pcr的机器代码时,处理器弹出(pop)堆栈的三个值并依次存储至"rl","r2"及程序计数器。减法器274从收到的来自处理器(例如图1的处理器102)的地址中减去源地址"Source[Match—Index]"以获得偏移量并且将获得的偏移量输出至数据撷取器275。其中源地址为第Match—Index源地址寄存器(例如图2A的源地址寄存器215a至215a[31]之一)或第Match_Index源地址记录(例如图3的源地址记录315至315[31]之一)的源地址。数据撷取器275可为直接存储器存取(directmemoryaccess,DMA)控制器,根据收到的偏移量从查找表276撷取机器代码并且输出已撷取的机器代码作为THUMB人工指令。请同时参阅图2C所示的THUMB模式修补决定单元118a[Match_Index],图2H为THUMB指令产生器的另一个实施方式的示意图。THUMB指令产生器271至少包括减法器274、数据撷取器277、复用器279、以及一系列代码产生单元278、278[1]、278[2]、278[3]、278[4]、278[5]、278[6]、278[7]。代码产生单元278至278[7]产生如表1的第2行至第8行所示的机器代码。减法器274从收到的来自处理器(例如图1的处理器102)的地址(即提取地址)中减去源地址"Source[Match—Index]"以获得偏移量并且将获得的偏移量输出至数据撷取器277。其中源地址为第Match—Index源地址寄存器(例如图2A的源地址寄存器215a至215a[31]之一)或第Match_Index源地址记录(例如图3的源地址记录315至315[31]之一)的源地址。数据撷取器277将收到的偏移量除以2并且控制复用器279输出第(偏移量/2)代码产生单元的机器代码作为THUMB人工指令。本段详细说明ARM指令产生器272。请同时参阅图2D所示的ARM模式修补决定单元118b[Match—Index],图21为ARM指令产生器的一个实施方式的示意图。ARM指令产生器至少包括减法器281,数据撷取器282及查找表283。查找表283可位于存储器(例如图1的存储器104),寄存器(例如图1的寄存器116中的一部分寄存器),或者其它地方。查找表283包括相应于ARM修补中间指令的一系列机器代码。如图21所示,查找表283可相应于地址0x0、0x4、0x8、0xc、0xl0、0xl4、0xl8、0xlc、0x20。范例机器代码及相关的ARM修补中间指令可列于表2中。表2<table>tableseeoriginaldocumentpage12</column></row><table>当执行指令"STMFDr13!,{rl,rl4}"的机器代码时,处理器将寄存器"rl"及"rl4"的值压入堆栈,其中寄存器"rl4"存储返回地址并且寄存器"rl3"的一个值指向堆栈的起始地址。处理器执行指令"LDRrl,patch_fp"、"LDRrl,[rl,#0]"、"LDRr14,patch_idx"、"LDRr14,[rl4,rl,LSL#2]"及"BLXrl4"的机器代码的操作细节为本领域的技术人员所熟知,并且可通过参考查阅表l的描述类比推断。本领域的技术人员应可理解,ARM修补中间指令可用于直接撷取目的地址"Destination[Match—Index]",并将撷取的目的地址存储至寄存器"rl4"。其中,目的地址"Destination[Match_Index]"为第Match_Index目的地址寄存器(例如图2A的目的地址寄存器215b至215b[31])的目的地址。当执行指令"LDMFDr13!,{r2,pc}"的机器代码时,处理器从堆栈中弹出值并依次将弹出的值存储至寄存器"r1"及程序计数器。减法器281从收到的来自处理器(例如图1的处理器102)的地址中减去源地址"Source[Match—Index]"以获得偏移量并且将获得的偏移量输出至数据撷取器282。其中源地址为第Match—Index源地址寄存器(例如图2A的源地址寄存器215a至215a[31]之一)或第Match_Index源地址记录(例如图3的源地址记录315至315[31]之一)的源地址。数据撷取器282可为直接存储器存取(directmemoryaccess,DMA)控制器,根据收到的偏移量从查找表283中撷取机器代码并且将撷取的机器代码作为ARM人工指令。请同时参阅图2D所示的ARM模式修补决定单元118b[Match_Index],图2J为ARM指令产生器的另一个实施方式的示意图。ARM指令产生器至少包括减法器281,数据撷取器284,复用器286,以及一系列代码产生单元285、285[1]、285[2]、285[3]、285[4]、285[5]、285[6]、285[7]。代码产生单元285至285[7]产生如表2的第2行至第8行的机器代码。减法器281从收到的来自处理器(例如图1的处理器102)的地址(即提取地址)中减去源地址"Source[Match—Index]"以获得偏移量并且将获得的偏移量输出至数据撷取器284。其中源地址为第Match—Index源地址寄存器(例如图2A的源地址寄存器215a至215a[31]之一)或第Match_Index源地址记录(例如图3的源地址记录315至315[31]之一)的源地址。数据撷取器284将收到的偏移量除以4并且控制复用器286输出第(偏移量/4)代码产生单元的机器代码作为ARM人工指令。请同时参阅图2E所示的ARM模式修补决定单元118b[Match_Index],图2K为ARM指令产生器的又一个实施方式的示意图。ARM指令产生器272至少包括分支指令产生器291。分支指令产生器291从第Match—Index目的地址寄存器(例如图2A的目的地址寄存器215b至215b[31]之一)或者第Matchjndex目的地址记录(例如图3的目的地址记录317至317[31]之一)获得目的地址"Destination[MatchJndex]"并且获得第Match—Index源地址寄存器(例如图2A的源地址寄存器215a至215a[31]之一)或者第Match_Index源地址记录(例如图3的源地址记录315至315[31]之一)的源地址"Source[Match—Index]"。分支指令产生器291根据获得的源地址及目的地址依次产生并输出分支指令作为人工指令。分支指令的格式如图4所示。图4为分支指令的格式的示意图。例如,分支指令产生器291通过从目的地址"Destination[MatchJndex]"减去源地址"Source[Match_Index]"与8的和来计算字段signed_immed_24的内容,并且将相减结果向右移动2位。本领域的技术人员应可理解,当执行分支指令时,处理器(例如图1的处理器102)直接跳转至目的地址"Destination[Match—Index]"。如图4所示,分支指令的第0-23位为字段signecLimmecL24,第24位为字段L,第25-27位分别为"1"、"0"、"1",并且第28-31位为字段cond。图5为修补装置100与处理器102之间的范例操作示意图。缺陷THUMB模式固件函数可始于地址B,而相应修补函数可始于地址CI。地址B与地址Cl可分别于最初存储在源地址寄存器(例如图2A的源地址寄存器215a)与目的地址寄存器(例如图2A的目的地址寄存器215b)。此外,地址B与地址C1也可分别于最初存储在源地址记录(例如图3的源地址记录315)与目的地址记录(例如图3的目的地址记录317)。使能寄存器(例如图2A的使能寄存器211a)的第0位被设为"l"并且模式寄存器(例如图2A的211b)的第0位被设为"1"。假设地址A的指令为分支与链接(branchiith-link)指令以跳转至地址B并待返回于地址A+4(即分支与链接的下一指令)。固件执行过程中,处理器102试图从地址A提取指令。从处理器102收到地址A之后,修补装置100将地址A的分支与链接指令Instr(A)返回至处理器102。执行返回的分支指令期间,处理器102首先将地址A+4存储至"链接"("link")寄存器,根据返回的分支指令计算跳转地址B,以地址B更新程序计数器并且指示修补装置100从地址B返回指令。根据上述对图2B、图2C、图2F、图2G及图2H的描述,从处理器102收到地址B之后,修补装置100产生THUMB模式修补中间指令"PUSH(rl,r2,r14)"的机器代码并且将产生的机器代码,而不是地址B的指令,返回至处理器102,使得处理器102将寄存器"rl"、"r2"与"rl4"的值压入堆栈。类似地,当依次收到地址(B+2)、(B+4)、(B+6)、(B+8)时,修补装置100依次产生THUMB模式修补中间指令"LDRrl,patch—idx"、"LDRr2,patch_fp"、"ADDr2,r2,rl"及"LDRr2,[r2]"的机器代码并且将产生的机器代码,而不是地址(B+2)至(B+8)的指令,返回至处理器102。从处理器102收到地址(B+10)之后,修补装置100产生THUMB模式修补中间指令"BLXr2"的机器代码并且将产生的机器代码,而不是地址(B+10)的指令,返回至处理器102,使得处理器102执行指定的修补函数。执行返回的THUMB模式修补中间指令"BLXr2"的机器代码期间,处理器102首先将地址B+12存储至"链接"寄存器,以地址Cl更新程序计数器并且指示修补装置100从地址Cl返回指令Instr(Cl)。随后,处理器102依次提取并执行指定修补函数的指令Instr(Cl)至Instr(C2)。执行返回的指令lnstr(C2)过程中,处理器102读取"链接"寄存器以获得地址(B+12),并且指示修补装置100从地址(B+12)返回指令Instr(C2)。从处理器102收到地址(B+12)之后,修补装置100产生THUMB模式修补中间指令"POP(rl,r2,pc}"的机器代码并且将产生的机器代码,而不是地址(B+12)的指令,返回至处理器102,使得处理器102指示修补装置100从地址(A+4)返回地址(A+4)的指令Instr(A+4)。可以通过类比推断出后续指令的执行细节。应注意,所示的修补函数的实施方式中,起始地址为B的缺陷固件函数由起始地址为Cl的修补函数所修补。图6为用于修补固件函数的修补方法的一个实施方式的流程图。修补方法由修补装置(例如图1的修补装置100)执行。程序(process)开始于从处理器(例如图1的处理器102)获得提取地址以及从修补配置文件区域(例如图1的修补配置文件区域108)或者寄存器(例如图1的寄存器116)获得多个源地址(步骤S611),其中,R0M代码区域(例如图1的R0M代码区域106)的提取地址存储处理器试图提取的固件函数的指令,并且每一源地址指向一个缺陷固件函数的开始地址。决定每一源地址与该源地址加上预定值(例如32)之间的地址范围,例如根据源地址决定所述地址范围(步骤S613)。然后,决定提取地址是否落在地址范围内(步骤S631),此步骤的决定可由修补决定单元(例如图1的修补决定单元118)实现。若提取地址落在地址范围内时,则程序进行至人工指令提供程序(procedure)(至少包括步骤S633至步骤S675),以产生并以人工指令响应处理器,否则,进行至正常指令(normalinstruction)提供程序(至少包括步骤S691与步骤S693)以从提取地址撷取指令并以此指令响应处理器。正常指令提供程序中,从ROM代码区域的提取地址撷取指令(步骤S691),接着,以撷取的指令响应处理器(步骤S693)。人工指令提供程序中,决定提取地址相应于THUMB模式指令还是ARM模式指令(步骤S633)。步骤S633可通过检测模式寄存器(例如图2A的模式寄存器211b)的相关位实现,其中所述的相关位相应于落入地址范围(fallenaddressrange)。当提取地址相应于THUMB模式指令时,计算提取地址与源地址之间的偏移量(步骤S651),其中偏移量形成落入地址范围。根据计算出的偏移量,产生THUMB人工指令,例如表1所列的THUMB修补中间指令(步骤S653),并且以所产生的THUMB人工指令,而不是提取地址的指令来响应处理器(步骤S655)。步骤S651与步骤S653可通过THUMB指令产生器(例如图2G或图2H的THUMB指令产生器271)执行。当提取地址相应于ARM模式指令时,计算提取地址与源地址之间的偏移量(步骤S671),其中偏移量形成落入地址范围。根据计算出的偏移量,产生ARM人工指令,例如表2所列的ARM修补中间指令(步骤S673),并且以所产生的ARM人工指令,而不是提取地址的指令来响应处理器(步骤S675)。步骤S671与步骤S673可通过ARM指令产生器(例如图2I或图2J的THUMB指令产生器272)执行。图7为用于修补固件函数的修补方法的另一个实施方式的流程图。修补方法通过修补装置(例如图1的修补装置100)执行。图6与图7的区别在于程序决定提取地址相应于ARM模式指令之后的操作。当提取地址相应于ARM模式指令时,从修补配置文件区域(例如图1的修补配置文件区域108)或者寄存器(例如图1的寄存器116)获得指向修补函数区域(例如图1的修补函数区域110)的修补函数的开始的目的地址(步骤S711)。计算源地址与目的地址之间的偏移量(步骤S713),根据计算的偏移量产生分支指令,分支指令的范例格式如图4所示(步骤S715)。以所产生的分支指令,而不是提取地址的指令来响应处理器(步骤S717)。当执行分支指令时,处理器(例如图1的处理器102)直接跳转至目的地址。步骤S711至步骤S717可通过分支指令产生器(例如图2K的分支指令产生器291)执行。以上所述仅为本发明的较佳实施方式,凡依本发明权利要求所做的均等变化和修饰,均应属本发明的涵盖范围。权利要求一种修补装置,包括存储器,包括只读存储器代码区域以及修补函数区域,该只读存储器代码区域存储多个固件函数,该修补函数区域存储修补函数,该修补函数用来代替该多个固件函数其中之一;指令产生器;第一复用器,耦接至该存储器及该指令产生器;以及修补决定单元,耦接至该指令产生器及该第一复用器,从处理器获得提取地址,决定该提取地址是否相应于被代替的固件函数,当该提取地址不相应于该被代替的固件函数时,指示该第一复用器输出该只读存储器代码区域的该提取地址的指令以响应该处理器;且当该提取地址相应于该被代替的固件函数时,指示该第一复用器输出由该指令产生器产生的人工指令以响应该处理器;其中该人工指令为相应于多个修补中间指令的一系列机器代码其中之一,该多个修补中间指令用来指示该处理器跳转至该修补函数的开始地址。2.根据权利要求1所述的修补装置,其特征在于,该提取地址的指令及该人工指令为16位指令。3.根据权利要求1所述的修补装置,其特征在于,该多个修补中间指令包括第一修补中间指令,用来指示该处理器将返回地址压入堆栈;第二修补中间指令,在该第一修补中间指令之后,并用来指示该处理器跳转至存储在寄存器的目的地址;以及第三修补中间指令,在该第二修补中间指令之后,并用来指示该处理器从该堆栈中弹出该返回地址,并跳转至该返回地址。4.根据权利要求1所述的修补装置,其特征在于,该修补装置还包括寄存器,存储指向该被代替的固件函数的开始的源地址,其中该修补决定单元还包括第一比较器,耦接至该寄存器,当该提取地址大于或者等于该源地址时,输出"1"或者真;第二比较器,耦接至该寄存器,当该提取地址小于该源地址加上范围值时,输出"l"或者真;以及与门,耦接至该第一比较器及该第二比较器的输出,当该第一比较器及该第二比较器的输出均为"l"或者真时,输出"l"或者真以指示该第一复用器输出该人工指令以响应该处理器,并且当该第一比较器及该第二比较器的输出其中至少之一不为"l"或者真时,输出"O"或者假以指示该第一复用器输出该提取地址的指令以响应该处理器。5.根据权利要求4所述的修补装置,其特征在于,该修补装置还包括查找表,存储相应于该多个修补中间指令的机器代码,其中,该指令产生器还包括减法器,通过从该提取地址中减去该源地址产生偏移量;以及数据撷取器,耦接至该减法器及该查找表,以从该减法器获得该偏移量,根据该偏移量从该查找表中撷取机器代码,并输出该机器代码作为该人工指令。6.根据权利要求4所述的修补装置,其特征在于,该修补装置还包括查找表,存储相应于该多个修补中间指令的机器代码,其中,该指令产生器还包括多个代码产生单元,每一代码产生单元产生一个机器代码;第二复用器,耦接至该多个代码产生单元作为其输入;减法器,通过从该提取地址中减去该源地址产生偏移量;以及数据撷取器,耦接至该减法器及该第二复用器,将该偏移量除以该人工指令的指令长度,并根据相除结果指示该第二复用器输出来自一个代码产生单元的机器代码作为该人工指令。7.根据权利要求1所述的修补装置,其特征在于,该修补装置还包括寄存器,存储指向该被代替的固件函数的开始的源地址,其中该修补决定单元还包括比较器,耦接至该寄存器,当该提取地址等于该源地址时,输出"1"或者真;以及与门,耦接至该比较器的输出,当该比较器的输出为"l"或者真时,该与门输出"l"或者真以指示该第一复用器输出该人工指令以响应该处理器;当该比较器的该输出非"l"或者真时,输出"O"或者假以指示该第一复用器输出该提取地址的指令以响应该处理器。8.根据权利要求7所述的修补装置,其特征在于,该指令产生器还包括分支指令产生器,获得该源地址及指向该修补函数的开始的目的地址,计算该源地址与该目的地址之间的差值,根据该差值产生分支指令,并且输出该分支指令以作为该人工指令;其中,当执行该分支指令时,该处理器跳转至该目的地址。9.一种电子设备,包括存储器,包括只读存储器代码区域以及修补函数区域,该只读存储器代码区域存储多个固件函数,该修补函数区域存储修补函数,该修补函数用来代替该多个固件函数其中之一,其中,源地址指向该被代替的固件函数的开始,及目的地址指向该修补函数的开始;处理器;以及指令提供单元,耦接至该存储器与该处理器,从该处理器获得多个提取地址,并且当来自该源地址的该多个提取地址不超过预定值时,以多个人工指令响应该处理器;其中该人工指令为相应于多个修补中间指令的一系列机器代码之一,该多个修补中间指令用来指示该处理器跳转至该目的地址。10.根据权利要求9所述的电子设备,其特征在于,该多个修补中间指令包括第一修补中间指令,用来指示该处理器将返回地址压入堆栈;第二修补中间指令,在该第一修补中间指令之后,并用来指示该处理器跳转至存储在寄存器的目的地址;以及第三修补中间指令,在该第二修补中间指令之后,并用来指示该处理器从该堆栈中弹出该返回地址,并跳转至该返回地址。11.根据权利要求10所述的电子设备,其特征在于,该寄存器为32位寄存器。12.—种修补方法,利用修补函数代替多个固件函数至少其中之一,该多个固件函数存储在只读存储器代码区域,该修补方法包括从处理器获得提取地址;获得指向该被代替固件函数的开始的源地址;决定该提取地址是否落在该源地址与该源地址加上预定值之间的地址范围之内;当该提取地址落在该地址范围之内时,产生并以人工指令响应该处理器;以及当该提取地址未落在该地址范围之内时,提取并以来自该提取地址的指令响应该处理器;其中,该人工指令为相应于多个修补中间指令的一系列机器代码之一,其中该多个修补中间指令用来指示该处理器跳转至该目的地址。13.根据权利要求12所述的修补方法,其特征在于,该产生并以人工指令响应该处理器的步骤还包括当该提取地址落在该地址范围之内时,决定该提取地址相应于16位指令还是32位指令;当该提取地址相应于该16位指令时,产生并以相应于第一修补中间指令的16位机器代码响应该处理器;以及当该提取地址相应于该32位指令时,产生并以相应于第二修补中间指令的32位机器代码响应该处理器。14.根据权利要求13所述的修补方法,其特征在于,该产生并以相应于第一修补中间指令的16位机器代码响应该处理器的步骤还包括计算该提取地址与该源地址之间的偏移量;根据该偏移量从相应于多个第一修补中间指令的多个16位机器代码中选择其一;以及以被选择的该16位机器代码响应该处理器作为人工指令。15.根据权利要求13所述的修补方法,其特征在于,该产生并以相应于第二修补中间指令的32位机器代码响应该处理器的步骤还包括计算该提取地址与该源地址之间的偏移量;根据该偏移量从相应于多个第二修补中间指令的多个32位机器代码中选择其一;以及以被选择的该32位机器代码响应该处理器作为人工指令。16.根据权利要求13所述的修补方法,其特征在于,该产生并以相应于第二修补中间指令的32位机器代码响应该处理器的步骤还包括获得指向修补函数的开始的目的地址;计算该源地址与该目的地址之间的偏移量;根据该偏移量产生分支指令;以及以该分支指令响应该处理器。17.根据权利要求16所述的修补方法,其特征在于,当执行该分支指令时,该处理器直接跳转至该目的地址。18.根据权利要求13所述的修补方法,其特征在于,该第一修补中间指令为拇指模式指令,该第二修补中间指令为进阶精简指令集机器模式指令。全文摘要本发明涉及电子设备,修补装置及方法。修补装置包括存储器,指令产生器,第一复用器以及修补决定单元。存储器包括只读存储器代码区域及修补函数区域。只读存储器代码区域存储固件函数,修补函数区域存储修补函数。修补决定单元获得提取地址,并决定提取地址是否相应于被代替的固件函数。当来自处理器的提取地址不相应于被代替的固件函数时,修补装置输出提取地址的指令以响应处理器。当提取地址相应于待被代替固件函数时,修补装置输出人工指令以响应处理器。人工指令为相应于多个修补中间指令的一系列机器代码的其中之一,所述修补中间指令用来指示处理器跳转至修补函数的开始地址。所述电子设备,修补装置及方法,可方便地修补缺陷固件函数。文档编号G06F9/445GK101727365SQ20091018074公开日2010年6月9日申请日期2009年10月21日优先权日2008年10月29日发明者万纬伦,许宏凯,许廷诚申请人:联发科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1