Hi,各位专家:
在ARMv7-A架构中,共有四张异常向量表,即Secure状态下的exception table, Non-Secure状态下的exception table,Monitor Mode下的exception table,以及hypervisor模式下的异常向量表,因为在不同Security状态下,VBAR寄存器是banked,所以它可将不同security状态的异常向量表分开,即Secure状态和Non-secure状态对应不同的exception table.
但在ARMv8中,当EL3运行在AArch64状态下时,是不支持这种备份方式的,这意味着当处理器在EL3使用AArch64执行态时,在Secure EL1(运行kernel)下和Non-Secure EL1下(运行secure os)访问的VBAR(或VBAR_EL1)是同一个寄存器,也就是说Secure状态和Non-secure状态对应着同一个exception table,这样在ARMv8下就只有3张异常向量表。
不知我这样理解是否正确?如果正确,那么这岂不是cpu在Secure状态下执行了Non-secure的代码?
> 谢谢!ARMv8这样设计感觉实时性会有所影响,如果频繁的切换Security状态会增加额外保存系统寄存器上下文的时间。
是的,在AArch64下,很多寄存器不再有Secure和non-secure的bank,在进行world切换时需要软件进行现场的保护。这可能会带来一些额外的latency。
> 还有一个问题需要询问一下,谢谢!
> 以Cortex-A53为例,运行linux,当处理器处于Secure EL1,运行Secure OS时产生了一个IRQ,这时有什么比较好的处理方法?返回先返回到Non-Secure EL1处理中断然后再执行SMC再进入
> Secure OS继续执行还是有其它好的方法joeyxu
你说的IRQ应该是一个non-secure 的interrupt。基本的处理流程就是你说的那样。软件也可以选择当CPU在secure world的时候,始终把non-secure的中断mask掉,当CPU切换回non-secure world时再处理中断。
这里顺便说下,你说的IRQ一定是non-secure interrupt的情况只适用于GIC-V2的中断控制器,比如使用GIC-400。在GIC-V2, IRQ只能是non-secure, FIQ可以是secure的也可以是non-secure的。在GIC-V3(比如GIC-500, 目前ARM的V8-A CPU都同时支持GIC-V3和GIC-V2), IRQ和FIQ可以是secure的,也可以是non-secure的。
如果使用GIC-V2, CPU在non-secure EL1/EL0 收到一个non-secure interrupt, 中断处理器可以发IRQ给CPU。CPU会切换到non-secure EL1去处理中断。如果CPU在secure EL1/EL0 收到一个non-secure interrupt, 中断处理器还是只可以发IRQ给CPU。这个时候CPU会切换到EL3去作world切换,然后处理中断。所以可以看到对于IRQ,根据CPU的security状态,他们的target EL是不同的,也就是说在每次发生world切换时,软件要重新配置target EL。
GIC-V3在这一点上作了一点改进。当CPU在non-secure EL1/EL0 收到一个non-secure interrupt, 中断处理器可以发IRQ给CPU。CPU会切换到non-secure EL1去处理中断。这一点和GIC-V2是一样的。但是如果CPU在secure EL1/EL0 收到一个non-secure interrupt, 中断处理器会发FIQ给CPU,然后CPU会切换到EL3去作world切换,然后处理中断。这样做的好处是对于IRQ和FIQ他们的target 永远是不变的。
辛苦joeyxu休息天还帮忙回答问题
上面的回复有个小地方写的不是很准确。没有secure EL1,只有secure EL0或者secure EL3。
非常感谢您的回答,不知您这里所说的“没有secure EL1,只有secure EL0或者secure EL3。"是什么意思?
此外,在GIC-400里面,secure的中断可以被配置为IRQ或FIQ,Non-secure的中断只能被配置为IRQ.
这里我们以GIC-500为例,请问如果在Non-Secure状态下收到一个Secure的中断,如何处理?如果在Secure状态下收到一个Non-secure、secure中断如何处理?不同security状态的中断和CPU如何处理?
谢谢!
看来你对armv8架构还不够了解啊,最好看下armv8开发者指南,只有英文版,配合ATF源码看看,很快就能理解了
armv8中nonsecure-EL1,nonsecure-EL2,EL3,secure-EL1都有自己的中断向量表
如果不配置HCR,SCR寄存器的话,默认情况下,nonsecure-EL0的中断由nonsecure-EL1处理
nonsecure-EL1的irq,fiq,hvc中断由nonsecure-EL2处理,nonsecure-EL1的smc中断由EL3处理
nonsecure-EL2的中断由EL3处理
secure-EL0的中断secure-EL0由secure-EL1处理
secure-EL0的中断secure-EL0由secure-EL1处理securesecure-EL0ses
secure-EL1的中断secure-EL0由EL3处理
secure-EL0的中断由secure-EL1处理
secure-EL1的中断由EL3处理