赞
踩
下面笔者将详细介绍SMC指令以及SCR_EL3寄存器:
SMC指令将会产生一个进入EL3的异常,而EL3绝对不会在Non-secure的状态下实现。所以自然而然地可以使系统进入Secure 模式。并且会无视 SCR_EL3.NS 位,即不管NS为多少,都可以进入Secure状态。我们可以使用如下方式快速更改处理器的安全状态:
SMC #0 ; set secure mode
SMC #1 ; set non-secure mode
具体实现:SMC #0或者#1 的实际作用是由自己的软件定义的,SMC #0的意思实际上是:执行SMC指令进入EL3,#0的意思是带了个0的参数,在笔者的SMC handler里,如果收到0参数我就去写SCR_EL3.NS为0,参数为1就去写SCR_EL3.NS为1。实际上要想实现Secure状态切换,只有写SCR_EL3.NS这一种方式.
Non-secure 下,以及非EL3下访问不了SCR_EL3寄存器,所以只能在EL3的secure状态下将NS位写1,进入Non-secure状态。而不能在Non-secure状态下访问SCR,将NS位写0,进入Secure状态。
SMC指令将会产生一个进入EL3的异常,但是只可以在EL1以及其更高的异常等级时执行,当在EL0时执行SMC指令时,其行为是UNDEFINED。如果 HCR_EL2.TSC 和SCR_EL3.SMD都为0,在EL1以及其更高的异常等级时执行,将会产生一个Secure Monitor Call 异常,
捕获SMC 指令,如果在当前的security state下,EL2被使能,可以将EL1执行的SMC 指令捕获至EL2。
SCR_EL3寄存器的SMD位可以disable 在EL1以及更高的异常等级上SMC指令的执行, from both Security states and both Execution states, reported using an ESR_ELx.EC value of 0x00.
AArch32的mode有:
AArch32的monitor mode是Secure的EL3 模式,这意味着它总是处于Secure state下,并且会无视 SCR_EL3.NS bit。 使用SMC指令可以进入Secure Monitor Call 异常,从而进入Monitor 模式,在Non-secure的EL1或者Secure EL3模式下,执行SMC指令将会产生Secure Monitor Call 异常。
当EL3使用AArch32时,在Monitor 模式下执行的软件:
SCR 是一个32-bit 寄存器,访问SCR寄存器,需要满足两个条件:当前使用AArch32 状态,并且EL3被实现,该寄存器定义了当前安全状态的配置,特别是:
Non-secure bit. 处理器必须处于Monitor mode下,可以决定当前的安全状态:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。