最近两个问题,戳到了我的知识盲点,当然我这个菜鸡ATF哪里都是盲点。
问题一:EL3可能没有实现吗?
问题二:bl2是aarch32, 那么bl2是S-EL1,bl31也是S-EL1?
1、EL3可能没有实现吗?
The Armv8-A architecture defines a set of Exception levels, EL0 to EL3, where:
+ If ELn is the Exception level, increased values of n indicate increased software execution privilege.
+ Execution at EL0 is called unprivileged execution.
+ EL2 provides support for virtualization.
+ EL3 provides support for switching between two Security states, Secure state and Non-secure state.
An implementation might not include all of the Exception levels.All implementations must include ELO and EL1.EL2 and EL3 are optional.
Armv8-A体系结构定义了一组异常级别,EL0到EL3,其中:
- 1、如果ELn是异常级别,则增加的n值表示增加的软件执行权限。
- 2、在EL0执行被称为无特权执行。
- 3、EL2支持虚拟化。
- 4、EL3支持在两种安全状态(安全状态和非安全状态)之间切换。
实现可能不包括所有异常级别。所有实施必须包括EL0和EL1。EL2和EL3是可选的。
2、bl2是aarch32,那么bl2是S-EL1,bl31也是S-EL1?
关于这个问题,我挺纳闷的,bl2怎么会是S-EL1,bl31也是S-EL1。
这句话的出处:
我脑子里一直都是基于arrch64,此时BL2和BL31都是位于EL3。但是关于arrch32的异常等级不是很了解,就这个问题展开瞅瞅。来看看arrch32的架构。
不过在这个之前我们需要回溯一些ARMv8的安全架构:
一般情况下,应用程序、操作系统内核、Hypervisor,占有一个单独的异常等级。但是有个例外,就是像KVM这样的在内核中的Hypervisor,会运行在EL1和2中。
1、怎么来的AArch64和AArch32?
在这个基础之上ARMv8架构是有两种运行状态,AArch64和AArch32:
1)AArch64
-
运行64bit宽通用寄存器。
-
AArch64的特权等级,由异常等级决定。因此运行在ELn的特权等级就是PLn。
-
在AArch64状态,处理器执行A64指令集。
2)AArch32
-
运行32bit宽通用寄存器。
-
AArch32保留了ARMv7的特权等级。
-
在AArch32状态,处理器执行A32或者T32(Thumb)指令集。
为什么需要有个32呢,这个就是为了兼容性的考虑。Armv7之前都是32位的。那么要解决这个问题。我们就需要结合Armv7的安全等级来瞅瞅对应现在的EL0到EL3.
手续年看看ArmV7。
2、ARMv7
从图片中我们看到了这个特权等级不像是V8的EL开头,而是PL开头的。
所以回归问题的根因就是:bl2怎么会是S-EL1,bl31也是S-EL1。这个S-EL1是指的是Secure PL1。
这样这句话是不是就成立了。(就是因为在32位中没有EL这个说法,SE-PL1就是对应64的EL3。)
要学习的还要好多呀!!!
参考资料:
https://blog.csdn.net/sjwangjinbao/article/details/121758726