在ARMv8-A中,EL1/2/3除了可以自身的堆栈寄存器SP_ELn以外,还可以使用SP_EL0。
与此同时EL0也可以使用SP_EL0。
我想在EL0的应用程序应该可以通过SP_EL0,访问到EL1/2/3的数据,这岂不是不安全?
希望帮忙解答,谢谢!
不可以的,EL0里面逻辑上可以访问,但是实际上你如果访问EL1或者其它数据,应该会作为异常陷入到EL1里面去,同样道理:EL1访问EL3也是,作为异常陷入到EL3里面去,我印象中ARM-V8里面有提到过这样的原则。
是吗? 我在想是不是这样的:
在EL1中,kernel OS会使用SP_EL1和SP_EL0。 但SP_EL0指向的是内核栈而不是thread stack。 因此,在通过ERET指令从EL1回到EL0后,SP_EL0会重新指向thread stack。
这样,位于EL0的application就不能通过SP_EL0来访问内核栈了。
不知道想的对不对,还望高手指教~ 谢谢
Hi Chendader,
例如产生异常taken 到EL3,默认是使用的SP_EL3,software在EL3可以选择使用EL0 的stack pointer,但是不是EL0的stack,这样做可以ATF可以使用一个小的stack来管理exception,处理异常时可以使用Runtime的stack。你可以看下面是ATF的code,在这种场景下EL0是访问不到EL3的内容的。
进入EL3时
=========================
/* Save the EL3 system registers needed to return from this exception */ mrs x0, spsr_el3 mrs x1, elr_el3 stp x0, x1, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]
/* Switch to the runtime stack i.e. SP_EL0 */ ldr x2, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] mov x20, sp msr spsel, #0 mov sp, x2
=====================
退出EL3时
===================
func el3_exit /* ----------------------------------------------------- * Save the current SP_EL0 i.e. the EL3 runtime stack * which will be used for handling the next SMC. Then * switch to SP_EL3 * ----------------------------------------------------- */ mov x17, sp msr spsel, #1 str x17, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]
======================