首页> 中国专利> 在安全域与次安全域之间进行转换时保护安全数据和程序代码免受非安全访问的数据处理装置和方法

在安全域与次安全域之间进行转换时保护安全数据和程序代码免受非安全访问的数据处理装置和方法

摘要

数据处理装置和方法被提供用于处理数据。数据处理装置包括:处理电路,用于响应于程序代码而执行数据处理操作;以及数据存储设备,用于存储数据,数据存储设备包括多个区域,其包括安全区域和次安全区域。安全区域被配置为存储当在安全域中操作时可被处理电路访问而当在次安全域中操作时不可被处理电路访问的敏感数据。数据存储设备包括多个栈,其包括在安全区域中的安全栈。处理电路包括栈访问电路,其被配置为响应于需要从安全域转换到次安全域的事件而将预定处理状态存储到安全栈。特别地,如果事件是第一事件类型,则由栈访问电路存储的预定处理状态至少包括被存储在安全栈上的预定相对位置处的返回地址。相反,如果事件是第二事件类型,则由栈访问电路存储的预定处理状态至少包括被存储在预定相对位置处的第一值,其中该第一值不是程序代码的有效地址。处理电路还包括故障检查电路,其被配置为在接收到从次安全域到安全域的第一事件类型返回时,如果存储在预定相对位置中的数据是第一值,则标识第一故障情况。该方法提供了对抗试图使用错误返回方法(例如,从异常执行函数调用返回或从函数调用执行异常返回)的来自次安全域的攻击的保护。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-11-03

    授权

    授权

  • 2015-11-18

    实质审查的生效 IPC(主分类):G06F21/52 申请日:20130807

    实质审查的生效

  • 2015-06-10

    公开

    公开

说明书

技术领域

本发明涉及数据处理领域,并且特别涉及敏感数据和代码的处理。

背景技术

很多数据处理系统及架构提供了隔离并保护敏感数据和代码部分不被 无权的人或进程访问的方法。虽然能够提供安全是重要的,但是在与该保 护相关联的性能和电路面积中存在开销。

在诸如微控制器之类的小型系统中,将这些开销保持较低是非常重要 的,从而可能需要在安全等级与性能之间做出折衷。

英国剑桥的用其Trustzone结构提供了保持数据和代码安全的 一个方法,其中存在安全状态和非安全状态(也被称为安全和非安全 域),并且异常指令被用于在状态之间进行转换,该异常处理器保护安全 侧的安全。虽然该方法提供了很高的安全度,但是需要以软件异常处理器 形式的相当大的软件干预来改变安全状态,这既降低了系统的性能,又增 加了为安全软件开发外部应用程序接口API所需的工作量,因为所有通话 必须通过异常处理器来代理。类似地,虽然在安全域中发生但需要在非安 全域中处理的异常也需要通过安全异常处理器来代理,这允许安全状态在 控制转到非安全异常处理器之前得到保护。

US7966466和US2008/0250216公开了一种供选择的安全系统,其中 数据存储设备具有安全侧和非安全侧,并且在该数据存储设备中代码当前 正被执行的位置确定了处理器正在其中操作的域,从而确定了允许访问的 数据。

包含安全状态的许多系统架构只允许用于在状态之间进行转换(通常 通过使用异常)的一种机制,因为这简化了保护安全状态中的数据和程序 代码安全的任务。但是,为了提高速度和效率,也可以提供用于在安全和 次安全状态之间进行转换的多种机制。例如,由Microchip科技公司开发 的CodeGuard系统允许异常和直接函数调用作为用于在安全性状态之间进 行转换的机制。但是,使用用于在状态之间进行转换的多种机制增加了对 恶意攻击的脆弱性,例如,允许次安全状态中的软件试图通过具有与用于 从安全状态转换到次安全状态中的原机制不同的类型的返回机制返回安全 状态(例如,通过使用函数调用返回来从异常返回,或使用异常返回来从 函数调用返回)。

发明内容

从第一方面来看,本发明提供了一种数据处理装置,所述数据处理装 置包括:处理电路,所述处理电路被配置为响应于程序代码而执行数据处 理操作;数据存储设备,所述数据存储设备被配置为存储数据,所述数据 存储设备包括多个区域,所述区域包括安全区域和次安全区域,其中所述 安全区域被配置为存储当在安全域中操作时可被所述处理电路访问而当在 次安全域中操作时不可被所述处理电路访问的敏感数据;所述数据存储设 备包括多个栈,所述栈包括在所述安全区域中的安全栈;所述处理电路包 括栈访问电路,所述栈访问电路被配置为响应于需要从所述安全域转换到 所述次安全域的事件而将预定处理状态存储到所述安全栈;如果所述事件 是第一事件类型,则由所述栈访问电路存储的所述预定处理状态至少包括 被存储在所述安全栈上的预定相对位置处的返回地址;如果所述事件是第 二事件类型,则由所述栈访问电路存储的所述预定处理状态至少包括被存 储在所述预定相对位置处的第一值,其中所述第一值不是程序代码的有效 地址;并且所述处理电路还包括故障检查电路,所述故障检查电路被配置 为在接收到从所述次安全域到所述安全域的第一事件类型返回时,如果存 储在所述预定相对位置的数据是所述第一值,则标识第一故障情况。

根据本发明,允许多个事件类型导致在安全域和次安全域之间的转 换。如果事件需要从安全域转换到次安全域,则栈访问电路被安排为在向 次安全域的转换发生之前将某预定处理状态存储在安全栈上。什么被存储 在安全栈上作为该预定处理状态将取决于事件类型,并且被选择来保证如 果次安全程序代码试图使用与不同事件类型相关联的返回来返回到安全 域,则这将被检测到。

特别地,如果导致从安全域转换到次安全域的事件是第一事件类型, 则栈访问电路存储在安全栈上的预定处理状态至少包括返回地址,并且该 返回地址被存储在安全栈上的预定相对位置处(例如,在栈访问电路使用 的栈帧的底部条目处来存储预定处理状态,或在相对于该底部条目的某预 定偏移处来存储预定处理状态)。

类似地,如果事件是第二事件类型,则在该事件中由栈访问电路存储 的预定处理状态至少包括被存储在该预定相对位置处的第一值。该第一值 是不是程序代码的有效地址的值。

如果随后第一事件类型返回从次安全域到安全域被接收,则故障检查 电路将从预定相对位置取回数据。由于第一事件类型返回正在被使用,则 应该是该预定相对位置存储先前由栈访问电路存储的返回地址的情况。但 是,如果相反它存储第一值,则这指示次安全程序代码正在试图通过第一 事件类型返回来返回而不管原来从安全域到次安全域的转换是由于第二事 件类型的事实的情况,并且在这种情况下,故障检查电路将标识第一故障 情况,从而标记该活动。因此,该机制防止恶意用户使用很多种攻击,包 括在给定先前导致从安全域转换到次安全域中的时间类型的情况下,试图 通过使用与应该使用不同的事件类型返回到安全域中来间接执行到安全代 码的任意分支。

第一事件类型和第二事件类型可采用各种形式。但是,在一个实施例 中,第一事件类型时函数返回,并且第二事件类型是异常。因此,上述机 制将保证试图紧接从安全域异常分支到次安全域中而执行函数调用返回到 安全域中的恶意攻击将被阻止。

在一个实施例中,如果事件是所述第一事件类型,则处理电路被配置 为向所述次安全域中被用于处理所述第一事件类型的程序代码提供虚拟 (dummy)返回地址,所述虚拟返回地址不是程序代码的有效地址。然 后,当完成次安全域中被用于处理所述第一事件类型的程序代码时,虚拟 返回地址使所述返回地址(即,实际返回地址)从安全栈中被获取。特别 地,当看到虚拟返回地址时,栈访问电路被安排为从安全栈加载预定相对 位置处保留的数据,因此故障检查电路可检查该数据是指定所期望的返回 地址,还是上面提到的指示故障情况的第一值。

在一个实施例中,虚拟返回地址还可被用于保证当事件导致从安全域 转换到次安全域时,随后的返回(使用该虚拟返回地址)将导致转换回到 安全域,从而允许故障检查电路执行所需检查。

在一个实施例中,如果事件是异常,则由栈访问电路存储的预定处理 状态包括预定签名,并且故障检查电路被配置为当接收到从次安全域到安 全域的异常返回时,如果预定签名不在由栈访问电路存储的预定处理状态 中,则标识第二故障情况。

通过这种方法,如果异常返回是紧接着通过函数调用来发生的从安全 域到次安全域中的转换而从次安全域发布的,则已被栈访问电路存储在安 全栈上的预定处理状态将不包括该预定签名,并且相应地这将指示使用不 正确返回的意图攻击。

预定签名可被置于安全栈内的任意适当位置,并采用任意想要的形 式。但是,在一个特别有效的实施例中,预定签名形成被存储在预定相对 位置处的上述第一值。因此,该单个预定签名使得第一和第二故障情况均 能够通过故障检查电路来检测。

在一个实施例中,如果事件是函数返回,则处理电路被配置为向所述 次安全域中被所述函数调用标识的程序代码提供虚拟函数调用返回地址, 该虚拟函数调用返回地址是从不是程序代码的有效地址的地址范围中选择 的,并且所述预定签名具有与所述虚拟函数调用返回地址不同的值。通过 保证预定签名具有与所述虚拟函数调用返回地址不同的值,这简化了处理 电路的实现,因为要被执行的所需动作可只根据正在被分析的值来确定, 而与该值是从函数调用返回产生的还是从栈中读取的无关。

或者或此外,如果事件是异常,则处理电路被配置为向所述次安全域 中被用于处理所述异常的程序代码提供虚拟异常返回地址,该虚拟异常返 回地址是从不是程序代码的有效地址的地址范围中选择的;并且所述预定 签名具有与所述虚拟异常返回地址不同的值。同样,通过使预定签名不同 于虚拟异常返回地址可获得实现效率。

在一个实施例中,预定相对位置是栈访问电路使用的栈帧内的预定位 置。虽然理论上该位置可以是栈帧内的任意位置,但在一个实施例中,该 预定位置是栈帧的底部位置,即,由栈指针指向的位置。

一旦第一故障情况被引发,则存在很多方法可以处理第一故障情况。 但是,在一个实施例中,处理电路响应于所述第一故障情况而在所述安全 域内执行故障处理程序代码。通过保证故障处理程序代码在安全域内被执 行,这防止了次安全域中的攻击者重新获取控制,从而相应地防止了重试 攻击。

作为用于阻止攻击的任意重试的替代机制,数据处理装置可被安排使 得如果所述第一故障情况被标识,则栈指针值不被调整,使得第一事件类 型返回的重放也将导致所述第一故障情况被标识。因此,通过不调整栈指 针,攻击者不能仅消费安全栈的最后位置并然后重试攻击以便在安全栈内 的不同位置处进入。

在一个实施例中,上述两种机制均可被用于提供对抗来自次安全域的 攻击的重试的鲁棒性。虽然以上机制是关于第一故障情况的处理来描述 的,但是其也可被等同应用于第二故障情况的处理。

在一个实施例中,可引起来自次安全域的潜在攻击的另一情境随着安 全栈的初始化而出现。在该时刻,安全栈将是空的。如果在该时刻,正在 被执行的程序代码在次安全域中,则程序代码可能试图返回到安全域中。 该返回应被阻止,因为不存在从安全域到次安全域的原转换来合理地从其 返回。在一个实施例中,数据处理装置通过保证在安全栈的初始化时,第 二值被存储在安全栈上的所述预定相对位置处来提供保护不受这种情景危 害,所述第二值与所述第一值不同,并且也不是程序代码的有效地址。然 后,故障检查电路被配置为当接收到从次安全域到安全域的返回时,如果 存储在所述预定相对位置中的数据是所述第二值,则标识第三故障情况。 根据该实施例,从次安全域的返回将导致故障检查电路加载被存储在安全 栈上的预定相对位置处的数据,并且在该情境中,该数据将标识上述第二 值,从而导致第三故障情况被检测。第三故障情况的处理可与上述针对第 一和第二故障情况相同的方式发生,从而保证攻击的任意重试也被阻止。

在一个实施例中,第三故障情况与第一故障情况相同,并且相应地, 相同的故障处理代码被用于这两个故障情况。因此,在这种实施例中,故 障检查电路不必区分第一和第二值。

在一个实施例中,数据处理装置还包括多个寄存器,并且如果事件是 异常,则由栈访问电路存储的预定处理状态还包括至少所述寄存器的子集 的内容。在一个特定实施例中,其内容被栈访问电路存储的寄存器的数量 将取决于该异常要被安全域还是次安全域来处理。

在一个实施例中,多个栈还包括在所述次安全区域中的次安全栈,并 且处理电路被配置为基于后台处理正在其中被执行的域来确定将数据存储 到哪个栈或从哪个栈加载数据。在本申请中,术语“后台处理”被用于指 示被函数调用或异常打断的处理。至少对于异常而言,较高优先级异常可 打断已在被处理的过程中的较低优先级异常。因此,如果异常处理程序自 身被更高优先级异常(这里称为抢占异常)打断,则被打断的异常处理程 序自身对于抢占异常可变为“后台处理”。

从第二方面来看,本申请提供了一种在数据处理装置上处理数据的方 法,所述数据处理装置包括:处理电路,所述处理电路用于响应于程序代 码而执行数据处理操作;以及数据存储设备,所述数据存储设备用于存储 数据,所述数据存储设备包括多个区域,所述区域包括安全区域和次安全 区域,所述安全区域被配置为存储当在安全域中操作时可被所述处理电路 访问而当在次安全域中操作时不可被所述处理电路访问的敏感数据;所述 数据存储设备包括多个栈,所述栈包括在所述安全区域中的安全栈;并且 所述方法包括:响应于需要从所述安全域转换到所述次安全域的事件而将 预定处理状态存储到所述安全栈;如果所述事件是第一事件类型,则至少 将被存储在所述安全栈上的预定相对位置处的返回地址存储为所述预定处 理状态;如果所述事件是第二事件类型,则至少将被存储在所述预定相对 位置处的第一值存储为所述预定处理状态,其中所述第一值不是程序代码 的有效地址;并且在接收到从所述次安全域到所述安全域的第一事件类型 返回时,如果存储在所述预定相对位置的数据是所述第一值,则标识第一 故障情况。

从第三方面来看,本申请提供了一种数据处理装置,所述数据处理装 置包括:数据处理装置,所述数据处理装置用于响应于程序代码而执行数 据处理操作;数据存储装置,所述数据存储装置用于存储数据,所述数据 存储装置包括多个区域,所述区域包括安全区域和次安全区域,所述安全 区域被配置为存储当在安全域中操作时可被所述处理电路访问而当在次安 全域中操作时不可被所述处理电路访问的敏感数据;所述数据存储装置包 括多个栈,所述栈包括在所述安全区域中的安全栈;所述处理装置包括栈 访问装置,所述栈访问装置用于响应于需要从所述安全域转换到所述次安 全域的事件而将预定处理状态存储到所述安全栈;如果所述事件是第一事 件类型,则由所述栈访问装置存储的所述预定处理状态至少包括被存储在 所述安全栈上的预定相对位置处的返回地址;如果所述事件是第二事件类 型,则由所述栈访问装置存储的所述预定处理状态至少包括被存储在所述 预定相对位置处的第一值,其中所述第一值不是程序代码的有效地址;并 且所述处理装置还包括故障检查装置,所述故障检查装置用于响应于接收 到从所述次安全域到所述安全域的第一事件类型返回,如果存储在所述预 定相对位置的数据是所述第一值,则标识第一故障情况。

附图说明

本发明将参考如附图所示的本发明的实施例,仅通过示例的方式来进 一步地说明,其中:

图1根据一个实施例,示出了具有带有安全区域和非安全区域的数据 存储设备的数据处理装置;

图2根据一个实施例,示意性地示出了存储器地址空间;

图3A和3B示出了所述实施例的技术意欲提供防护的两个不同攻击情 境;

图4A根据一个实施例,示意性地示出了在接收到函数调用或异常 时,预定处理状态在安全栈上的存储,而图4B示出了对于各种情境,该 预定处理状态的形式;

图5是示出了在一个实施例中,当接收到函数调用时处理电路的操作 的流程图;

图6是示出了在一个实施例中,当接收到异常时处理电路的操作的流 程图;

图7是示出了在一个实施例中,当处理分支操作时处理电路的操作的 流程图,包括分支操作是函数调用返回或异常返回的情况;

图8A和8B根据一个实施例,示意性地示出了当安全栈被初始化时, 存储在安全栈上的预定签名可如何被用于防止从次安全域分支到安全代码 中的无权尝试;

图9示出了当处理末尾连锁异常的链时执行状态保存和恢复操作的示 例;

图10示出了使用异常返回值的一部分来指示用于控制状态保存操作 的状态信息的示例;

图11是更详细地示出了执行被调用者寄存器的状态保存的第一示例 的流程图;

图12A是示出了在进入最初异常时设置异常返回地址的示例的流程 图;

图12B是示出了在进入末尾连锁异常时设置异常返回地址的示例的流 程图;

图13是示出了在从异常返回时所执行的状态恢复的示例的流程图;

图14是更详细地示出了异常返回处理的流程图;

图15和16示出了使用图10所示的状态信息可避免不必要的状态保存 和恢复操作的示例;

图17示出了较高优先级异常抢占较低优先级异常的示例;并且

图18A和18B示出了当在执行状态保存的过程中发生抢占时,可如何 执行状态保存的示例。

具体实施方式

图1示出了可以是例如微控制器的数据处理装置10。其包括用于处理 指令的处理电路20,以及用于存储由处理电路20进行处理的数据并且用 于存储处理电路20执行的程序代码的数据存储设备30。

数据存储设备30具有不同安全性的两个区域:安全区域32和非安全 区域34(这里也称为次安全区域)。存储在安全区域32中的数据在存储 在非安全区域34中的代码执行时不能被其访问。

数据处理装置10还具有存储器保护单元MPU 40,其控制对安全区域 32和非安全区域34的访问。虽然该控制可通过存储器保护单元来执行, 但在其他实施例中,其可由处理装置内的电路以更分布式的形式完成,该 电路监测当前正在被执行的代码所存储的区域,并基于此来控制对存储器 的不同区域的访问。

在该实施例中,处理电路20正在执行的域的安全性可根据当前正在 被执行的代码所存储的区域来确定。因此,存储在安全数据存储设备32 中的安全程序代码在安全域中被执行,并且使用安全栈36来存储数据 值。类似地,存储在非安全数据存储设备34中的非安全代码在非安全域 中被执行,并且使用非安全栈38来在执行期间存储数据值。用于确定当 前操作域的其他技术也是可以的,例如,基于随着控制流改变指令来标识 处理器应该在哪个域操作的目标域值。

处理电路20具有用于获取要被执行的指令的获取电路22。其还具有 用于对这些指令进行译码的译码电路24,以及用于执行这些指令的执行电 路26。要被执行的指令由获取电路22通过存储器保护单元MPU 40从数 据存储设备30来获取。指令和数据通过MPU 40取回,MPU 40控制对安 全区域和非安全区域的访问并将安全数据与非安全侧隔离。

在该实施例中,存在寄存器组60,其具有在数据处理过程中使用的通 用寄存器。这些通用寄存器具有程序计数器PC,其指示哪个指令是下一 个将被执行的指令;以及栈指针SP,其指示下一个数据访问应在栈中的哪 个点做出。在该实施例中,因为在安全侧存在栈,并且在非安全侧存在 栈,因此存在安全栈指针SSP和非安全栈指针NSP,但是在任意一个时 刻,这些指针中只有一个是正在被执行的程序直接可见的。应该注意的 是,在一些实施例中,对于每个栈可存在多个栈指针,但是仍然在任意一 个时刻只有一个将是可见的。在寄存器组60中还有用于存储正被处理电 路20处理的数据值的通用寄存器。在该实施例中,这些寄存器被标记为 R0到R12

寄存器组60还包括连接寄存器(link register)65,当异常被获取或函 数被调用时,其可被用于存储返回值。返回值允许系统确定返回是异常返 回还是函数返回,并且确定当从异常或函数返回时需要什么处理。不同种 类的返回值可被使用,包括:函数返回地址,其指示随着函数的完成而要 被处理的程序指令的地址;指示函数返回的虚拟函数返回值,对于该函数 返回,实际函数地址已被存储到安全栈以向次安全域隐藏实际函数地址; 以及异常返回(EXC_RETURN)值,其指示异常返回,并且可包括信息 (例如,后台处理被处理的域的安全等级的指示),该信息可使处理器确 定如何处理该异常返回,例如,当恢复状态时访问哪个栈以及需要加载多 少个寄存器。返回值的不同形式稍后将进行说明。

图1还示出了附加寄存器组64,其具有附加专用寄存器,例如,浮点 寄存器。在一个实施例中,可在安全配置寄存器(SCR)62中设置值来标 识附加寄存器组64中是否有寄存器能够存储安全数据,并且如果是,则 这些寄存器将被认为形成一组寄存器(与寄存器组60的寄存器一起)的 一部分,当控制从安全域到次安全域进行转换(反之亦然)时,该组寄存 器需要被管理。

存在很多可引起从安全域到次安全域转换(反之亦然)的机制。根据 所述实施例,用于在安全性域之间进行转换的一个允许的机制是函数调用 机制,其中函数调用可被发布以使得当前软件程序的执行暂停,以便使能 向该函数调用所标识的另一软件程序转换,该另一软件程序将在安全域还 是次安全域中被执行,取决于该另一软件程序在数据存储设备30中被存 储在哪里。一旦该另一软件程序已被执行,则执行函数调用返回以返回到 被暂停的原软件程序的执行。虽然一些函数调用将标识在与当前软件程序 相同的域中将被执行的目标软件程序,但在其他实例中,目标软件程序可 需要在与当前软件程序正在执行的域不同的域中执行。

根据所述实施例,可被用于在安全性域之间进行转换的另一机制是异 常机制。根据该机制,当异常发生时,当前软件程序的异常将被暂停,并 且替代的是,执行将分支到用于处理异常的异常处理程序,所使用的异常 处理程序取决于发生的异常的类型。一旦异常处理程序已被执行,则异常 返回将被用于返回到由于发生异常而被暂停的原软件程序。

异常控制电路28被提供以控制异常的获取,并且其中这些异常导致 从更安全到次安全域的转换,可存储敏感数据的一组寄存器将在获取异常 之前被清除,以避免存储在这些寄存器中的数据可被次安全侧获得。存储 在这些寄存器中的一些或全部中的状态将在栈访问电路70的控制下被存 储在安全栈上,使得在从异常返回时,该状态能够被恢复。为了异常处 理,用于控制将寄存器内容存储到适当的栈的栈访问电路70可被认为形 成异常控制电路28的一部分。但是,更一般地,还存在与在需要从安全 域到次安全域转换的函数调用发生时将预定处理状态存储到安全栈相关联 的一些栈访问电路70,因此在图1中,栈访问电路70被标识为与异常控 制电路28分离。

此外,如图1所示,故障检查电路75被提供用于检测在次安全域中 的软件试图通过返回机制返回到安全域的情况,该返回机制具有与被用于 从安全域转换到次安全域中的原机制不同的类型(例如,通过使用函数调 用返回来从异常中返回,或使用异常返回来从函数调用中返回)。虽然故 障检查电路75的一部分可被认为被包含在异常控制电路28中(即,负责 检查异常返回的部分),但是故障检查电路75的其他部分可被分布在处 理电路的硬件中的其他地方。例如,在一个实施例中,负责检查函数调用 返回的部分可与获取电路22相关联。故障检查电路75的操作稍后将进行 更详细地探讨。

虽然在图1中数据存储设备30包括单个安全区域和单个次安全区 域,但是这里所述的技术同样适用于包括两个以上不同安全性区域的不同 实现。

此外,虽然图1将异常控制电路28和栈访问电路70展示为与处理电 路20的其他部分(例如,执行级26)分离,但是实际上,异常控制电路 28和栈访问电路70可至少部分重新使用处理电路20的一些元件来控制异 常处理和栈操作。

图2示意性地示出了可被用于一个实施例的存储器地址空间。存储器 地址空间100将被分区以形成一个或多个安全区域和一个或多个次安全区 域。为了简洁起见,在图2中假设存在单个安全区域和单个次安全区域。 安全地址空间的一部分102将被留出用于存储将在安全域中被执行的程序 代码,而安全地址空间的另一部分104将被分配给安全栈36。安全地址空 间的剩余部分106将被用于各种目的,例如,作为存储器堆,作为在执行 过程中分配的自由空间等。次安全地址空间也将以类似的方式进行分区, 从而提供用于存储将在次安全域中被执行的程序代码的部分110,被分配 给次安全栈38的部分112,以及剩余部分114。

根据所述实施例,存储器地址空间还包括预留区域120,在该区域中 的任意地址都不是程序代码的有效地址。如以下将进行的更详细的探讨那 样,这些预留地址中的一些被用于向所述实施例提供想要的功能。

为了提高速度和效率,上述实施例提供了用于在安全与次安全域之间 进行转换的两种机制,即,函数调用机制和异常机制。但是,多域转换机 制的使用增加了对恶意攻击的脆弱性,例如,允许次安全域中的软件试图 通过返回机制返回到安全域,该返回机制具有与被用于从安全域转换到次 安全域中的原机制不同的类型。两个特定攻击情境被示于图3A和图3B 中。如图3A所示,在点145处,假设一些安全代码正在执行,并且在点 150处,对存在于次安全域中的函数进行函数调用。然后该函数在点155 处被执行,但是在点160处,次安全软件试图通过使用异常返回机制来任 意分支到安全代码中。

类似地,在图3B中,在点175处,假设一些安全代码正在执行,并 且在点180处,发生异常(例如,中断),导致分支到次安全域中的异常 处理程序。该异常处理程序在点185处被执行,但随后在点190处,次安 全域中的软件试图做出向安全域的函数返回。

如果系统的安全性要被维护,则以上两个攻击情境均需要被防止,因 为如果这样的情境被允许发生,则这将允许次安全软件试图做出进入到安 全代码中的任意分支,这可提供用于获得对安全数据的访问的机制。

为了免受这样的攻击,当函数调用或异常发生,导致从安全域到次安 全域的转换时,栈访问电路70被安排为将预定处理状态存储到安全栈的 栈帧上,如将参考图4A和4B进行更详细地探讨那样。在图4A中,假设 安全程序FOO当前正在安全域中执行,然后在FOO完成之前发生函数调 用或异常。在函数调用或异常发生之前,通常FOO会使用安全栈200上 分配的栈帧205,以便存储FOO所使用的临时数据。当函数调用或异常发 生时,则分离栈帧210将被分配给栈访问电路70,然后栈访问电路将在分 支到由函数调用所标识的所需软件程序,或分支到处理异常所需的异常处 理程序之前在栈帧210中存储预定处理状态。

首先考虑异常发生的情况,然后如果异常处理程序要在安全域内执 行,则由栈访问电路存储在栈帧210中的预定处理状态包括图4B中标识 的寄存器内容215。这些寄存器在这里被称为“调用者”寄存器,并且这 些寄存器是栈访问电路70(或异常控制电路28)将一直负责把其状态保 存到栈上,而不管异常处理程序将要在哪个域执行的寄存器。默认情况 下,然后异常处理程序将负责寄存器的剩余部分(这里称为“被调用者” 寄存器)的状态。特别地,然后异常处理程序将在异常处理程序的主体中 重新使用被调用者寄存器之前,将被调用者寄存器的状态保存到与异常处 理程序正在其中执行的域相关联的栈上。此外,一旦异常处理程序完成, 则异常处理程序将在发布异常返回之前,负责恢复这些被调用者寄存器的 状态(通常通过将其从栈中复制回相关的寄存器中)。

但是,根据所述实施例,在异常将需要从安全域转换到次安全域,并 且先前的后台处理在安全域中的情况下,栈访问电路70额外负责在使处 理电路转换到执行异常处理程序之前,将被调用者寄存器的状态保存在栈 帧210中。因此,如图4B所示,在该情况下,存储在栈帧210中的预定 处理状态采用形式220。应该认识到,图4B中特定标识的调用者和被调用 者寄存器只是调用者和被调用者寄存器可被如何分区的示例,而到底哪些 寄存器被认为是调用者寄存器或被调用者寄存器将基于实现方式而不同。

同样如图4B所示,在异常处理程序在次安全域,从而需要从安全到 次安全域的转换的情况下,栈访问电路也被安排为在栈帧210中的预定相 对位置处存储预定签名222,在该实施例中,示出该预定相对位置是栈帧 中的底部位置。该预定签名可采用各种形式,但在一个实施例中被选择为 具有不对应于程序代码的有效地址的值。在一个实施例中,预定签名被选 择为具有存储器地址空间的预留部分中的地址值120中的一个。在一个特 定实施例中,预定签名具有值0xF0A5125A。

通常,当函数调用发生时,正常情况下栈访问电路70将不在栈帧210 中保存任何预定处理状态。因此,如果函数调用标识仍在安全域中的目标 代码,则没有预定处理状态被存储。但是,如果函数调用标识在次安全域 中的目标代码,则栈访问电路70被安排为在栈帧210中存储返回地址 225,一旦函数调用已完成,该返回地址225将被需要以便继续执行 FOO。在需要转换到次安全域的异常发生的情况下,该返回地址225被存 储在与预定签名222被存储的预定相对位置相同的预定相对位置,即,栈 帧内的底部位置。

取代安全栈内存储的实际返回地址225,次安全域内的目标代码被提 供有实际上不是程序代码的有效地址的虚拟函数调用返回地址。在一个实 施例中,该虚拟函数调用返回地址从预留地址120中的一个中选择,并且 进一步被选择为具有与上述预定签名222不同的值。

当函数调用发生时,软件仍然可执行寄存器状态的状态保存,即使根 据图4B所示的栈帧,状态保存不是硬件所需要的。将寄存器分为调用者 和被调用者寄存器对这样的函数调用是有用的,因为其既允许在函数调用 前被执行的软件(调用者软件),又允许在函数调用后被执行的软件(被 调用者软件)影响哪些寄存器经受状态保存。例如,如果调用者软件知道 其没用过某些调用者寄存器,或已经结束使用一些调用者寄存器中的数 据,则这些寄存器中的值在函数调用后将不必被维护,因此这些寄存器不 必经受状态保存。类似地,如果被调用者软件将不会使用某些被调用者寄 存器,则针对这些寄存器被调用者软件不必执行状态保存。因此,允许调 用者和被调用者软件影响用于状态保存的寄存器的选择通过降低适当时候 的状态保存的数量使得性能提升。相比之下,如果只有调用者软件或只有 被调用者软件负责状态保存,则一些寄存器可能被不必要地保存,以防其 他软件需要该寄存器被保存。

图5是根据一个实施例,示出了当函数调用发生时由处理电路执行的 步骤的流程图。在步骤300,确定当前执行的代码是否正在安全域中执 行。如果不是,则过程直接进行到步骤310,其中连接寄存器(LR)被设 置为等于返回地址。此后,过程进行到步骤325,其中执行分支到新函数 (即,被标识为函数调用的目标的程序代码)。由于返回地址已在连接寄 存器内被设置,当新函数完成时,正确的返回地址可被指定在函数调用返 回中。

如果在步骤300确定当前执行的代码正在安全域中执行,则在步骤 305,确定作为函数调用的目的地的新函数是否要在次安全域中执行。确 定这一点存在很多方法,但在一个实施例中,这仅仅通过确定函数调用的 目标地址是与安全存储器区域还是次安全存储器区域相关联的地址来获 得。如果其与次安全存储器区域相关联,则表明函数调用地址的目的地在 次安全域中。如果函数调用的目的地不在次安全域中,则过程再次进行到 步骤310。

但是,如果函数调用的目的地在次安全域中,则表明需要从安全域转 换到次安全域,并在此处过程进行到步骤315,其中连接寄存器被设置为 如上所述的虚拟函数调用返回地址。此外,在步骤320,实际返回地址被 栈访问电路70推到安全栈上。其后,过程进行到步骤325,其中执行分支 到作为函数调用的目标的新函数。

不仅是图5所示的硬件操作,而且在函数调用之前执行的软件也可执 行来自寄存器的数据的状态保存,并且在函数调用之后执行的软件也可执 行来自被调用者寄存器的数据的状态保存。

图6是示出了当异常(异常的一个示例是中断)发生时处理电路的操 作的流程图。在步骤400,连接寄存器被设置为选定的虚拟异常返回地 址,在一个实施例中,存在多个不同的虚拟异常返回地址可被选择。在一 个实施例中,每个可能的虚拟异常返回地址将会是不是程序代码的有效地 址的地址。步骤400的更多细节稍后将进行说明。其后,在步骤405,调 用者保存寄存器被推到后台处理域(即,后台代码正在其中执行的域)的 栈上。

其后,在步骤408,确定后台处理是否在安全域中,并且如果不是, 则过程直接进行到步骤432。如将在下面说明的那样,后台处理是否在安 全域中可基于位于连接寄存器65中的异常返回值来确定。如果后台处理 在安全域中,则在步骤410,确定当前执行的代码是否正在安全域中执 行,并且如果不是,则过程再次直接进行到步骤432。但是如果在步骤 410确定当前执行的代码(可以是后台处理或者可以是先前的末尾连锁异 常)正在安全域中执行,则在步骤412确定目的地是否在次安全域中, 即,处理异常所需的异常处理代码是否将在次安全域中被执行。如果不 是,则过程再次直接进行到步骤432。但是,如果目的地在次安全域中, 则表明在后台处理在安全域的情况下,将发生从安全域到次安全域的转 换。因此,过程进行到步骤420,其中被调用者保存寄存器被推到后台域 的栈上,并且上述预定签名被写到栈帧的底部。与后台处理相关联的栈可 根据位于连接寄存器65中的异常返回值来确定。稍后将提供这一步骤的 更多细节。

在步骤430,异常控制电路28保证所有寄存器被清除。在一个示例 中,所有寄存器可在步骤430被清除。在替换实施例中,寄存器也可以在 其被推到栈上时被清除,因此调用者寄存器可在步骤405期间被清除,而 被调用者寄存器可在步骤420或430期间被清除。

接着步骤430,或者如果在步骤408、410和412检查的条件中的任一 项不发生,则过程随后进行到步骤432。如果异常入口是到末尾连锁异 常,则连接寄存器65用新的异常返回值进行更新。这一步骤将在下面针 对图12B进行更详细地探讨。

在步骤435,处理分支到异常处理程序。

然后,异常处理程序可执行被调用者寄存器的状态保存。在一个实施 例中,异常处理程序可一直执行被调用者寄存器的状态保存,即使在被调 用者寄存器中的数据在步骤420已经被推入栈并被清除的情况下(在这种 情况下,硬件会将来自被调用者寄存器的数据存储到安全栈,而软件会将 来自被调用者寄存器的被清除的值存储到次安全栈)。或者,异常处理程 序能够检测被调用者寄存器的状态保存是否已被执行,并且如果是,则可 省去被调用者寄存器的状态保存。

图7是示出了分支操作如何进行处理的流程图。该分支操作可包括正 常分支处理操作、函数调用返回和异常返回。虽然图7示出了分支操作, 但在替换实施例中,类似的机制可与可导致指令流中的改变的任意指令 (例如,具有作为目的地寄存器的程序计数器的加载指令)结合使用。

在步骤500,确定分支操作所指定的目标地址是否在预留地址范围 120内,在该特定示例中是目标地址是否大于或等于0xF0000000的情况。 如果不是,则表明是正常分支活动,并且过程进行到步骤505,其中正常 分支处理被执行。因为分支操作的处理将被本领域的技术人员很好地理 解,因此这里不提供正常分支处理的进一步的细节。

如果在步骤500确定目标地址在预留地址范围120内,则在步骤 510,确定目标地址是否与虚拟函数调用返回地址一致。在一个特定实施 例中,虚拟函数调用返回地址是0xF7FFFFFF。如果目标地址确实对应于 虚拟函数调用返回地址,则在步骤515,安全栈内的栈帧210的上述预定 相对位置被访问,以便从安全栈中读取返回地址。其后,过程返回到步骤 500,其中,假设函数调用返回已被正确用于从先前的函数调用返回,在 步骤515读取的返回地址将是程序代码的真实地址,并且相应地在步骤 505,过程将分支到正常分支处理。但是,相反如果函数调用返回已被错 误地用作从异常返回的机制,则当栈帧220在步骤515被访问时,预定签 名222将作为实际返回地址被取回。当该地址随后在步骤500被分析时, 将确定其在预留范围内,但在步骤510,将确定该地址不是虚拟函数调用 返回地址。然后过程将进行到步骤520,其中还将确定该地址不是有效异 常返回地址中的一个,并且相应地,过程将分支到步骤525,其中故障将 被创建以标识函数调用返回已被错误使用。

现在考虑异常返回被指定的情况,则如果该异常返回与导致从安全域 到次安全域的转换的先前异常相关联,则这会将若干不同有效异常返回地 址中的一个标识为目标地址,这些可能的异常返回地址中的每一个都在预 留范围120内,并且与预定签名和虚拟函数调用返回地址都不同。相应 地,过程将从步骤500进行到步骤510,并从步骤510到步骤520,其中 跟随“是”的路径将随后到达步骤530。异常返回处理步骤530的细节稍 后将进行说明。在具有低于或等于当前异常的优先级而高于后台处理的优 先级的新的异常在该当前异常返回的时刻正等待执行的情况下,则该新的 较低优先级的异常将被作为末尾连锁异常(即,该新的异常将紧接在当前 异常完成后而在返回到先于正被获取的当前异常发生的后台处理之前被立 即处理),并且如图7所示,过程将分支回图6中的步骤408。

一旦步骤530的异常返回处理已被执行,并且没有进一步的末尾连锁 异常等待处理,则过程进行到步骤535,其中确定异常返回处理步骤530 是否已经指示预定签名被预期在存储于栈帧210内的处理状态中。如先前 所探讨的那样,这将是如果异常导致从安全域到次安全域的转换,则后台 代码在安全域中被执行的情况。如果没有预定签名是预期的,则过程仅进 行到步骤540,其中相关寄存器值从栈帧中出栈。这一过程稍后将针对图 13进行更详细地说明。

但是,如果在步骤535,确定预定签名是预期的,则过程进行到步骤 545,其中栈帧210的底部被读取,并且取回的值与预定签名对比。在步 骤550,确定是否存在匹配,并且如果是,则过程进行到步骤540。但 是,如果不存在匹配,则过程进行到步骤555,其中故障被创建,表明异 常返回已被错误地用于试图从函数调用返回。特别地,如果异常返回正被 错误地用于试图从函数调用返回,则在步骤545读取安全栈将导致返回地 址225被取回,该返回地址225将不匹配预定签名,并将相应地导致故障 在步骤555被创建。

存在很多方法来处理在步骤525或步骤555被创建的故障。在一个实 施例中,处理电路响应于任一故障情况而在安全域内执行适当的故障处理 程序代码。通过保证故障处理程序代码在安全域内被执行,这防止了次安 全域中的攻击者重新获得控制,并相应地防止了重试攻击。

作为用于阻碍任意攻击重试的替换机制,如果任一故障情况被识别, 则数据处理装置可被安排使得栈指针值不被调整,使得返回的重演也将导 致同样的故障情况被识别。因此,通过不调整栈指针,攻击者不能仅消费 安全栈的最后位置,然后重试攻击以便在安全栈内的不同位置处进入。在 一个实施例中,以上两种机制可被用于提供对抗来自次安全域的攻击的重 试的鲁棒性。

在一个实施例中,可引起来自次安全域的潜在攻击的另一情境随着安 全栈的初始化而出现。在该时刻,安全栈将是空的。如果在该时刻,正在 被执行的程序代码在次安全域中,则程序代码可能试图返回到安全域中。 该返回应被阻止,因为不存在从安全域到次安全域的原转换来合理地从其 返回。图8A和8B示出了可被用于阻止这样的返回成功的机制。如图8A 所示,当安全栈600被初始化时,预定签名值602被存储在安全栈上(在 一个实施例中,当栈被初始化时,该值由软件来存储)。该预定签名值通 常将不同于先前参考图4B所述的预定签名222,但是仍将是不对应于程序 代码的有效地址的值。在一个特定实施例中,预定签名602具有值 0xF05AEDA5。

如图8B所示,如果在点605处,软件正在次安全域中执行,然后在 点610处试图返回到安全域中,则故障检查电路将在点615处从安全栈中 读取预定签名值602,并将确定其不对应于程序代码的有效地址,并将相 应地创建故障。因此,从次安全域中返回将被阻止。

特别地,如果在点610处的返回是函数调用返回,则在点615生成的 故障与在图7中的步骤525创建的故障相同,并且相同的故障处理代码可 被用于响应该故障。因此,在该实施例中,故障检查电路不需要在预定签 名602与上述预定签名222之间进行区分。相反,如果在点620处的返回 是异常返回,则预定签名值602与预定签名值222不同的事实将意味着图 7的步骤550将检测不到匹配,并且相应地在步骤555,故障将被引发。

如针对图7的步骤530所述的那样,当从一个异常返回时,第二异常 可能正等待处理,并且可能在返回到在第一异常之前被执行的后台处理之 前被处理。这被称为末尾连锁。图9示出了接着第一异常,第二和第三异 常在转回后台处理之前被末尾连锁的示例。

如图4B的栈帧220所示,如果后台处理在安全域中,并且存在从安 全处理到次安全状态中的异常的转换,则调用者保存寄存器和被调用者保 存寄存器均被异常控制电路28推入安全栈。但是,通常在安全域中被处 理的异常将预期只有调用者保存寄存器会被保存到栈(如图4B的栈帧215 所示),而被调用者保存寄存器的保存留给异常处理程序。因此,如图9 所示,当进入第一异常而在点700处执行被调用者寄存器的附加状态保存 时,然后当在点705处转到安全域中的第二异常时,被调用者保存寄存器 可从栈中弹出以恢复栈帧215,其被预期末尾连锁第二异常在安全域中进 行处理。

但是,如果要在次安全域中被处理的末尾连锁第三异常发生,则在点 710处,被调用者寄存器需要再次被推入栈,因为从安全域到次安全域的 转换意味着被调用者寄存器中的数据需要对次安全处理隐藏。最后,当第 三异常完成,并且没有进一步的末尾连锁异常时,则在图9的点715处, 调用者和被调用者保存寄存器均从栈中被弹出。

图9示出了当在末尾连锁异常之间进行切换时所执行的若干状态保存 操作和状态恢复操作。这些操作花费时间,因此延迟了到来异常的处理, 从而降低了处理性能。因此,避免这些操作中的一些是有用的。本技术认 识到当从次安全异常切换到末尾连锁的安全异常时,被调用者寄存器不必 要从安全栈中弹出。将被调用者寄存器留在栈上是可接受的,因为这不影 响异常的处理,并且所有被调用者保存值被允许从异常将在其中被处理的 安全域中访问。因此,被调用者寄存器可响应于导致从安全域转换到次安 全域的第一异常而被保存到栈。当处理从次安全异常切换到安全末尾连锁 异常时,被调用者寄存器的恢复可被省去。对于导致从安全域转换到次安 全域的进一步异常,通过硬件的被调用者保存寄存器的附加状态保存可被 省去。

图10示出了在进入异常时可被存储在连接寄存器中的异常返回值的 示例。在一个实施例中,连接寄存器65不需要将异常返回值保留异常处 理程序被执行的整个时间,相反其可在开始时被设置为该值,然后立即移 动到栈中。当异常完成时,软件分支到异常返回值所标识的地址,CPU发 现该地址是特定事件,因为其不是有效指令地址。在一个实施例中,上述 虚拟函数调用返回地址在函数调用发生时也被存储在连接寄存器中,并以 类似的方式进行处理。

异常返回值包括用于确定在进入导致从安全域转换到次安全域的异常 时是否需要由硬件保存被调用者保存寄存器。异常返回值具有若干不同的 可能值,每个可能值对应于地址空间的预留区域120,并且与虚拟函数返 回地址以及上述预定签名222和602不同。异常返回地址包括状态保存状 态值字段720和安全性字段725。

状态保存状态值字段720存储状态保存状态值SCRS,其指示对于接 下来导致从安全域转换到次安全域的异常,是否需要被调用者保存寄存器 的附加状态保存。在图10的示例中,值0指示附加状态保存可被跳过, 而值1指示需要附加状态保存,但是也可使用其他状态值的映射。

安全性字段725存储安全性域值S,其指示在末尾连锁异常的当前链 中的初始异常之前正被执行的后台处理是在次安全域还是安全域中。当进 入末尾连锁异常的链中的每个异常时,异常返回值将在图6的步骤432中 被设置为新的值。当设置异常返回值时,状态保存状态值字段720的值可 被改变以影响后面要被执行的状态保存处理。以这种方式,信息可从一个 异常传递到另一个异常以指示对于异常之间的下一转换是否需要附加状态 保存。这将参考图11-16进行解释。

图11更详细地示出了用于将被调用者保存寄存器推入安全栈36并将 预定签名写入安全栈36的图6的步骤420。该附加状态保存基于异常返回 值的状态保存状态值字段720的值。在步骤750,处理器确定异常返回值 的状态保存状态值字段720是否具有值0。如果是,则跳过将被调用者保 存寄存器推入栈,并且该方法继续图6的步骤430。在这种情况下,被调 用者保存寄存器的状态保存不是必要的,因为来自这些寄存器的数据将已 经响应于先前的异常而被保存到栈。

另一方面,如果在步骤750,状态保存状态值不具有值0,则该方法 进行到步骤755,并且来自被调用者保存寄存器的数据被推入安全栈。被 调用者保存寄存器也被清除,使得其值对于次安全域中的后续处理是不可 访问的。此外,在步骤760,预定签名222被写到栈的底部。然后该方法 也进行到图6的步骤430。因此,根据图11,附加状态保存是否被执行取 决于状态保存状态字段的值。

图12A示出了针对当执行后台处理时接收到的最初异常(如果存在末 尾连锁异常的链,则其是第一个异常),在图6的步骤400设置异常返回 寄存器的示例。在步骤770,确定处理器正在操作后台处理的当前域。如 果当前域是安全域,则在步骤775,安全性域字段725被设置为具有值1 以指示安全域。如果当前域是次安全域,则在步骤780,安全性域字段 725被设置为值0。不管哪个域是当前域,在步骤790,状态保存状态值字 段720被初始化为值1,其指示在下一个从次安全域到安全域的转换处可 能需要附加状态保存。然后,在步骤795,异常返回值被写入连接寄存器 65,其中状态保存状态值字段720和安全性字段725被设置为在先前步骤 中确定的值。然后该方法进行回到图6的步骤405以继续异常进入处理。

图12B更详细地示出了用于设置末尾连锁异常的异常返回值的步骤 432的示例。在步骤800,该方法确定正被进入的异常是否是末尾连锁异 常。如果不是,则该方法进行到图6的步骤435以分支到异常处理程序, 而不执行图12B的剩余步骤。但是,如果该异常是末尾连锁异常,则在步 骤802,确定安全域值S(来自图10中被用于终止链中的先前异常的 EXC_RETURN值)是否是1。如果不是,则S=0,并且过程进行到步骤 804以将状态保存状态值设为1。如果后台处理是次安全的(如由S=0所 指示的),则没有附加状态保存将被执行(图6的步骤408将导致附加状 态保存步骤被省去)。虽然在这种情况下,状态保存状态值字段720将不 会影响状态保存,但为了防止次安全域中的处理从状态保存状态值字段 720获得信息,最安全的是在步骤804将该字段设置为默认值1。

另一方面,如果在步骤802,安全性域值S等于1,则过程进行到步 骤805,其中确定新的末尾连锁异常是否要在安全域中被处理。如果不 是,则再次在步骤804将状态保存状态值字段720设为1。

如果新的异常要在安全域中被处理,则在步骤806,确定当前处理是 否在安全域中。如果不是,则在步骤808,状态保存状态值字段720被设 为0,而如果当前处理是安全的,则在步骤810,状态保存状态值字段720 被设置为与先前异常相同的值。在步骤812,新的异常返回值被写到连接 寄存器65,其中状态保存状态值字段720根据步骤804、808或810来设 置。然后该方法进行到图6的步骤435以分支到异常处理程序。

图13更详细地示出了用于使寄存器出栈的图7的步骤540。基于异常 处理的过去历史,该栈可包括只有调用者寄存器需要被恢复的栈帧215或 调用者和被调用者保存寄存器都需要被恢复的栈帧220。图13示出了处理 器可以如何确定哪个栈帧将出现在栈上。在步骤820,确定当前的异常返 回是否正从次安全异常切换到安全后台处理。例如,安全域字段725可被 用于确定后台处理是安全还是次安全的。如果处理不是正从次安全异常切 换到安全后台处理,则在步骤822,该过程确定当前异常返回是否正从次 安全异常切换到安全后台处理,并且状态保存状态值字段720的值是否为 0。如果步骤820和822中确定的条件均不满足,则在步骤824,只有调用 者寄存器将其值从栈中恢复。但是,如果在步骤820和822中测试的条件 中有一个满足,则在步骤824将数据恢复到调用者寄存器之前,在步骤 826,被调用者保存值被恢复到被调用者寄存器。因此,该系统可确定哪 些寄存器需要将其寄存器状态恢复。

图14更详细地示出了图7的异常返回处理步骤530。在步骤830,确 定是否存在应为末尾连锁的待处理异常。如果该异常的优先级低于或等于 刚结束的异常的优先级,而高于后台处理的优先级,则该异常应为末尾连 锁的。如果存在末尾连锁异常要被处理,则该方法返回到图6的步骤408 以处理进入末尾连锁异常。

如果不存在末尾连锁异常,则该方法进行到步骤840和850,其中确 定:(a)异常返回正从次安全异常切换到安全后台处理;还是(b)异常 返回正从安全异常切换到安全后台处理;并且状态保存状态值字段是否具 有值0。如果这些条件中有一个满足,则在步骤860,确定预定签名222 是预期的。如果这些条件都不满足,则在步骤870确定预定签名不是预期 的。然后该方法进行到图7的步骤535,其中基于预定签名222是否是预 期的来执行处理以检测异常返回是否已被不适当地使用。注意,步骤840 和850检查与图13的步骤820和822相同的两个条件,因为如图4B的栈 帧220所示,当被调用保存寄存器值出现在栈上时,则预定签名也将是预 期的。

图15和16示出了图9所示的不必要的栈保存和恢复操作示例可如何 使用状态保存状态值来避免。在图15中,当在点900处发生次安全异常 时,后台处理在安全域中。如图12A所示,安全性域值S被设置为1以指 示后台处理在安全域中,并且状态保存状态值SCRS也被设为1。当第一 异常在点910完成时,存在优先级等于或低于第一异常而高于后台处理的 待处理的第二异常。该异常是末尾连锁的,使得其在回到后台处理之前被 处理。在该点处,被调用者保存寄存器的出栈被跳过。当切换到第二异常 时,状态保存状态值SCRS被设为0,如图12B的步骤808所示,因为后 台处理在安全域中(S=1),因此目的地是安全的而当前过程是次安全 的。一旦第二异常在点920处完成处理,则末尾连锁的第三异常等待处 理,并且要在次安全域中进行处理。由于状态保存状态值SCRS等于0, 则根据图11的步骤750,附加状态保存可被省去,因为被调用者保存寄存 器状态已被保存到栈。因此,第三异常可被更快处理,因为不存在与附加 栈操作相关联的延迟。最后,在点930,处理返回到后台,并且根据图13 的方法确定步骤820的条件是满足的,因此被调用保存寄存器状态和调用 保存寄存器状态均从栈中弹出并恢复到相应的寄存器。

图16示出了附加栈保存操作可被避免的另一示例。在这种情况下, 当执行安全后台处理时,在点1000处发生要在安全域中进行处理的最初 异常。因为目的地不是次安全域,因此根据图6的步骤412,被调用者保 存寄存器的保存将被省去。在点1000,只有调用者保存寄存器状态被硬件 推入栈。状态保存状态值被设为1,如图12A所示。在点1005,次安全第 二异常是接着第一异常的末尾连锁异常。因为状态保存状态值SCRS等于 1,则在点1005,附加状态保存根据图11的步骤750和755来执行,因此 被调用者保存寄存器状态被推入栈。因为S=1并且目的地是次安全的,则 在图12B的步骤804,对于接下来的异常,状态保存状态值被设为1。在 点1010发生从次安全第二异常到安全第三异常的末尾连锁转换,并且被 调用者保存寄存器的出栈被跳过。在该点处,状态保存状态值SCRS根据 图12B的步骤808而被设为0,因为S=1,所以目的地是安全的而当前过 程是次安全的。这意味着在点1015接着的末尾连锁异常处,被调用者保 存寄存器的入栈可被跳过,因为状态保存状态值的值为0。如图16所示, 即使最初异常不是导致从安全域切换到次安全域的转换,在接下来从安全 域到次安全域的切换时执行的附加状态保存也可被执行一次,并在后面的 转换时将不再重复。

从图15和16可以看出,用于如图14所示设置异常返回值的机制意味 着当异常正在次安全域中处理时,状态保存状态值SCRS将一直具有值 1,同时,当处理安全异常时,状态保存状态值具有可变值0或1来指示 在下一个安全到次安全的转换处是否需要附加状态保存。这是有用的,因 为在次安全域中时将该值设置为固定值1防止了次安全域中的代码能够从 状态保存状态值中获得任意信息,状态保存状态值可允许信息被推测异常 处理的过去历史。这提高了安全性。

此外,如果次安全代码可篡改状态保存状态值,则这可影响在安全域 中时的后续状态保存操作,这可导致安全性破坏。为了避免这一情况,处 理电路在从次安全异常切换到安全异常时(例如,在图16的点1010处) 可检测状态保存状态值仍具有在进入次安全域中的异常时被设置的固定 值,并且如果该值已被改变,则触发错误。或者,没有错误可被触发,但 是当返回安全域时,状态保存状态值可被重置为其在安全域中应具有的 值,覆盖由次安全代码对状态保存状态值字段的任意修改。

图17示出了异常的抢占的示例。每个异常可与优先级值相关联。如 果当具有较低优先级的异常正被执行时发生具有较高优先级的异常,则高 优先级异常可抢占较低优先级异常,并且在较低优先级异常未完成的情况 下进行处理。虽然图17示出了优先级值的较大数值指示较高优先级的示 例,但是也可用较低优先级值表示较高优先级,例如,用优先级值0指示 高于优先级值1的优先级异常。

如图17所示,当抢占发生时,被抢占的异常可被视为接下来的异常 的后台处理。例如,在图17的点1100,后台处理被打断以处理具有优先 级值1的第一异常。在点1105,发生了具有优先级值4的第二异常。由于 其是比当前优先级等级更高的优先级,因此第二异常抢占第一异常,并且 现在第一异常是后台处理。当在点1110从第二异常返回时,将执行状态 恢复以恢复在第二异常发生的时刻由后台处理(即,第一异常)所使用的 状态。当在点1115第一异常完成时,执行进一步的状态恢复以恢复由原 后台用于处理的值。因此,在先前的实施例中,“后台处理”自身可以是 根据被更高优先级异常抢占的异常的异常处理程序来执行的处理。

图18A和18B示出了状态保存状态值在抢占期间有用处的示例。如果 后台处理是安全的,并且发生次安全异常,则如上所述,被调用和调用保 存寄存器均将被推入栈,以防止由次安全异常处理器对被调用寄存器状态 的访问。但是,当该状态保存操作正被执行时,也可发生具有更高优先级 的另一异常。在这种情况下,较高优先级异常将抢占原来的次安全异常, 因此次安全异常将不被处理。如果抢占异常要在安全域中处理,则将不必 将被调用者保存寄存器推入栈。

图18A示出了当调用者保存寄存器正被推入栈时发生抢占异常的示 例。在这种情况下,因为抢占异常是安全的,所以不必执行被调用者寄存 器的附加状态保存,因此一旦调用者寄存器的入栈完成,则安全异常的处 理就可开始。这避免了由将被调用者寄存器状态推入栈所导致的延迟。如 果随后发生末尾连锁的次安全异常,则图如18A所示,被调用者寄存器状 态可在此刻被推入栈。

另一方面,图18B示出了当被调用者寄存器正被推入栈准备处理原来 的次安全异常时,在安全域中发生抢占异常的示例。在这种情况下,当被 调用者寄存器的状态保存完成时,继续推入被调用者寄存器并切换到安全 异常可能更有效。这是因为停止被调用者寄存器的状态保存以及倒转已经 完成的被调用者寄存器的入栈操作可比仅完成状态保存花费更长的时间。 因此,如果状态保存被完成,则将存在较少延迟。如果被调用者寄存器的 保存完成,则状态保存状态值SCRS可被设为0以指示附加状态保存已经 发生,使得当发生进一步的次安全末尾连锁异常时,其可被跳过。因此状 态保存状态值还使在处理抢占时的性能提升。

本申请的主题与一般指定共同待决的申请号为13/368419的美国申请 和申请号为1217531.1的英国专利申请中所探讨的主题相关,这两个文档 的全部内容被通过引用结合于此。

虽然这里描述了特定实施例,但是应该认识到,本发明不限于此,并 且在本发明的范围内可对其作出很多修改和添加。例如,在不脱离本发明 的范围的情况下,可作出以下独立权利要求的特征与从属权利要求的特征 的各种结合。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号