具体实施方式
为使本发明的上述目的、特征和优点能更明显易懂,下文特举一实施例,并配合附图,作详细说明如下。
词汇(Glossary)
「指纹(fingerprint)」为可辨识一程序指令序列的一数值,指纹值的产生依据一数学运算而得到的关于指令序列的信息累积结果。该信息可包括,举例来说,该指令的指令指针值的多个组合(例如指令的地址)、指令的操作码(opcode)、指令的位移(displacement)、指令的前缀(prefix,又称为“字首”)、和/或指令的部分地址模式,例如是x86架构指令(或是其一部分的)的SIB或modRM位。累积指令信息的数学运算,举例来说,可包括连续地计算与序列中各指令有关的循环冗余检查码(cyclic redundancy code)。此外,该数学运算也可包括在一多输入移位寄存器(multiple input shift register)中使用最大计数多项式来累计指令信息。再者,该数学运算还可包括依据一哈希函数(hashfunction),例如是一可变长度数据哈希函数以累计指令信息。当然,该数学运算还可包括对一队列,例如是一固定长度队列(fixed-length queue),的连续指令信息进行累计。
依据两个不同的产生时间点,指纹值可分为两种类型:静态及动态。当微处理器执行一程序的指令时,微处理器的指纹单元产生一动态指纹而静态指纹则由工程师所预先产生。静态指纹会提供至指纹单元,使得指纹单元可对其产生的动态指纹及其所接收的静态指纹进行比较。指纹单元更可接收指纹产生准则(fingerprint generation criteria),例如起始条件、停止条件、及重置条件,其可控制指纹单元累计指令信息以产生动态指纹。指纹产生准则也可指定为指令信息的部分组合以让指纹单元进行累计以产生动态指纹。
当各指令执行后(以撷取者后为佳),指纹单元接收指令信息。若指纹单元检测到一起始条件,其会依据数学运算来累计指令信息而产生结果,其即为动态指纹。当各指令执行后,指纹单元会持续接收指令信息,并依据数学运算以累计指令信息而产生结果,直到指纹单元检测到一停止条件或一重置条件为止。在重置条件的一例子中,指纹单元清除累计状态,并依据数学运算再开始累计指令信息以产生结果。更适宜而言,每当指纹单元产生介于一起始条件及一停止条件的一新结果,其会比较该结果(动态指纹)与该静态指纹,并在它们相符时指出两者相符。起始条件的例子包括启动分支的指令、返回指令、自中断指令的返回、陷阱情况、例外情况、系统调用或返回指令(例如x86架构中的SYSENTER或SYSEXIT指令)、子程序调用、功能单元控制指令(例如x86架构中的FINIT指令)、或是来自另一指纹单元的表示符,表示其已检测到指纹相符。停止条件的例子包括类似于起始条件的各种情况,且也可包括指纹相符、以及在一起始条件后所执行的指令计数值到期(expiration)。重置条件的例子包括类似于起始条件的各种情况,且也可包括一硬件重置及非不动作指令的一指令。
产生静态指纹的流程公开于下述实施例。工程师对可用来增进效能、降低功耗和/或修正错误的程序部分的目标集合进行辨识。接着,对于各目标程序部分,工程师会在程序执行时辨识指令序列(往后称之为“指令串(strand)”),并表示该目标程序部分正在执行或是即将执行。工程师接着在该指令串,亦即指令信息,之上依据数学运算(与在指纹单元中用于产生动态指纹的数学运算相同)进行累计以产生一结果。当该程序部分相关于静态指纹时,该结果存储于一数据库或一文件中。产生静态指纹可藉由多种方式来运作。举例来说,工程师可提供与该指令串相关的指纹收集准则至一软件程序,例如是微处理器的功能模拟器,接着于该功能模拟器上执行该程序,且在其遇到停止条件时,指示该功能模拟器输出该功能模拟器的指纹引擎部分的结果,其中该结果用于该指令串的静态指纹。另一方面,工程师可使用微处理器本身以执行类似的运算,在一实验室环境中,该微处理器可特别设定于侦错/测试设定以输出静态指纹,和/或该微处理器连接至测试设备的一部分,其用以提供测试向量(test vectors)至该微处理器并接收测试结果。在工程师已收集目标静态指纹之后,工程师可创建一表单,其将静态指纹与下列条件进行联结,例如(1)可最佳化微处理器的功能单元的配置设定,其用于处理与指令串相关的程序部分;及(2)指纹收集准则。
需了解的是检测一静态指纹与一动态指纹的相符并不会唯一肯定地辨识与该程序部分有关的指令串,反而是表示该指令序列已经被执行的概率相当高。这种方式有点类似于人的指纹并无法唯一肯定地辨识一个人。意即,在一相对少数的情况中,指纹单元仍会对由静态指纹所产生的指纹序列之外的指令串,(称为别名(alias)指令串)指示相符的情形。
功能单元为硬件或是在微处理器中的软件及硬件的组合,其可执行与处理与指令相关的函数。功能单元的例子包括,但非限定于,指令提取单元、分支预测单元、指令格式单元、指令转译单元、寄存器更名单元、指令调度单元、执行单元(例如是整数单元、浮点单元、分支单元、单一指令多重数据(single instruction multiple data)单元、多媒体单元、读取单元、存储单元)、重新排序单元、引退单元(retire unit)、快取存储器、数据预提取单元、电源管理单元、存储器管理单元、以及存储冲突检测单元。
若一功能单元的设定可在微处理器运作时改变,则表示该功能单元动态可重设。需注意的是,为了改变动态可重设的功能单元的设定,当正要改变配置设定时,微处理器需先藉由该动态重设功能单元和/或整个微处理器以暂停指令的处理。举例来说,在一实施例中,微程序代码可藉由写入一数值至设定寄存器以改变配置设定。该微程序代码程序可在新配置设定写入之前且直到新配置设定生效时,序列化指令的执行。
功能单元的配置设定,其为一状态,可在状态具有不同数值时使得该功能单元以不同方式执行其功能,而不同的方式会影响功能单元所执行的效能、功耗和/或正确度。
请参考图1,图1是显示一微处理器100的功能方块图。微处理器100包括动态重设功能单元128、配置寄存器124、重设单元104、一或多个指纹单元102、指纹编程寄存器132(例如特定模型寄存器(model specificregister,MSR))、以及指纹设定准则表126,其中该指纹设定准则表126记录静态指纹,以及相关的配置设定与指纹产生准则。尽管于图1中未绘示,微处理器100还可包括无法动态重设的功能单元。在一实施例中,微处理器100包括一超标量非循序执行微架构(superscalar out-of-order executionmicroarchitecture),尽管在此所介绍的动态可重设的处理可由包括不同微架构的一微处理器所执行。在一实施例中,微处理器100包括一x86指令集架构,尽管在此所介绍的动态重设的处理可由包括不同指令集架构的微处理器所执行。
配置寄存器124,其保存保存配置设定,并提供配置设定至动态重设功能单元128以控制其特定方面的运作。可由该配置设定以进行动态重设处理在不同运作方面的例子介绍于下列实施例,但非限定于此。
数据提取配置设定,设定数据如何由系统存储器中预先提取(prefetch)至微处理器100的不同快取存储器中。举例来说,微处理器100可直接预先提取高可能性的预测数据至L1数据快取中,和/或预先提取较低可能性的预测数据至一专用预先提取缓冲器,其中该专用预先提取缓冲器与L1及L2数据快取分开。在另一实施例中,对于持续触发不需要预先提取的应用程序,可关闭由数据预先提取器所执行的数据提取。在又一实施例中,可关闭数据预先提取器而不处理在一软件应用程序中预先提取指令所请求的预先提取动作,因为它们可能与在微处理器100内部启动的预先提取产生负面互动的情形。
分支预设配置设定用以设定微处理器100预测分支指令的方式。举例来说,可由分支预测器由指令快取的各数据线所预测的分支指令的数目是可以设定的。除此之外,由分支预测器所使用的独特分支预测机制的数目亦是可以设定的。更进一步,分支预测器可设定为一反向零值跳转(jump on zero,JZ)分支指令会被经常采取或是不采取。又,用于索引位于在分支预测器中的一分支目标地址快取(branch target address cache,BTAC)的哈希算法亦是可以设定的。最后,若在该预定列表中的一或多个目前运行的软件应用程序倾向于执行高度无法预测的分支指令时,分支预测器可被设定至暂时整个关闭分支预测、或是设定至暂时关闭部分分支预测机制,例如在分支预测器中的一分支目标地址快取。
指令快取逐出(eviction)设定,设定微处理器100将指令由指令快取逐出所使用的算法。
暂停执行(suspend execution)配置设定,用以设定微处理器100是否要暂时暂停执行程序指令。举例来说,微处理器100可被设定为暂时暂停执行指令,作为决定操作系统的空闲程序已经确定被执行一预定时间的回应。
L1指令快取存储器大小配置设定、L1数据快取存储器大小配置设定、及L2指令快取存储器大小配置设定,分别用以设定L1指令快取、L1数据快取、及L2快取存储器的大小。举例来说,快取存储器大小可依据目前运行的一或多个软件应用程序的工作数据集合的大小来进行设定。
转译/格式化配置设定,用以设定指令转译器/格式化器如何转译和/或格式化指令。举例来说,可以设定在各时钟周期由指令转译器/格式化器所转译和/或格式化的指令的数目。举例来说,指令转译器/格式化器可设定为在每个时钟周期仅转译和/或格式化单一指令以降低微处理器100的功耗,当此方式可满足正在运行应用程序的需求时。此外,指令转译器/格式化器可由经合并指令而关闭降低功耗。
推测寻访(speculative tablewalk)配置设定,用以设定微处理器100的一存储器管理单元是否回应一转译侧视缓冲器(translation lookaside buffer,TLB)的失误(miss)以执行推测页面寻访。举例来说,该存储器管理单元可对一推测持续不正确的应用程序的关闭推测其寻访的功能,因为这种情况会逐出在转译侧视缓冲器中的其他有用的项目(entry)。在一实施例中,可设定寻访的推测强度。举例来说,该存储器管理单元可设定为在所有较旧的存储动作已引退后、或在所有较旧的存储动作的地址已解析、或是不管较旧的存储动作时,仅进行一推测页面寻访。此外,存储器管理单元可设定为同时独立控制数据与程序代码的推测寻访。更进一步,存储器管理单元可设定为可执行推测寻访,但并不推测地更新转译侧视缓冲器。最后,存储器管理单元可设定为辨识那些类型的微执行码或硬件功能可对例如不同的软件或硬件预先提取进行推测寻访。
L1快取失误行为配置设定,用以设定存储器管理单元是否回应在L1指令快取的失误、以串行或并行方式由L2快取及处理器总线请求数据。
转送哈希(forwarding hash)配置设定,用以设定微处理器100于地址比较时哈希虚拟地址位的算法,其用以检测微处理器100是否应执行一数据转送动作,例如对一较旧的未引退存储指令的读取(load)指令的传送操作,或是在一读取队列及一填充队列之间的传送操作。举例来说,下列情况可被设定:在虚拟地址的页面索引位之外会被进行比较的位数目、哪些非页面索引位会被哈希以产生这些位、以及所选择的位如何被哈希。
队列大小配置设定,设定在微处理器100中不同队列的可用大小,例如是存储队列、读取队列、及快取线填充队列。举例来说,不同的队列可被设定至较小的尺寸,当其可满足目前正在运行的应用程序时藉以降低功耗量。
发送(issue)尺寸配置设定,设定微处理器110在单一时钟周期中发送至不同执行单元的指令数量。例如,当在每个时钟周期所发送较小数量的指令可满足正在运行的应用程序时,发送尺寸配置设定可设定至相对较小的数值以降低功耗。
重新排列缓冲器大小配置设定,设定在重新排列缓冲器中可用项目的数量。举例来说,装置驱动程序可设定重新排列缓冲器项目的数量至一相对较小的数量,当其可满足正在运作的应用程序时藉以降低功耗量。
非循序(out-of-orderness)配置设定,设定微处理器100如何利用非循序执行的指令。举例来说,微处理器100可被设定为以一严谨程序顺序以执行指令(亦即没有非循序执行)。除此之外,微处理器100可对深入至指令视窗的程度,以让指令发送器寻找独立指令以发送至执行单元执行。
读取延迟配置设定,设定微处理器100的一读取延迟机制为关闭或开启。在一实施例中,当微处理器100推测地发送一读取指令时,且若其此读取指令与一较旧的存储指令相关且其数据尚无法取得时,表示其可能是有害于效能,此时微处理器100需重新执行该读取指令。为了降低重新执行的可能性,该读取延迟机制会依据重新执行一读取指令的过去历史以选择性地延迟该读取指令的发送。然而,当该读取延迟机制开启时,某些软件应用程序会具有较差效能的倾向。因此,举例来说,对于具有上述倾向的软件应用程序来说,可关闭该读取延迟机制。
非时间读取/存储配置设定,设定微处理器100的读取/存储指令的行为,其包括一非时间数据暗示以防止微处理器100快取其数据。在假设微处理器100中的数据快取小于微处理器100的实际数据快取大小且若该数据被快取则会加速执行时,某些软件应用程序会被写入以利用非时间读取/存储指令。因此,举例来说,微处理器100会被设定为快取由包括一非时间数据暗示的读取/存储指令所指定的数据。除此之外,在微处理器100中可被包括非时间数据暗示的读取/存储指令所读取缓冲器的数量亦是可设定的。
另一配置设定可选择性地设定微处理器100的硬件分页目录快取(hardware page directory cache,PDC)以包含分页目录项目(page directoryentries,PDE)或第4阶的分页表项目(fourth-level page table entries,PML4)。
另一配置设定可选择性地设定数据及程序代码转译侧视缓冲器(TLB)项目中的两者、一者两者皆不会,被放置至微处理器100的L2转译侧视缓冲器。另一配置设定可设定L2转译侧视缓冲器的大小。
另一配置设定可选择性地设定是否已确保一软件预先提取记忆线的配置。意即,存储器管理单元可被设定为等待完成,直到击中(hit)或已为该软件预先提取记忆线推送一请求为止、或已完成但继续在唤醒时尝试配置该软件预先提取记忆线。
另一配置设定可设定自我调整码检测是否开启或关闭。除此之外,若自我调整码检测开启,微处理器100可被设定为先更正或后更正,以及执行或不执行完整机器清除。
另一配置设定设定微处理器100的载入和/或存储管线中的不同并行仲裁是否开启或关闭。举例来说,在存储管线中的一载入有效地址(load effectiveaddress,LEA)的产生并不需要对整个管线进行仲裁(因为其会先产生结果),因此微处理器100可被设定为允许需要完整管线的另一操作在同时间进行仲裁。更进一步,载入管线可被选择性地设定为允许不需要读取快取的仲裁器与需要读取快取的仲裁器并行地进行仲裁的情形。
另一配置设定设定关于写入合并的载入(write-combine loads)的推测的程度。举例来说,写入合并的载入可为完整推测、推测但仍然依照顺序、或是非推测。可对与x86MONVNTDQA指令有关的载入进行类似的配置设定。
另一配置设定设定存储器管理单元是否要开启或关闭指示微处理器100的指令调度器在一载入失误需要用新的微操作重新执行之后,应该要完成载入操作的功能。上述方式允许该调度器以推测地安排相依的微操作以与载入结果转送阶段一同排队,而不是在调度前等待提供该结果。此为推测该载入现在具有一有效结果,但若没有有效结果,则需要另一重新执行的操作。
另一配置设定设定微处理器100的转送路径以选择性地关闭转送。此配置设定在微处理器后续设计时用以避开所测得的设计缺失特别有效,而且当一特定程序部分由微处理器100执行时该设计缺失本身可能会显露出来。转送的例子可为选择性地关闭,其包括但非限定,寄存器结果转送及载入-存储转送的情形。
另一个动态重设功能单元128的动态重设处理实例是导致寄存器更名单元清除用以维持载入-存储依存性的队列,该队列由寄存器更名单元所使用以影响载入指令调度,用以降低由载入-存储冲突所造成的载入重新执行。一般而言,功能单元128动态重设以清除累计的效能特征状态,其已知相关于一特定程序部分而言为已知或怀疑为假或变形者。
另一个动态重设功能单元128的动态重设实例是导致一或多条快取线、或整个快取存储器被清除以避免潜在的数据一致性的问题。此方式对于避开当一特定程序部分由微处理器100所执行时会显露其本身的设计缺失特别有用。
另一个动态重设功能单元128的动态重设实例是为了一架构性指令的特定例子暂时改变该架构性指令的微程序代码的行为。举例来说,微程序代码对该架构性指令的特定例子执行一代码路径(alternate code path),其包含于该架构性指令的一特定程序部分中,并在该架构性指令中的其他例子执行一正常码路径。再次重申,此方式对于避开设计缺失特别有用。
重设单元104读取与一相符静态指纹有关的配置设定126,并将配置设定126写入配置寄存器124以重设微处理器100的动态重设功能单元128。在一实施例中,重设单元104包括由微处理器100所执行的微程序代码,其执行读取与该相符静态指纹有关的配置设定126以及写入配置设定126至配置寄存器124。更适宜地,当指纹单元102检测到指纹相符,其会引发将控制权透过陷阱以转往至微程序代码。在另一实施例中,重设单元104包括硬件控制逻辑,其可回应指纹单元102通知指纹相符以读取与相符静态指纹有关的配置设定126,并将该相符静态指纹有关的配置设定126写入配置寄存器124。重设单元104及指纹单元102利用控制信号144进行沟通。
需了解的是,在微处理器100中并非所有功能单元均是动态可重设。亦需了解的是,当重设单元104重设动态重设功能单元128时,可能不会写入各个配置寄存器124,且不会各个动态重设功能单元128均被重设,尽管会有至少一配置寄存器124被写入,也会有至少一动态重设功能单元128被重设。
当微处理器100的动态重设功能单元128执行指令并累计指令信息142时,指纹单元102依据可产生动态指纹的数学运算以接收来自微处理器100的动态重设功能单元128的指令信息142,其中动态指纹与静态指纹进行比较。更适宜地,指纹单元102包括多个指纹单元102,各指纹单元102依据不同的指纹产生准测以产生一动态指纹,并将其与一静态指纹进行比较。在一实施例中,有4个分开的指纹单元102,且它们会被逻辑性地链接在一起以完成相对复杂的指令序列的检测。指纹单元102的一实施例会在图2中进一步详述。
指纹编程寄存器132可由软件(例如装置驱动程序或基本输入输出系统)进行写入以控制指纹单元102,以及填写静态指纹及其有关配置设定及指纹产生准则126的表单。
在此处所介绍的微处理器100动态重设的一个使用实例是为了增加效能和/或降低微处理器100的功耗,例如当执行程序的已知部分,其效能及功耗会显著地受到动态重设该微处理器100至已知配置的影响。
在此所介绍的微处理器100的动态重设处理的使用方式的另一例子是为了防止微处理器100不正确地运作,例如当微处理器100处理一程序的一部分时,若该程序部分由微处理器100以一第一已知配置执行时会导致一功能性错误,但若由微处理器100以一第二已知配置执行时会产生一正确结果。举例来说,当数据预先提取器用以执行数据预先提取的一特别积极模式(particularly aggressive mode)时,若微处理器100执行该程序部分,微处理器100会产生一功能性错误。相反地,当数据预先提取器执行数据预先提取的一较不积极模式(less aggressive mode)或是数据预先提取已完全关闭时,微处理器100不会产生功能性错误。功能性错误,例如但非限定为,数据损毁、停止条件(例如死结或活结(livelock))、不正常的效能缓慢、以及操作系统未准备好补救的例外情况。引发微处理器100产生功能性错误的设计缺失,可能直到微处理器100大量制造和/或已出货给顾客后仍未被发现。在这种情况下,藉由动态重设微处理器100以修正此问题是有帮助的,而不用透过重新设计微处理器100、和/或召回或不贩售有错误元件的方式来处理。
在此介绍的动态重设实施例的潜在好处是微处理器100可以相对较佳的尺度(granularity)来辨识软件应用程序的部分。此方式对于包括不同部分的软件应用程序来说特别有用,因为软件应用程序的不同部分可依据不同配置而动态重设微处理器100的功能单元而得到好处。举例来说,一电玩游戏可包括一程序载入部分、一初始化部分、一图形计算部分、一使用者输入接收部分、以及一策略计算部分,各个程序部分可在微处理器100功能单元的不同配置下有较佳的效能。需了解的是,若微处理器100较快地执行该程序部分、使用较少功耗以执行该程序部分、和/或正确地执行该程序部分,表示微处理器100的效能较佳。
请参考图2,图2是显示依据本发明一实施例中的指纹单元102的详细功能方块图。指纹单元102包括一数学运算单元222、比较逻辑226、一静态指纹232、一衰退(decay)计数器242、以及控制逻辑234。
数学运算单元222接收来自图1动态重设功能单元128的指令信息142,并依据一数学运算累计指令信息以产生一结果224,该结果为动态指纹,其中数学运算可参考上述实施例。在图2的实施例中,指令信息142包括该指令的指令指针202(亦即指令地址),一位移字段(又称为“栏位”)204、运算码字段206、modRM字段208、SIB字段212、及来自该指令的前缀214。在其他实施例中,其他指令字段包括指令信息142,特别是在使用不同于x86架构的不同指令集架构的实施例。更适宜地,指令集架构具有可变长度指令(例如x86指令即为可变长度),且微处理器100的提取单元包括一指令格式化单元,当由指令快取提取指令位的区块并将其格式化至个别指令时,数学运算电路222将在微处理器100的指令格式化单元格式化指令时接收指令信息142。在一实施例中,指令格式化单元可在每个时钟周期格式化至多三个指令,并在每个时钟周期为该至多三个指令提供指令信息142至数学运算电路222。在指令集架构具有固定长度指令的另一实施例中,当由指令快取提取指令时,指令信息142可由提取单元所提供。
更适宜地,数学运算电路222包括一多输入移位寄存器(multiple inputshift register,MISR),其使用一最大计数多项式(maximum count polynomial)。更适宜地,当各指令被格式化时,该(选择性过滤的)指令信息142是与MISR阶数输出(taps)与最左输入位的布尔异或(Boolean XOR,互斥或)结果再右移一位的现阶段状态进行互斥或运算。在一实施例中,MISR为50位宽,且MISR的阶数为49、9及0以完成该最大计数多项式。在一实施例中,产生一误合(false match)的别名指令串(alias strand)的可能性大约是1:250(250次中会产生一次)。如上所述,虽然指令串辨识(strand identification)可能不绝对是唯一的,在多数用途上,该辨识可为充份唯一的(sufficiently unique),例如是增进效能及改善设计缺失的影响。在一少见的别名指令串误合的例子中,其结果可能为较低的效能、较高的功耗、和/或无法修正在微处理器100设计中的缺失。如上所述,指纹单元102可在每个时钟周期接收用于多个指令的指令信息142,且数学运算电路222执行数学运算以在单一时钟周期中累计所有的指令信息142。进一步而言,在MISR实施例中,数学运算电路222在单一时钟周期中执行所有指令信息142的异或运算。
数学运算电路222依据来自控制逻辑234所接收的信息238(其包括指纹产生准则238)以产生结果。指纹产生准则238包括起始条件、停止条件及重置条件,当数学运算电路222累计指令信息142以产生动态指纹224时作为控制之用。指纹产生准则238亦指定数学运算电路在累计以产生动态指纹224时指令信息142的部分(202,204,206,208,212,214),并暗示会被过滤的部分。更适宜地,与被过滤部分有关的位会被插入二进位的0值。
比较器224将数学运算电路222所产生的动态指纹与静态指纹232进行比较,并在两个指纹相符时产生一真值于一相符信号228上并提供至控制逻辑234。在一实施例中,当达到一停止条件时,比较器226仅执行比较运算。更适宜地,一装置驱动器和/或微程序代码载入该静态指纹232及指纹产生准则238。当控制逻辑234检测到在该相符信号228上的真值时,控制逻辑234会利用控制信号144以将该相符情况与重设单元104进行沟通。除此之外,控制逻辑234利用一串接信号(chain signal)244将该相符情况与另一指纹单元102进行沟通,其细节将于后述的图6及图7详述。控制逻辑234亦接收来自其他指纹单元102的串接信号244。更进一步,控制逻辑234可载入一衰减计数器242以回应该相符情况,而衰减计数器的运算将于图5的实施例中详述。
请参考图3,图3是显示在本发明一实施例中用以产生已知目标程序部分及其有关的静态指纹、配置设定及指纹产生准则的数据库的流程图。该流程开始于方块302。
在方块302,由工程师辨识程序部分的列表,其用于最佳化微处理器100的动态重设功能单元128的配置,例如增进其效能(较快的程序部分执行或较低的功耗)和/或修正错误。流程前进至方块304。
在方块304,工程师决定对在方块302中所辨识的程序部分的一个,决定动态重设功能单元128的最佳化配置设定。流程前进至方块306。
在方块306,工程师辨识与在方块304中所辨识的程序部分有关的指令串(strand),并设计指纹产生准则,其可用以产生用于该指令串的一指纹。流程前进至方块308。
在方块308,工程师利用在方块306所设计的指纹产生准则,以产生用于与该程序部分有关的该指令串的一静态指纹。流程前进至方块312。
在方块312,工程师存储与该程序部分有关的静态指纹、配置设定、以及指纹产生准则。流程前进至方块314。
在方块314,工程师针对在方块302中所指出的各个其他程序部分重复方块304、306、308及312以编译(compile)一数据库。流程结束于方块314。
请参考图4,图4是显示本发明一实施例中微处理器100动态重设其本身的操作流程图。流程开始于方块402。在方块402,微处理器100接收图1的指纹设定准则表126以及相关的配置设定与指纹产生准则。更适宜地,指纹设定准则表126包括依据图3的流程所编译的数据库的一部分。指纹设定准则表126是可编程的。更适宜地,一装置驱动器将该指纹设定准则表126提供至该微处理器100。举例来说,该装置驱动器可对操作系统的一或多个正在运作的软件应用程序判断是否为编译于数据库者,且回应上述动作而提供与该正在运作的软件应用程序的程序部分有关的静态指纹、配置设定及指纹产生准则126表。选择性地,系统固件,例如BIOS,提供指纹设定准则表126至微处理器100,特别是在动态重设用于修正错误的情况。又,选择性地,指纹设定准则表126可通过微程序代码的一更新(patch)而载入微处理器100。更适宜地,在微处理器100重置后且指纹产生准则仍不确定地或至少在微处理器100再度重置为止,微程序代码更新会被载入,这个方式在某些情况下会特别有帮助,例如动态重设用于修正错误时,其会在微处理器100重置后的软件执行过程的早期就显露出来。该指纹设定准则表126可包括数量远大于指纹单元102的程序部分的信息,且当程序执行时,微处理器100的微程序代码可动态地载入静态指纹及指纹产生准则至指纹单元102而不需要装置驱动器的介入。更适宜地,指纹设定准则表126被存放至微处理器100的一私有存储器,其无法被架构程序所存取,但可由微处理器100的微程序代码所存取。流程前进至方块404。
在方块404,指纹单元102载入静态指纹及指纹产生准则。如上所述,其会发生在装置驱动器写入指纹设定准则表126和/或当微程序代码检测到事件,例如是指纹单元102已检测到指纹相符时(例如图7的方块703)。流程前进至方块406。
在方块406,当动态重设功能单元128正依据配置寄存器124中的目前配置设定而执行指令时,指纹单元102会依据在方块404所载入的指纹产生准则,并基于数学运算以累计指令信息142藉以产生动态指纹224,再将其与在方块404中所载入的静态指纹232进行比较。流程前进至决定方块408。
在决定方块408,指纹单元102(例如比较器226及控制逻辑234)判断静态指纹及动态指纹是否相符。若相符,则流程前进至方块412;否则流程前进至方块406。
在方块412,控制逻辑234利用控制信号144通知重设单元104该相符情况,且重设单元104会回应地利用与在方块408中与动态指纹224相符的静态指纹232有关的配置设定来重设动态重设功能单元128(例如藉由写入配置寄存器124)。流程结束于方块412。
请参考图5,图5是显示依据本发明一实施例中微处理器110动态重设其本身的更进一步运作的流程图。该流程由方块514开始,特别是由图4的方块412开始。
在方块514,控制逻辑234将相关于在方块408中相符的静态指纹的衰减计数值载入至衰减计数器242。更适宜地,该衰减计数值包括于图1中的指纹设定准则表126。流程前进至方块516。
在方块516,周期性地-特别是每时钟周期-该衰减计数器242会减少计数。该流程前进至决定方块518。
在决定方块518,控制逻辑234判断衰减计数值是否已过期(expired)。若是,则该流程前进至方块522;否则,该流程回到方块516。
在方块522,控制逻辑234利用控制信号144通知重设单元104该衰减计数器242已过期,且该重设单元104回应地以指纹设定准则表126中的预设配置设定来重设动态重设功能单元128。在一实施例中,预设配置设定被编程至微程序代码中。在一实施例中,预设配置设定包括于指纹设定准则表126中。在一实施例中,预设配置设定为在方块412中的动态重设动作执行前的先前配置设定(亦即在方块406中微处理器100正在执行的指令的目前配置设定)。在一实施例中,该多个配置设定的一子集合会回到其预设值,同时该多个配置设定的另一子集合会维持在方块412所写入的数值。更适宜地,这些子集合均定义于指纹设定准则表126中。流程结束于方块522。
请参考图6,图6是显示依据本发明又一实施例中微处理器100动态重设其本身的运作流程图。该流程开始于方块602。
在方块602,指纹单元102中中的一个(用第一指纹单元表示)检测到其动态指纹224及其静态指纹232相符,并表示该相符情况,例如藉由一串表示符(chain indicator)244。流程前进至方块604。
在方块604,不同的指纹单元102(用第二指纹单元表示)接收在方块602由第一指纹单元所产生的表示符,并回应地开始依据基于指纹产生准则的数学运算以累计指令信息142,藉以产生动态指纹224并将其与静态指纹232进行比较。该流程前进至方块606。
在方块606,第二指纹单元检测到其动态指纹224及其静态指纹232的相符情况。流程前进至方块608。
在方块608,控制逻辑234以控制信号144通知重设单元104相符情况已找到,且重设单元104回应地以在方块606中与动态指纹224相符的静态指纹232有关的配置设定126以重设动态重设功能单元128。流程结束于方块608。
请参考图7,图7是显示依据本发明又一实施例中微处理器100动态重设其本身的运作流程图。该流程开始于方块702。
在方块702,指纹单元102中的一个检测到其动态指纹224及其静态指纹232相符,并表示该相符情况,例如通过控制信号144。流程前进至方块703。
在方块703,重设单元104载入具有一新静态指纹232及其相关的指纹产生准则至指纹单元102,藉以回应在方块702中已找到该相符情况的表示。流程前进至方块704。
在方块704,指纹单元102依据基于在方块703中所载入的该新指纹产生准则的数学运算以累计指令信息142,藉以产生动态指纹224,并将其与静态指纹232进行比较。流程前进至方块706。
在方块706,指纹单元102检测到其动态指纹224及其静态指纹232的一相符情况。流程前进至方块708。
在方块708,控制逻辑234以控制信号144通知重设单元104已找到新的相符情况,且重设单元104回应地以在方块706中与动态指纹224相符的新静态指纹232有关的配置设定以重设动态重设功能单元128。流程结束于方块708。
虽然图7描述指纹单元102仅一次有效地串接至其本身(chain),更适宜地,指纹单元102可串接至其本身更多次。更进一步,虽然图6中仅描述两个指纹单元102的串接,更适宜地,所有的指纹单元102可依同样的方式进行串接。更进一步,图6的实施例可与图7的实施例合并,使得用于正在搜寻的相符情况的目前载入至指纹单元102的静态指纹的集合会动态地变化,使得具有长于指纹单元102的数量的程序部分之链结的数量可被检测到,且动态重设功能单元128可依据需求被动态重设。
请参考图8,图8是显示依据本发明另一实施例中图1的指纹单元102的方块图。图8的指纹单元102与图2中的指纹单元102类似,然而其包括了一指令计数器822、一第二比较器826、以及一静态指令计数值832。
指令计数器822接收来自图1的动态重设功能性单元128的指令信息142,其为一动态计数值,并在每次遇到由控制逻辑234所接收的指令计数产生准则838所指定类型的指令时产生一结果824。更适宜地,指令计数产生准则838指定要计数的指令类型。在一实施例中,要计数的指令类型包括所有指令、子程序调用类型指令、回传类型指令(return type instruction)、NOP类型指令、以及限制在微程序代码的指令(意即用微程序代码实现)。在一实施例中,数学运算电路222仅累计特定类型且由指令计数器所计数的指令信息142,而所排除的指令类型的指令信息142不会被数学运算电路222所累计。在一实施例中,NOP指令包括除了单字节x86NOP指令之外的指令,例如是多字节指令,其可有效地做为一NOP指令(0x90),其细节将于图10中详述。
比较器826比较由指令计数器822所产生的比较动态指令计数值824及静态指令计数值832,若两个指令计数值相符,则产生一真值于提供至控制逻辑234的一第二相符信号。在一实施例中,当达到一停止条件时,比较器826仅进行比较动作。更适宜地,一装置驱动器和/或微程序代码载入静态指令计数值832及指令计数产生准则838。当控制逻辑234检测到在相符信号828的一真值时,控制逻辑234利用控制信号144通知重设单元104该相符情况。除此之外,控制逻辑234利用一串接信号244通知其他的指纹单元102该相符情况。控制逻辑234可载入衰减计数值242以回应该相符情况。更适宜地,可采用类似于图3所述的方式将静态指令计数值832及指令计数产生准则838编译至已知目标程序部分的数据库中。
请参考图9,图9是显示依据本发明一实施例中的微处理器100动态重设其本身的运作流程图。图9在某些方面与图4类似;然而,图9描述指纹单元102的运作以动态重设微处理器100的操作回应检测到一静态指令计数值而不是一静态指纹,其细节如下所述。然而,需注意的是指纹单元102可用以同时检测指纹及指令计数值。除此之外,指纹单元102可用串接的方式运作(例如图6及图7的实施例所述),让指纹单元102载入以同时检测所需的指纹及指令计数值以动态重设微处理器100。流程开始于方块902。
在方块902,微处理器100接收包括静态指令计数值及图1中有关的配置设定及指令计数产生准则的指纹设定准则表126。流程前进至方块904。
在方块904,指纹单元102载入静态指令计数值及指令计数产生准则。流程前进至方块906。
在方块906,当动态重设功能性单元128正依据在配置寄存器124中的目前配置设定以执行指令时,指纹单元102依据在方块904中所载入的指令计数产生准则以计数指令,藉以产生动态指令计数值824,并将其与在方块904中所载入的静态指令计数值832进行比较。流程前进至决定方块908。
在决定方块908,指纹单元102(例如比较器826及控制逻辑)决定在静态指令计数值及动态指令计数值之间是否相符。若是,则该流程前进至方块912;否则,流程回到方块906。
在方块912,控制逻辑234利用控制信号144通知重设单元104该相符情况,且重设单元104回应地利用在方块908中与动态指令计数值相符的静态指令计数值有关的配置设定以重设动态重设功能性单元128(例如,对组态暂存器124进行写入操作)。流程结束于方块912。
上述所介绍的动态重设的实施例包含成本取舍的议题。首先,指纹单元的硬件芯片实际面积及功耗会有成本。第二,改变配置设定亦会有成本,其来自暂时停止(suspend)指令处理以改变配置设定。此成本也可来自所辨识别名指令串为少数实例而改变的配置设定所导致较低的效能。
整合NOP滑动检测器
在此所介绍的指纹单元的另一个用处是检测一NOP滑动(可称为NOPslide或NOP sled)。
NOP滑动指来自一处理器提取并执行指令的一存储器的连续NOP指令序列。NOP滑动通常是入侵者未经许可访问计算机系统的途径。NOP指令指可执行一运作的指令,但它并不影响处理器的架构状态、或是在入侵者试图未经许可访问计算机系统,包括处理器所接受的情形下,一部分影响架构状态。NOP滑动的使用在计算机安全的领域为已知技术,但在此会简短介绍。
入侵者会试图发掘在计算机系统上运作的具有执行权限(executiveprivileges)软件的弱点。藉由发现弱点,入侵者可让「壳码(shellcode)」写入至计算机系统的存储器中。壳码会执行对攻击者有利的动作,例如提供系统的访问执行权限,其目的是让控制权转移到壳码。然而,某些已发现弱点的性质是让在存储器中的目标地址不知不觉地转移,因此目标地址是无法准确得知的。当然,在一些例子中根本不知道目标地址,而入侵者依赖少量相似性统计将目标地址视为壳码。第一种方式是入侵者试图以写入许多壳码的拷贝至存储器来增强少量相似度统计。第二种方式是用许多不同次数来尝试攻击。第三种方式是使用NOP滑动。
入侵者会将NOP滑动写入在壳码之前,亦即,其可为转移控制权提供一安全降落点。NOP滑动可能非常大,举例来说,可以是是数十万字节大小,只要目标地址的控制权转移到NOP滑动之内的某处,处理器会仅执行NOP指令,直到其达到并执行壳码为止。执行(一可能大数量)的NOP指令对于入侵者来说是可接受的,因为除非入侵者所不关心的方式,NOP指令不会改变处理器的架构状态。入侵者可能会写入NOP滑动的许多拷贝及壳码,且可能尝试许多次使用这种方式进行入侵,而上述全部方式的合并可增进取得已执行壳码的相似度。
因为NOP滑动常常会包含于在入侵者的攻击中,计算机系统可分析在网络上传输至一计算机系统的分组以搜寻一NOP滑动。若在一分组中检测到NOP滑动,该分组会被丢弃(discard)。该技巧常常用于网络攻击检测系统(network intrusion detection system,NIDS)。NIDS的缺点是分组可能被加密,因此会更难检测NOP滑动。更进一步,攻击者的输入包括NOP滑动及壳码也可能被加密。在此处所介绍的NOP滑动检测器的实施例的优点是其可在当处理器中的NOP指令序列将要被执行时检测该序列,也因此可保证在当时一定会被解码且被NOP滑动检测器所检查。
请参考图10,图10是显示依据本发明一实施例中微处理器100检测NOP滑动的运作流程图,特别是指纹单元102被使用为一NOP滑动检测器。NOP指令为可执行一动作的指令,其不会影响到处理器的架构状态(除了更新指令指针)或是仅以一预定方式影响架构状态。微处理器100的设计者在设计预定方式时,需了解对入侵者而言有哪些未经许可而得到计算机系统,包括微处理器100,的访问权的方式是可接受的,且此方式会随着壳码所采取的动作而变化。依据不同实施例,在方块1004由指令计数器822所计数的NOP指令的列表,其为了重置条件的目的用于判断非NOP指令,如下所述-包括下面多种组合:微处理器100的指令集中的架构性定义的NOP指令(例如x86架构NOP指令,0x90);分支(branch)指令,其分支至下一循序指令;除了架构状态的一预定集合之外,例如是一或两个条件标志寄存器(例如x86EFLAGS),及堆迭指针寄存器不会改变微处理器100的架构状态的指令。例如下列x86架构指令:PUSH ES(0x06)、PUSH CS(0x0E)、PUSH SS(0x16)、PUSH DS(0x1E)、PUSH register(0x50-0x57)、PUSH SP(0x5C)、PUSHA(0x60)、WAIT(0x9B)、SAHF(0x9E)、REPNE prefix(0xF2)、CLD(0xFC)、STD(0xFD)、CLC(0xF8)、STC(0xF9)、CMC(0xF5)。除此之外,在微处理器100的指令集架构具有变长度指令的一实施例中,NOP指令的列表会被包含于包括多字节NOP指令的多种组合中,其中个别所取得的指令的各字节为一NOP指令。换个方式来说,一多字节NOP指令具有一种特性,使得若控制权转移至指令的任何字节,剩下的字节或指令的字节会构成微处理器100的指令集架构所定义的一有效指令(例如不会产生一无效指令例外),否则具有与一单字节NOP指令相同的特性。下列例子为x86架构的多字节NOP指令:2字节CMP指令,其中modRM位具有一单字节NOP指令(ox38-0x3B)的数值;2字节CMP指令,其中的直接字节具有一单元字节NOP指令(0x3C)的数值;3字节CMP指,其中的modRM字节及直接字节具有一单字节NOP指令(0x80,0x83)的数值;2字节TST指令,其中modRM字节具有一单字节NOP指令(0x84-0x85)的数值;2字节TST指令,其中的直接字节具有一单一字节NOP指令(0xA8)的数值;2字节包装指令,其中modRM字节具有一单一字节NOP指令的数值,例如是PMADDWD(0xF5)、PSUBB(0xF8)、PSUBW(0xF9)、PADDB(0xFC)、PADDW(0xFD)。流程开始于方块1002。
在方块1002,指纹单元102载入静态指令计数值822及指令计数产生准则838,如同图8及图9的实施例所述的方式。更适宜地,静态指令计数值832可让使用者或系统软件藉由指纹编程寄存器132而可编程。在一实施例中,静态指令计数值832通过微处理器100的熔丝而可编程。在一实施例中,起始条件为检测一回传指令,重置条件为检测到不是一NOP指令的指令(即为非NOP指令),且没有指定停止条件其他实施例亦在本发明中被考虑,例如其起始条件为检测到一子程序调用指令、由中断指令回传、或是一系统调用或回传指令。流程前进至方块1004。
在方块1004,当微处理器100正提取并执行指令,指纹单元102依据在方块1002所指出的指令计数产生准则838以计算连续NOP指令,藉以产生一动态指令计数值824,并以所产生的动态指令计数值824与在方块1002所载入的静态指令计数值832进行比较。流程前进至决定方块1006。
在决定方块1006,指纹单元102判断动态指令计数值824是否与静态指令计数值832相符。若是,则该流程前进至方块1008;否则,流程回到方块1004。
在方块1008,指纹单元102回应微处理器100暂停(suspend)架构指令的执行以表示该相符情况。更适宜地,指纹单元102造成微程序代码的陷阱(trap)以回应检测到该相符情况(例如,回应检测到NOP滑动)。在一实施例中,微程序代码产生一无效运算码错误(例如x86架构的INT 6)。在一实施例中,微程序代码产生一机器检查例外(machine check exception,例如是x86架构的#MC,vector编号18)。在一实施例中,若微处理器100处于一虚拟机器模式(例如是x86的VMX mode),该微程序代码离开该虚拟机器模式。在一实施例中,若微处理器处于一信任执行模式(trusted execution mode),微程序代码采取一安全例外动作(security exception)。流程结束于方块1008。
虽然指纹单元及数学运算电路的特定实施例已被公开,需了解的是其他实施例可用于产生动态指纹及指令计数值,并检测静态指纹及指令计数值的相符情况。
虽然以上叙述本发明多种实施方式,必须声明的是,上述内容乃本技术的部分应用例子,并非用来限定本发明的范围。本领域技术人员可依循本发明特征,以现有技术另外发展出许多变形。例如,可以软件方式实现本申请所公开的内容,例如,所公开的设备或方法的功能、制作、模型化、模拟、说明和/或测试。上述软件可采用常见的程序语言(例如,C、C++)、硬件描述语言(hardware description language,HDL)包括Verilog HDL、VHDL…等或其他可用的程序语言。上述软件可载于现有的任何计算机存储介质,例如,磁记录装置(magnetic tape)、半导体(semiconductor)、硬盘(magnetic disk)、或光盘(optical disc、如CD-ROM、DVD-ROM等),也可载于网络、有线系统、或其他通讯媒体。本发明所公开的各种装置与方法可由一半导体知识产权内核─例如一微处理器内核,可由硬件描述语言实现─保护,且可被转换为硬件型式,以集成电路方式制作。此外,所公开的装置与方法也可由硬件与软件共同设计实现。因此,本发明不应受上述任何实施方式所限定,应当根据权利要求书的内容作解读。特别是,本发明可被实现于一微处理器中,实现一般常用的计算机。本发明所属技术领域人员有可能基于本发明,以所公开的概念以及所述的特殊实施方式为基础,设计或调整其他结构,以在不偏离权利要求书所界定的内容的前提下,发展与本发明具有同样目的的技术。
相关申请的交叉引用
本申请要求于2013年9月20日提交的美国专利申请序列号61/880,620(案号CNTR2701I00-USPPA)和于2013年10月10日提交的美国专利申请序列号14/050,687(案号CNTR2701I00-US)的优先权,通过引用而为了所有目的将其全部内容合并于此。