CN110178115B - 处理自修改代码的方法和装置 - Google Patents
处理自修改代码的方法和装置 Download PDFInfo
- Publication number
- CN110178115B CN110178115B CN201880006736.6A CN201880006736A CN110178115B CN 110178115 B CN110178115 B CN 110178115B CN 201880006736 A CN201880006736 A CN 201880006736A CN 110178115 B CN110178115 B CN 110178115B
- Authority
- CN
- China
- Prior art keywords
- instruction
- fetch
- fetch block
- branch
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 27
- 238000012545 processing Methods 0.000 title claims abstract description 24
- 239000000872 buffer Substances 0.000 claims abstract description 90
- 230000004044 response Effects 0.000 claims abstract description 16
- 230000008569 process Effects 0.000 claims description 4
- 238000000605 extraction Methods 0.000 description 5
- 230000009471 action Effects 0.000 description 4
- 230000002730 additional effect Effects 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000001902 propagating effect Effects 0.000 description 3
- 238000013507 mapping Methods 0.000 description 2
- 101100514059 Escherichia coli (strain K12) modE gene Proteins 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000005669 field effect Effects 0.000 description 1
- 238000011010 flushing procedure Methods 0.000 description 1
- 229910044991 metal oxide Inorganic materials 0.000 description 1
- 150000004706 metal oxides Chemical class 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3802—Instruction prefetching
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3802—Instruction prefetching
- G06F9/3812—Instruction prefetching with instruction modification, e.g. store into instruction stream
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30043—LOAD or STORE instructions; Clear instruction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30058—Conditional branch instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30145—Instruction analysis, e.g. decoding, instruction word fields
- G06F9/3016—Decoding the operand specifier, e.g. specifier format
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3802—Instruction prefetching
- G06F9/3804—Instruction prefetching for branches, e.g. hedging, branch folding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3861—Recovery, e.g. branch miss-prediction, exception handling
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Advance Control (AREA)
Abstract
提供了一种处理自修改代码的方法。所述方法由计算机处理器执行并且包括:从指令提取缓冲器接收指令数据的提取块;在将指令数据的所述提取块发送至所述计算机处理器的解码单元之前,确定所述提取块是否包括自修改代码的指令数据;响应于确定所述提取块包括自修改代码的指令数据,发送刷新信号以重置所述计算机处理器的一个或更多个内部缓冲器。
Description
技术领域
本发明总体上涉及计算机体系结构领域,更具体地,涉及处理自修改代码的方法和装置。
背景技术
自修改代码可以指代在由计算机处理器执行时修改自身的一组计算机代码。自修改代码被广泛用于运行时代码生成(例如,在实时编写期间)。自修改代码也被广泛用于嵌入式应用,以在代码执行期间优化内存使用,从而提高代码密度。
图1示出了自修改代码的示例。图1示出了软件代码102和104,软件代码102和104中的每一个都包括一定数量的可由计算机处理器执行的指令。软件代码102和104可以存储在存储器中的不同位置中。例如,软件代码102可以存储在存储器中与标签“old_code”(old_code)相关联的位置,软件代码104可以存储在存储器中与标签“new_code”相关联的位置。
软件代码102包括自修改代码部分106,所述自修改代码部分106包括“memcpyold_code,new_code,size”(存储复制)指令和“jmp new_code”(跳跃)分支指令。执行自修改代码部分106的“memcpy”指令会导致计算机处理器从“new_code”存储位置中获取数据,并将获取的数据存储在“old_code”存储位置。在执行“memcpy”指令之后,存储在“old_code”存储位置的软件代码102的至少一部分会被软件代码104所覆盖。此外,执行自修改代码部分106的“jmp old_code”分支指令也会导致计算机处理器获取并执行存储在目标位置的软件代码,在此情形中,为“old_code”存储位置。如上所述,在“old_code”存储位置的软件代码已经被自修改代码部分106更新。因此,在计算机处理器执行软件代码时,软件代码102的至少一部分被修改,因此,软件代码是“自修改的”。
为了减少存储器访问延迟的影响,计算机存储器通常采用预取方案,其中,所述计算机处理器从存储器中预取一组指令,并将所预取的指令存储至指令提取缓冲器。当计算机处理器需要执行指令时,它可以从指令提取缓冲器中而非存储器中获取指令。指令提取缓冲器通常比存储器需要更短的访问时间。使用图1的示意性示例,在计算机处理器执行软件代码102之前,它可以从“old_code”存储位置预取一定数量的指令,将指令存储至指令提取缓冲器,然后从指令提取缓冲器获取存储的指令用于执行。计算机处理器可以基于指令的执行顺序的一定假设来选择一组指令进行预取。
自修改代码可能会对上述预取方案造成管线(pipeline)危险,因为在代码修改之后,假设指令的执行顺序(基于该执行顺序选择一组指令进行预取)不再有效。结果,指令提取缓冲器可能预取不正确的指令,并提供不正确的执行指令。这会导致执行失败并增加计算机处理器的处理延迟。因此,为了确保修改后的软件代码的正确和及时执行,计算机处理器需要能够检测到软件代码的修改,并采取措施确保在软化代码被修改之后指令提取缓冲器预取一组正确的指令。
发明内容
本发明的实施例提供了一种处理自修改代码的方法,所述方法由计算机处理器执行并且包括:从指令提取缓冲器接收指令数据的提取块;在将所述指令数据的提取块发送到所述计算机处理器的解码单元之前,确定所述提取块是否包括自修改代码的指令数据;响应于确定所述提取块包括自修改代码的指令数据,发送刷新信号以重置所述计算机处理器的一个或更多个内部缓冲器。
本发明的实施例还提供了一种系统,所述系统包括:存储器,所述存储器存储指令数据;以及计算机处理器,所述计算机处理器被配置为处理所述指令数据。处理指令集包括所述计算机处理器被配置为:从指令提取缓冲器获取指令数据的提取块;在将所述指令数据的提取块发送给解码单元之前,确定所述指令数据的提取块是否包含自修改代码;响应于确定所述指令数据的提取块包含自修改代码,重置所述计算机处理器的一个或更多个内部缓冲器。
本发明的实施例还提供了一种计算机处理器,所述计算机处理器包括:分支预测缓冲器,所述分支预测缓冲器被配置为存储与预定分支指令相关联的地址与预测采用分支(predicted taken branch)的目标地址之间的配对;指令提取缓冲器,所述指令提取缓冲器被配置为根据存储在分支预测缓冲器中的配对存储从存储器预取的指令数据;指令提取单元,所述指令提取单元被配置为:从指令提取缓冲器接收指令数据的提取块;在将所述指令数据的提取块发送至计算机处理器的解码单元之前,基于存储在分支预测缓冲器和指令提取缓冲器中的至少一个中的信息,确定提取块是否包括自修改代码的指令数据;以及响应于确定所述提取块包括自修改代码的指令数据,发送刷新信号以重置计算机处理器的一个或更多个内部缓冲器。
所公开的实施例的其他目的和优点将部分地在以下描述中阐述,并且部分地将从描述中显而易见,或者可以通过实施例的实践而获知。所公开的实施例的目的和优点可以通过权利要求中阐述的元件和组合来实现和获得。
应当理解,前面的一般性描述和以下的详细描述二者都只是示例性和说明性的,并不是对要求保护的所公开的实施方式的限制。
附图说明
图1为示出自修改代码的示例的图。
图2为示出可以使用本公开的实施例的计算机系统的示意图。
图3A和图3B为示出自修改代码造成的潜在管线危险的示意图。
图4为示出根据本发明的实施例的用于检测自修改代码的示例性预取状态寄存器的示意图。
图5为示出根据本发明的实施例的处理自修改代码的示例性方法的流程图。
具体实施方式
现在将详细地参考示例性实施例,其示例如附图所示。以下描述参考附图,其中,除非另有说明,不同附图中相同的数字表示相同或相似的元件。示例性实施例的以下说明中所述的实施方式并不代表与本发明一致的所有实施方式。相反,它们只是与所附的权利要求中所述的与本发明有关的方面一致的装置和方法的示例。
本发明的实施例提供了一种处理自修改代码的方法和装置。利用本发明的一个实施例,在将指令数据转发以便解码和执行之前,可以从预取的指令数据中检测自修改代码的指令。结果,可以降低由于自修改代码引起的上述管线危险而识别和执行错误指令的可能性。此外,当在对预取的指令进行解码并执行之前检测到管线危险时,也可以采取纠正动作,从而防止错误的解码结果通过管线进行传播。结果,可以确保正确并及时地执行修改后的软件代码。
现在参考图2,图2示出了本公开的实施例可以使用的计算机系统200。如图2所示,计算机系统200包括计算机处理器202和彼此通信联接的存储系统220。例如,存储系统220可包括例如高速缓存和动态随机存取存储器(DRAM)。存储系统220可以存储计算机处理器202可执行的指令以及执行这些指令时要处理的数据。指令和数据二者都以二进制格式(1和0)表示并存储在存储系统220中。
计算机处理器202还包括用于分阶段获取并执行指令的处理管线。如图2所示,处理管线可包括指令提取单元203、指令解码单元206、指令执行单元208、存储器访问单元210和写回单元212。计算机处理器202还包括指令提取缓冲器214和分支预测缓冲器216。在一些实施例中,计算机处理器202还包括控制器(图2中未示出),该控制器被配置为控制和/或协调这些单元和缓冲器的操作。单元、缓冲器和控制器中的每一个可以包括一组组合逻辑电路和顺序逻辑电路,这些电路基于例如金属氧化物半导体场效应晶体管(MOSFET)构建。
指令提取单元203可以获取二进制形式的执行指令,并提取用于解码指令的信息。例如,信息可以包括指令的长度。在指令具有可变长度的情况下(例如,指令是Intel x86指令集的一部分),可能需要指令长度信息来标识指令。在一些情况下,指令长度信息可以根据指令数据的第一个字节来确定。举例来说,如果指令提取单元203从指令数据中识别出与0x0f的十六进制值相关联的转义字节,则指令提取单元203可确定至少数据的随后字节对应操作码,该操作码可指示指令长度至少为两个字节。此外,指令提取单元203还可以提取指令的不同字段,并基于这些字段的值确定是否需要额外的字节来确定指令长度。作为一个说明性示例,对于Intel x86指令,指令提取单元203可以提取诸如ModR/M字节的Mod字段和R/M字段这样的字段的值,并基于这些字段的值确定是否需要额外的数据(例如,SIB字节)来确定指令长度。
指令提取单元203随后可以将信息(包括指令长度)传输到指令解码单元206,指令解码单元206使用所述信息来识别指令。基于指令解码单元206的输出,指令执行单元208随后可以执行与指令关联的操作。存储器访问单元210还可以涉及从存储系统220访问数据并将数据提供给指令执行单元208以进行处理。写回单元212还可以涉及将指令执行单元208处理的结果存储在一组内部寄存器中(图2中未示出),以便进一步处理。
指令提取单元203的指令获取可以基于存储在程序计数器204中的地址。例如,当计算机处理器202开始执行软件代码102的第一条指令时,程序计数器204可以存储作为软件代码102的第一条指令(“xorl%eax,%eax”)的存储地址的值0x00。程序计数器值也可以用于预取一组指令。例如,如果期望指令按照它们存储在存储系统220中的顺序依次执行,则指令提取单元203可以获取存储在由程序计数器204指示的存储地址处的一组连续指令。通常,指令组是以4个字节的块预取的。指令提取单元203获取指令并完成对其的处理(例如,通过提取指令长度信息)之后,可以更新存储在程序计数器中的地址,以指向指令提取单元203要处理的下一条指令。
作为一个说明性示例,图1的软件代码104不包括任何分支指令,因此这些指令被预期应按照它们存储在存储系统220中的顺序依次执行。在这种情况下,指令提取单元203可以预取一组连续的指令,包括存储在地址0x00和0x05的指令。
另一方面,如果指令提取单元203已经完成对分支指令的处理,则指令提取单元203可以在分支指令由指令执行单元208执行之前,执行分支预测操作,并从分支指令的目标位置预取目标指令。作为一个说明性示例,参照图1的软件代码102,在指令提取单元203从存储地址0x02预取“jmp random_target”指令之后,它还可以预取存储在“jmp”指令的目标位置处的目标指令(“movl$34,%eax”),期望目标指令将在执行分支指令之后执行。指令提取单元203随后可以将预取的指令存储在指令提取缓冲器214中。
在这种布置下,计算机处理器202不需要等待直到指令执行单元208执行分支指令来确定目标指令,并且可以显著地加快分支操作。
分支预测缓冲器216可以提供使得指令提取单元203能够执行上述分支预测操作的信息。例如,分支预测缓冲器216可以维护将提取的指令的地址与目标地址配对的映射表。提取的指令的地址可以是存储在程序计数器204中的地址。提取的指令可以是分支指令,或者分支指令旁边的指令。目标地址可以与作为执行分支指令的结果的要执行的目标指令相关联。可以基于分支操作的先前历史创建配对。作为一个说明性示例,计算机处理器202可以维护图1中的软件代码102的先前执行历史,并且确定基于先前执行历史,在执行“xorl%eax,%eax”指令(后跟“jmp”分支指令)之后,存储在“random_target”存储位置处的指令(“movl$34,%eax”)也将被执行。基于这一历史,分支预测缓冲器216可以维护将“xorl”指令的地址(0x00)与“movl”指令的地址(0x100)配对的映射表。
在指令提取单元203基于程序计数器204中存储的地址预取第一组指令之后,指令提取单元203还可以访问分支预测缓冲器216,以确定该地址和目标地址之间是否存在配对。如果可以找到这样的配对,则指令提取单元203可以从目标地址预取包括目标指令在内的第二组指令。另一方面,如果找不到这样的配对,指令提取单元203可以假定指令将按照它们存储在存储系统220中的顺序依次执行,并且可以在第一组指令之后立即预取第二组连续指令。指令提取单元203随后将预取的指令存储在指令提取缓冲器214中,并且随后获取预取的指令以便进行处理和执行。
尽管分支预测和预取带来了速度和性能的提高,但是自修改代码可能对这些操作造成潜在的管线危害。现在参照图3A和图3B,其说明了自修改代码造成的潜在管线危险。参照图3A,假设图1的包含“jmp random_target”分支指令的软件代码102由计算机处理器200较早地执行。如图3A所示,分支预测缓冲器216存储提取指令地址(0x00)和反映了软件代码102的“jmp random_target”分支指令的执行的目标地址(0x100)之间的配对。基于存储在程序计数器204中的地址,指令提取缓冲器214可以从存储系统220的0x00地址中获取包含软件代码102的“xorl%eax,%eax”指令和“jmp random_target”指令的指令数据的4字节块,并将数据存储为提取块0。此外,基于存储在分支预测缓冲器216中的配对信息,指令提取缓冲器214也可以从软件代码102的目标地址0x100(包括“movl$34,%eax”指令)获取指令数据的4字节块,并将数据存储为提取块1。指令提取单元203然后可以从指令提取缓冲器214中获取提取块0和1,而不是从存储系统220中获取指令。此外,计算机处理器202的处理管线的其余部分可以基于提取块0的数据对接着是“jmp”指令的“xorl”指令进行解码,然后基于提取块1的数据(和/或与其他后续提取块一起)对“movl”指令进行解码,而无需等待“jmp”指令的执行。
在图3A所示的说明性示例中,提取块0包括提取块中包括的每个指令(“xorl”和“jmp”指令)的完整数据,解码提取块0中的这些指令不需要提取块1的数据。如果提取块1包含提取块0的分支指令的分支目标,则通常是这种情况。另一方面,如果由于来自分支预测缓冲器216的信息而未获取提取块1,则提取块0和提取块1可能存储连续指令,与提取块0中的指令关联的数据可以跨越提取边界并包含在提取块1中。作为一个说明性示例,参照图3B的软件代码302,“movsbl(%esi,%eax,1),%ebx”指令数据具有4字节的长度,并且可以从提取块0的第一个字节的结尾开始,并扩展到提取块1的第一个字节。在这种情况下,指令提取单元203可以基于提取块0和提取块1的数据组合来提取用于解码“movsbl”指令的信息(例如,指令长度信息)。
参照图3B,在执行自修改代码部分106的“memcpy”和“jmp”指令之后,存储在“old_code”存储位置处的软件代码102中的一些被软件代码302覆盖。此外,存储在程序计数器204中的地址被设置为指向“old_code”存储位置。指令提取单元203随后可以控制指令提取缓冲器214从存储系统220处的地址0x00开始获取4字节块的指令数据,并且将数据存储在提取块0中。此时,4字节块的指令数据可以包括软件代码302的“dec%ecx”指令和“movsbl”指令数据的前三个字节。
然而,对于提取块1,指令提取单元203可以从存储在分支预测缓冲器216中的配对中获取目标地址,然后指令提取缓冲器214从存储系统220处的地址0x100中获取指令数据,而不是从地址位置0x04中获取针对“movsbl”指令数据的剩余字节的指令数据。结果,如图3B所示,提取块0包含“movsbl”指令的不完整指令数据,而提取块1包含来自软件代码102的指令数据,但是不包括针对软件代码302的“movsbl”指令的任何数据。
在例如当指令提取单元203获取提取块0和提取块1,并尝试基于来自提取块0和提取块1的数据的组合来提取“movsbl”指令的信息,而实际上提取块1不包含针对“movsbl”指令的任何数据时,在图3b中描述的场景中可能会发生管线危险。作为一个说明性示例,指令提取单元203可以基于来自提取块0和提取块1的数据的组合来提取错误的指令长度信息,并向指令解码单元206提供错误的指令长度信息。基于不正确的长度信息,指令解码单元206可能无法解码指令。作为另一个说明性示例,指令提取单元203可以提取正确的指令长度信息,但是指令解码单元206基于提取块0和提取块1的数据来错误地解码针对“movsbl”的指令数据,并且错误地识别针对另一条指令的指令数据。在这两种情况下,由于指令解码单元206的解码结果不正确,计算机处理器202可能会执行不正确的操作,或者管线的多个级需要停止处理以使得能够纠正不正确的解码结果。因此,计算机处理器202的性能可能会大幅降低。
为了减轻上述管线危害,计算机处理器202可能需要删除导致提取块0和1的提取的分支预测决策(例如,通过删除存储在图2所示的分支预测缓冲器216中的配对),以反映在修改软件代码之后先前的分支操作不再有效。计算机处理器202还可能需要通过重置各种内部缓冲器(例如,指令提取单元203、指令解码单元206和写回单元212的内部缓冲器)等来刷新管线,以避免错误的解码结果通过管线传播。
另一方面,如果图3B中的提取块0包括提取块中包括的每个指令的完整数据,则可以由指令解码单元206基于提取块0数据正确地识别这些指令。因此,在运行时对软件代码的任何修改都不一定会导致计算机处理器202的错误操作和处理。例如,计算机处理器202可以包括额外的分支解析逻辑,以基于从提取块0正确解码的指令来确定分支预测不正确,并且基于来自分支预测缓冲器216的信息错误地获取提取块1。在这种情况下,提取块1可以被视为错误的路径指令,并且其数据可以从管线的所有级刷新,以保持计算机处理器202的正确操作。此外,如果提取块0的指令不包括分支指令,则提取块1被提取作为分支预测的结果也是不太可能的。因此,上述管线危险也不太可能发生,并且在运行时修改软件代码也不一定会导致计算机处理器202的错误操作和处理。在这两种情况下,计算机处理器202可以不采取附加动作,而只处理提取块。
现在参照图4,其示出了根据本公开的实施例的示例性预取状态寄存器402和404。在一些实施例中,预取状态寄存器402和404中的至少一个可以提供软件代码中的一条在所述软件代码执行时已更新的指示,所述软件代码的执行导致提取指令地址与分支预测缓冲器中的目标地址之间的配对。基于该指示,计算机处理器202可以执行上述动作,包括例如移除分支预测缓冲器中的配对,执行刷新操作以重置计算机处理器的内部缓冲器中的一些(例如,指令提取单元203、指令解码单元206和写回单元212的内部缓冲器)等,以确保正确处理和执行自修改代码。
参照图4,在一些实施例中,计算机处理器202可以包括预取状态寄存器402,该预取状态寄存器402被配置为提供提取块包括分支指令并且具有预测采用分支的指示。该指示可以反映与提取块相关联的地址和与分支预测缓冲器216中的另一个提取块相关联的目标地址配对,这两者都根据配对从存储器中预取。
在一些实施例中,如图4所示,预取状态寄存器402可以存储一组分支指示字节,每个字节与指令提取缓冲器214中的提取块相关联。在预取提取块0之后,指令提取单元203可以访问分支预测缓冲器216,基于所提取的指令地址(例如,基于程序计数器204)定位配对,并且控制指令提取缓冲器214从配对指示的目标地址预取指令数据并将预取的数据存储为提取块1。然后,指令提取单元203可以将用于提取块0的分支指示位设置为“1”以指示它具有预测的分支(目标指令包括在提取块1中)。虽然图4示出了预取状态寄存器402与指令提取缓冲器214分离,但是应当理解,预取状态寄存器402可以包括在指令提取缓冲器214中。
当指令提取单元203再次访问指令提取缓冲器214以获取用于处理的提取块0和1时,指令提取单元203然后可以基于由预取状态寄存器402提供的指示来确定正在处理的软件代码已经被修改。例如,如果提取块0的分支指示位是“1”,其指示它具有预测采用分支,则指令提取单元203可以确定提取块0中的指令包括分支指令。基于该确定,指令提取单元203还可以确定提取块0包括用于提取块中包括的每个指令的完整数据,并且确定该提取块1不应包括用于对提取块0中的任何指令进行解码的数据。因此,当提取时提取块0的指令的信息,如果指令提取单元203确定还需要来自提取块1的一些数据来提取指令的信息(例如,确定指令长度),则指令提取单元203可以确定提取块0不再包括提取块1中具有目标指令的分支指令,这与相关联的分支指示位指示的相反。因此,指令提取单元203可以确定软件代码可能已被修改。基于该确定,指令提取单元203(或计算机处理器202的一些其他内部逻辑)可以向分支预测缓冲器216发送信号以移除地址0x00和目标地址0x100之间的配对条目。指令提取单元203、指令解码单元206、写回单元212等的内部缓冲器也可以重置以确保正确执行修改的软件代码。
另一方面,如果提取块0的分支指示位是“0”,其指示提取块0没有预测采用分支,则指令提取单元203可以确定提取块0不包括分支指令。因此,指令提取单元203可以确定提取块0和1可能包含连续指令,并且不太可能发生管线危险,如上所述。因此,指令提取单元203不需要采取附加动作,并且可以仅处理提取块0和1,并将提取块数据提供给指令解码单元206以进行解码。
在一些实施例中,计算机处理器202还可以包括预取状态寄存器404,该预取状态寄存器404被配置为存储预定分支指令(例如,“jmp”分支指令)的字节位置。字节位置可以包括例如起始字节位置、结束字节位置等,并且可以与存储在分支预测缓冲器216中的提取指令地址(和相关联的目标地址)相关联。字节位置也可以用于确定存储在特定提取块中的指令是否已被修改,这还可以提供由计算机处理器202执行的软件代码片段已被修改的指示。虽然图4示出了预取状态寄存器404与分支预测缓冲器216分离,但是应当理解,预取状态寄存器404可以包括在分支预测缓冲器216中。
如图3A-图3B和图4所示,软件代码102的“jmp random_target”指令可以具有起始字节位置2(基于地址位置0x02)和结束字节位置4(基于在“jmp”指令之后的指令的地址位置0x04),其在图4中表示为(2,4)。字节位置信息可以存储在预取状态寄存器404中。当指令提取单元203访问分支预测缓冲器216并获得地址0x00和目标地址0x100的配对时,指令提取单元203还从分支预测缓冲器216接收相关联的字节位置(2,4)。当指令提取单元203提取提取块0的每个指令的信息时,指令提取单元203还可以确定指令的字节位置和指令长度。如果指令提取单元203确定提取块0的指令都没有与字节位置(2,4)匹配的字节位置,则指令提取单元203可以确定存储在提取块0中的指令已经被修改,这也可以指示由计算机处理器202执行的软件代码片段已经被修改。基于该确定,指令提取单元203(或计算机处理器202的一些其他内部逻辑)然后可以使分支预测缓冲器216移除与失配字节位置相关联的配对条目,并重置指令提取单元203、指令解码单元206、写回单元212等的内部缓冲器,如上所述。
在一些实施例中,自修改代码的检测还可以基于由预取状态寄存器402和404提供的信息的组合。例如,预取状态寄存器404可以仅存储预定的分支指令的起始字节位置。指令提取单元203可以确定提取块0的指令与匹配的起始字节位置相关联,但是其结束字节位置(基于提取的指令长度信息)指示指令数据扩展到提取块1中。如果提取块1的分支指示位(存储在预取状态寄存器402中)是“1”,其可以指示提取块1被提取作为分支预测的结果并且不包括提取块0的指令的任何数据,指令提取单元203还可以确定已经修改了存储在提取块0中的指令,并且确定已经修改了由计算机处理器202执行的软件代码片段。如果指令提取单元203确定需要来自提取块1的数据来确定指令长度,并且确定提取块1的分支指示位是“1”,则也可以做出相同的确定,如上所述。然后,指令提取元203可以重置其内部缓冲器,并将重置信号发送到指令解码单元206和写回单元212等的内部缓冲器,以避免不正确的解码结果通过管线传播。
利用本公开的实施例,在转发指令数据以用于解码和执行之前,可以从预取的指令数据中检测自修改代码的指令。结果,可以减轻由于自修改代码引起的上述管线危险而识别并执行不正确指令的可能性。此外,当在解码并执行预取指令之前检测到管线危险时,也可以采取纠正动作,从而可以防止不正确的解码结果通过管线传播。结果,可以确保适当并及时地执行修改的软件代码。
现在参照图5,其示出了处理自修改代码的示例性方法500。该方法可以由例如计算机处理器(诸如图2的计算机处理器202)来执行,图2的计算机处理器202包括指令提取缓冲器214、分支预测缓冲器216以及图4中的预取状态寄存器402和404中的至少一个。在一些实施例中,该方法还可以由与计算机处理器202中的这些电路联接的控制器执行。
在初始启动之后,方法500行进到步骤502,其中计算机处理器202从指令提取缓冲器214接收指令数据的提取块。
在接收到提取块之后,在步骤504,计算机处理器202确定提取块是否具有预测采用分支。该确定可以基于例如与提取块相关联的预取状态寄存器402的分支指示位。如果计算机处理器202在步骤506中确定提取块没有预测采用分支,则它然后可以确定提取块不与分支预测操作相关联,并且不需要采取进一步的动作。因此,方法500然后可以行进到最后。
如果计算机处理器202确定提取块具有预测采用分支(在步骤506中),则它然后可以在步骤508中确定提取块是否具有用于指令长度确定的足够数据。指令长度确定可以基于指令数据的第一个字节以及指令的各个字段的值(例如,ModR/M字节、SIB字节等)。如上所述,在提取块具有预测分支的情况下,提取块应该包括用于提取块中包括的每个指令的完整数据,并且这些指令都不应该扩展到包括分支目标指令的另一个提取块。如果计算机处理器202在步骤510中确定提取块不包括用于指令长度确定的足够数据,则它可以在步骤512中继续确定检测到自修改代码,并执行包括例如从分支中移除配对条目、清除计算机处理器202的内部缓冲器等的附加动作。
如果计算机处理器202确定提取块包括用于指令长度确定的指令的足够数据(在步骤510中),则计算机处理器202可以继续在步骤514中确定提取块中的每个指令的指令长度和字节位置。在步骤516中,计算机处理器202然后可以接收提取块中的预定分支指令的字节位置。如上所述,字节位置可以包括例如预定分支指令的起始字节位置和结束字节位置。计算机处理器202可以从例如预取状态寄存器404接收字节位置信息。
在从预取状态寄存器接收到字节位置信息并确定提取块的指令的字节位置信息之后,计算机处理器202然后可以继续在步骤518确定是否存在提取块中的起始字节位置和结束字节位置与预定分支指令的起始字节位置和结束字节位置相匹配的至少一个指令。如果计算机处理器202确定提取块的指令没有匹配的起始字节位置和结束字节位置(在步骤520中),这可以指示至少一个指令的数据超出提取块并且不能是预定的分支指令,则它然后可以行进到步骤512并确定提取块的指令已经被修改并且检测到自修改代码。另一方面,如果在步骤520中找到具有匹配的起始字节位置和结束字节位置(或仅匹配的结束字节位置)的指令,则计算机处理器202可以确定正在执行的软件代码不是自修改代码或者提取块包含指令的完整数据,并且可以在不采取附加动作的情况下行进到结束。由于分支预测操作,计算机处理器202还可以丢弃对提取块中的预定分支指令的后续指令(如果有的话)。
应当理解,本发明不限于上面已经描述并在附图中示出的确切结构,并且可以在不脱离其范围的情况下进行各种修改和改变。本发明的范围应仅受所附的权利要求限制。
Claims (17)
1.一种处理自修改代码的方法,所述方法由计算机处理器执行,并且包括:
从指令提取缓冲器接收指令数据的提取块;
在将指令数据的所述提取块发送至所述计算机处理器的解码单元之前,确定所述提取块是否包括自修改代码的指令数据;
响应于确定所述提取块包括自修改代码的指令数据,发送刷新信号以重置所述计算机处理器的一个或更多个内部缓冲器;
其中,确定所述提取块是否包括自修改代码的指令数据的步骤包括:确定所述提取块是否与第二提取块中的预测采用分支相关联;
确定所述提取块是否与第二提取块中的预测采用分支相关联的步骤包括:接收与所述提取块相关联的分支指示位;基于所述分支指示位确定所述提取块是否与第二提取块中的预测采用分支相关联。
2.根据权利要求1所述的方法,其中,确定所述提取块是否包括自修改代码的指令数据的步骤还包括:
响应于确定所述提取块与预测采用分支相关联:
确定所述提取块是否包括所述提取块中包括的每个指令的完整数据;
响应于确定所述提取块包括至少一个指令的不完整数据,确定所述提取块包括自修改代码的指令数据。
3.根据权利要求2所述的方法,其中,确定提所述提取块是否包括所述提取块中包括的每个指令的完整数据的步骤包括:
确定所述提取块是否包括用于确定所述提取块中包括的每个指令的指令长度的足够数据。
4.根据权利要求2所述的方法,其中,确定所述提取块是否包括自修改代码的指令数据的步骤包括:
响应于确定所述提取块是否包括所述提取块中包括的每个指令的完整数据:
接收预定分支指令的字节位置,所述字节位置和与所述预定分支指令相关联的地址和所述预测采用分支的目标地址之间的配对相关联;
确定所述提取块的一个指令是否和与所述预定分支指令的字节位置匹配的字节位置相关联;
响应于确定所述提取块的指令不和与所述预定分支指令的字节位置匹配的字节位置相关联,确定所述提取块包括自修改代码的指令数据。
5.根据权利要求4所述的方法,其中,所述预定分支指令的字节位置包括结束字节位置。
6.根据权利要求4所述的方法,其中,所述配对存储在分支预测缓冲器中;其中,所述方法还包括:
响应于确定所述提取块包括自修改代码的指令数据,从所述分支预测缓冲器中移除所述配对。
7.一种系统,包括:
存储器,所述存储器存储指令数据;以及
计算机处理器,所述计算机处理器被配置为处理所述指令数据;其中,处理指令集包括将所述计算机处理器配置为:
从指令提取缓冲器获取所述指令数据的提取块;
在将指令数据的所述提取块发送至解码单元之前,确定所述指令数据的所述提取块是否包含自修改代码;
响应于确定所述指令数据的所述提取块包含自修改代码,重置所述计算机处理器的一个或更多个内部缓冲器;
其中,确定所述指令数据的所述提取块是否包含自修改代码包括将所述计算机处理器配置为:确定所述提取块是否与第二提取块中的预测采用分支相关联;
其中,所述指令提取缓冲器包括与所述提取块相关联的分支指示位;其中,确定所述提取块是否与第二提取块中的预测采用分支相关联包括将所述计算机处理器配置为:从所述指令提取缓冲器接收所述分支指示位;基于所述分支指示位确定所述提取块是否与第二提取块中的预测采用分支相关联。
8.根据权利要求7所述的系统,其中,确定所述指令数据的所述提取块是否包含自修改代码包括将所述计算机处理器配置为:
响应于确定所述提取块与预测采用分支相关联:
确定所述提取块是否包括所述提取块中包括的每个指令的完整数据;
响应于确定所述提取块包括至少一个指令的不完整数据,确定所述提取块包括自修改代码的指令数据。
9.根据权利要求8所述的系统,其中,确定所述提取块是否包括所述提取块中包括的每个指令的完整数据包括将所述计算机处理器配置为:
确定所述提取块是否包括用于确定所述提取块中包括的每个指令的指令长度的足够数据。
10.根据权利要求8所述的系统,其中,确定所述提取块是否包括自修改代码的指令数据包括将所述计算机处理器配置为:
响应于确定所述提取块包括所述提取块中包括的每个指令的完整数据:
接收预定分支指令的字节位置,所述字节位置和与所述预定分支指令相关联的地址和所述预测采用分支的目标地址之间的配对相关联;
确定所述提取块的一个指令是否和与所述预定分支指令的字节位置匹配的字节位置相关联;
响应于确定所述提取块的指令不和与所述预定分支指令的字节位置匹配的字节位置相关联,确定所述提取块包括自修改代码的指令数据。
11.根据权利要求10所述的系统,其中,所述预定分支指令的字节位置包括结束字节位置。
12.根据权利要求10所述的系统,其中,所述计算机处理器还包括存储所述配对和所述字节位置的分支预测缓冲器;其中,所述计算机处理器被配置为:
响应于确定所述提取块包括自修改代码的指令数据,从所述分支预测缓冲器中移除所述配对。
13.一种计算机处理器,包括:
分支预测缓冲器,所述分支预测缓冲器被配置为存储与预定分支指令相关联的地址和预测采用分支的目标地址之间的配对;
指令提取缓冲器,所述指令提取缓冲器被配置为存储根据存储在所述分支预测缓冲器的所述配对从存储器中预取的指令数据;
指令提取单元,所述指令提取单元被配置为:
从指令提取缓冲器接收指令数据的提取块;
在将指令数据的所述提取块发送至所述计算机处理器的解码单元之前,基于存储在所述分支预测缓冲器和所述指令提取缓冲器中的至少一个中的信息来确定所述提取块是否包括自修改代码的指令数据;
响应于确定所述提取块包括自修改代码的指令数据,发送刷新信号以重置所述计算机处理器的一个或更多个内部缓冲器;
其中,所述指令提取缓冲器包括与所述提取块相关联的分支指示位;其中,确定所述提取块是否包括自修改代码的指令数据包括将所述指令提取单元配置为:从所述指令提取缓冲器接收所述分支指示位;
并且基于所述分支指示位确定所述提取块是否与第二提取块中的预测采用分支相关联。
14.根据权利要求13所述的计算机处理器,其中,确定所述提取块是否包括自修改代码的指令数据包括将所述指令提取单元配置为:
响应于确定所述提取块与所述第二提取块的预测采用分支相关联:
确定所述提取块是否包括用于确定所述提取块中包括的每个指令的指令长度的足够数据;
响应于确定所述提取块不包括用于确定所述提取块中包括的每个指令的指令长度的足够数据,确定所述提取块包括自修改代码的指令数据。
15.根据权利要求13所述的计算机处理器,其中,所述分支预测缓冲器与具有所述配对的预定分支指令的字节位置相关联;其中,确定所述提取块是否包括自修改代码的指令数据包括将所述指令提取单元配置为:
确定所述提取块的一个指令是否和与所述预定分支指令的所述字节位置匹配的字节位置相关联;
响应于确定所述提取块的指令不和与所述预定分支指令的所述字节位置匹配的字节位置相关联,确定所述提取块包括自修改代码的指令数据。
16.根据权利要求15所述的计算机处理器,其中,所述预定分支指令的所述字节位置包括结束字节位置。
17.根据权利要求13所述的计算机处理器,其中,所述指令提取单元还被配置为:
响应于确定所述提取块包括自修改代码的指令数据,从所述分支预测缓冲器中移除所述配对。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/417,079 US20180210734A1 (en) | 2017-01-26 | 2017-01-26 | Methods and apparatus for processing self-modifying codes |
US15/417079 | 2017-01-26 | ||
PCT/US2018/015541 WO2018140786A1 (en) | 2017-01-26 | 2018-01-26 | Method and apparatus for processing self-modifying codes |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110178115A CN110178115A (zh) | 2019-08-27 |
CN110178115B true CN110178115B (zh) | 2023-08-29 |
Family
ID=62906442
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880006736.6A Active CN110178115B (zh) | 2017-01-26 | 2018-01-26 | 处理自修改代码的方法和装置 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20180210734A1 (zh) |
CN (1) | CN110178115B (zh) |
WO (1) | WO2018140786A1 (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5136697A (en) * | 1989-06-06 | 1992-08-04 | Advanced Micro Devices, Inc. | System for reducing delay for execution subsequent to correctly predicted branch instruction using fetch information stored with each block of instructions in cache |
US5996071A (en) * | 1995-12-15 | 1999-11-30 | Via-Cyrix, Inc. | Detecting self-modifying code in a pipelined processor with branch processing by comparing latched store address to subsequent target address |
US6415360B1 (en) * | 1999-05-18 | 2002-07-02 | Advanced Micro Devices, Inc. | Minimizing self-modifying code checks for uncacheable memory types |
CN1836210A (zh) * | 2003-07-15 | 2006-09-20 | 可递有限公司 | 用于在程序代码转换中划分代码的方法和装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE50010300D1 (de) * | 2000-11-16 | 2005-06-16 | Siemens Ag | Gasturbinenschaufel |
WO2013101152A1 (en) * | 2011-12-30 | 2013-07-04 | Intel Corporation | Embedded branch prediction unit |
US9047092B2 (en) * | 2012-12-21 | 2015-06-02 | Arm Limited | Resource management within a load store unit |
-
2017
- 2017-01-26 US US15/417,079 patent/US20180210734A1/en not_active Abandoned
-
2018
- 2018-01-26 WO PCT/US2018/015541 patent/WO2018140786A1/en active Application Filing
- 2018-01-26 CN CN201880006736.6A patent/CN110178115B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5136697A (en) * | 1989-06-06 | 1992-08-04 | Advanced Micro Devices, Inc. | System for reducing delay for execution subsequent to correctly predicted branch instruction using fetch information stored with each block of instructions in cache |
US5996071A (en) * | 1995-12-15 | 1999-11-30 | Via-Cyrix, Inc. | Detecting self-modifying code in a pipelined processor with branch processing by comparing latched store address to subsequent target address |
US6415360B1 (en) * | 1999-05-18 | 2002-07-02 | Advanced Micro Devices, Inc. | Minimizing self-modifying code checks for uncacheable memory types |
CN1836210A (zh) * | 2003-07-15 | 2006-09-20 | 可递有限公司 | 用于在程序代码转换中划分代码的方法和装置 |
Non-Patent Citations (1)
Title |
---|
一种基于自修改代码技术的软件保护方法;王祥根等;《中国科学院研究生院学报》;20090915(第05期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110178115A (zh) | 2019-08-27 |
US20180210734A1 (en) | 2018-07-26 |
WO2018140786A1 (en) | 2018-08-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8171260B2 (en) | Fetching all or portion of instructions in memory line up to branch instruction based on branch prediction and size indicator stored in branch target buffer indexed by fetch address | |
JP4950186B2 (ja) | 分岐命令を予測するための方法及び装置 | |
TWI223195B (en) | Optimized branch predictions for strongly predicted compiler branches | |
JP2875909B2 (ja) | 並列演算処理装置 | |
JP5722396B2 (ja) | 明示的サブルーチンコールの分岐予測動作をエミュレートするための方法および装置 | |
US20080126770A1 (en) | Methods and apparatus for recognizing a subroutine call | |
JP5815596B2 (ja) | プロシージャリターンシーケンスを加速するための方法およびシステム | |
JP6796717B2 (ja) | 分岐ターゲットバッファの圧縮 | |
US20120089818A1 (en) | Decoding instructions from multiple instructions sets | |
US20190369999A1 (en) | Storing incidental branch predictions to reduce latency of misprediction recovery | |
KR100864891B1 (ko) | 다중 명령 세트 시스템에서의 미처리된 연산 처리 | |
JP2002366367A (ja) | プログラム命令解釈 | |
CN110178115B (zh) | 处理自修改代码的方法和装置 | |
CN111954865B (zh) | 用于预提取数据项的装置和方法 | |
US20060015706A1 (en) | TLB correlated branch predictor and method for use thereof | |
JP3723019B2 (ja) | サブルーチンリターン相当の命令の分岐予測を行う装置および方法 | |
TW201216060A (en) | Processor independent loop entry cache | |
JP2004038338A (ja) | 分岐予測機構を有する情報処理装置 | |
TWI606393B (zh) | 依據快取線決定記憶體所有權以偵測自修正程式碼的處理器與方法 | |
JPWO2012132214A1 (ja) | プロセッサ及びその命令処理方法 | |
US10198360B2 (en) | Systems and methods storing a page fault virtual address to prevent unnecessary page table walks | |
CN114358180A (zh) | 处理器的预取训练方法、处理装置、处理器和计算设备 | |
JP4113227B2 (ja) | 分岐予測機構を有する情報処理装置 | |
WO2005119428A1 (en) | Tlb correlated branch predictor and method for use therof |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |