aarch64系统级体系架构之异常级别 1.简述 2.树莓派启动深度解析 3.不同异常级别需要注意的问题 1.简述 系统的异常级别对于arm芯片来说非常的重要,对于操作系统层面上来说,理解芯片的体系架构...本文简单介绍一下树莓派启动的异常级别,如何从不同的exception level进行切换,同时启动的时候如何指定exception level,大体上去理解异常级别。...关于el3,el2,el1,el0可以看下面的图进行理解。 ? 应用程序运行在EL0上,此时可以访问的寄存器很有限,比如我们安卓手机安装的app,其实都是运行在EL0的。...3.不同异常级别需要注意的问题 既然涉及到异常级别,那就不得不说一下使用异常级别需要注意的问题了。安全和非安全这是物理隔离的,但是异常级别却是需要进行切换的。...然后就是你在el1上访问某些寄存器的时候,突然系统hard fault,这时就要看aarch64的芯片手册了,看这个寄存器是在那个异常级别下可以访问的。有些寄存器在不对应的异常级别,读为零,写无效。
根据实现选择,体系结构支持多级执行特权,由从EL0到EL3的不同异常级别表示。EL0对应于最低的特权级别,通常被描述为无特权。应用层程序员模型是在EL0上执行软件的程序员模型。...系统软件决定异常级别,因此决定软件运行的特权级别。当操作系统同时支持EL1和EL0执行时,应用程序通常在EL0上运行。 允许操作系统以唯一的或共享的方式将系统资源分配给应用程序。...在EL1或更高的异常级别执行的软件可以将这些寄存器配置为可在EL0访问。...应用程序级缓存管理 在EL0上,可以使用SCTLR_EL1系统寄存器从更高级别的特权启用少量缓存管理指令。从EL0到禁用访问权限的操作的任何访问都将导致该指令表现为未定义的。...当一个异常从AArch64状态返回到AArch32状态时,SPSR_ELx.DIT它被复制到CPSR.DIT。 PSTATE.DIT 它可以在所有异常级别读写。
Exception levels ARMv8-A系列定义了一系列的异常等级,从EL0到EL3,下面具体说明其含义: ELn中,随着n的增加,软件的执行权限也相应的增加; EL0被称为无特权执行; EL2...提供了对虚拟化的支持 EL3提供了安全状态切换功能(安全状态与非安装状态之间的切换) 异常级别的切换 在AARCH64状态下,异常级别的切换只能发生在触发了异常,或者异常处理返回过程中,其中: 当发生异常时...在发生异常即将进入或者从异常处理返回到另一个异常级别(包括异常级别不变的情况)时,待进入/返回的异常级别称之为目标异常级别。...每个异常级别都有一个明确的目标异常级别,这个目标异常级别要么是默认定义的,要么是通过系统寄存器的相应bit定义的(注意没有异常级别的目标异常级别是EL0)。...常见的异常级别模型 ELn 应用范围 EL0 应用 EL1 操作系统或者一些特权函数 EL2 Hypervisor EL3 Secure Monitor Security state Armv8-A架构提供了两种安全状态
一、ARMv8异常简介 1.异常级别 不同于Armv7架构采用CPU模式切换的方式进行异常处理,Armv8架构定义了一组全新的异常级别进行异常处理,即EL0至EL3,有如下特性: 如果ELn为异常级别,...一个实现可以不包括所有的异常级别,但都必须包括EL0和EL1。EL2和EL3是可选的。 如下是典型的异常级别使用模型: ? 2....保存处理器状态意味着异常处理程序可以: 从异常返回时,将处理器状态恢复到SPSR中存储的异常级别的状态。例如,异常处理程序从EL1返回时,处理器状态恢复到存储在SPSR_EL1中的状态。...例如,当处理器将异常处理交给EL1处理时,会将异常返回地址保存在ELR_EL1中。在异常返回时,PC恢复到存储在ELR中的地址。例如,从EL1返回时,PC将恢复到ELR_EL1中存储的地址。...AArch64状态为每个异常级别都提供了ELR寄存器: ELR_EL1,用于EL1的异常。 如果实现了EL2,ELR_EL2用于EL2的异常。
安全世界可以不受限制的访问所有计算资源,而普通世界不能访问被划分到安全世界的计算资源。 通常来说,应用程序运行在EL0,操作系统运行在EL1....发生EL0到EL1切换的可能场景: 应用程序需要调用操作系统提供的系统调用,此时应用程序会执行svc指令将cpu特权级从EL0切换到EL1 应用程序执行的指令出发了异常,该异常导致CPU特权级切换到EL1...CPU收到中断 其中,第1、2种称为同步的CPU特权级切换,而第三种称为异步的CPU特权级切换。 在发生特权级切换的时刻,CPU负责保存当前执行状态。...栈指针进行切换(操作系统可以设置这个寄存器来配置处理异常过程中使用的栈 其他的状态 异常向量表 操作系统可以在异常向量表种为不同的异常类型配置相应的处理函数。...发生特权级切换时,CPU会读取VBAR_EL1(向量地址寄存器)来获取异常向量表的基地址,然后调用相应的处理函数 寄存器 在AArch64中,有31个64位通用寄存器,被命名为X0~X30。
级别(EL,也称为执行级别)EL0 到 EL3 和两个 安全状态安全和非安全又名正常世界。...越高的 异常级别,软件执行权限越高。EL3 代表最高执行/特权级别,并提供支持 在两种安全状态之间切换,可以访问所有系统 两种安全状态下所有 EL 的资源。...,它是 编译为 ELF AArch64 可执行文件并被视为内核映像,因为 QEMU 允许直接从 EL3 中的 ELF 内核映像启动并处理 图像加载过程。...此外,我们不会实施任何 EL0 应用程序或执行 `svc` 从我们的内核调用,结果所有 VBAR_EL1 条目都设置为 导致系统挂起(无限循环)。...同样,对于 EL3,我们只期望 来自较低级别 AArch64 模式的同步异常。结果只有 相应的“vectors_el3”条目(+0x400)已设置,所有其他条目都会导致 系统挂起与 EL1 向量一样。
此外,我们不会实施任何 EL0 应用程序或执行 `svc` 从我们的内核调用,结果所有 VBAR_EL1 条目都设置为 导致系统挂起(无限循环)。...同样,对于 EL3,我们只期望 来自较低级别 AArch64 模式的同步异常。结果只有 相应的“vectors_el3”条目(+0x400)已设置,所有其他条目都会导致 系统挂起与 EL1 向量一样。...不遵守最小配置会导致 `eret` 调用对执行异常级别没有影响(至少在 QEMU),换句话说,我们不能降到更低的 EL。...------[ 2.1.1 - EL1 如前所述,我们的目标是提供最小的设置。考虑到这一点, 还需要尽可能接近原始设置。...由于EL2 未设置异常向量表,唯一的方法是下降到 EL2 来自 EL3,就像我们对 EL1 所做的那样。
下图是一个三级页表的例子: 在 Armv8-A 中,最大级别数为 4,级别编号为 0 到 3。这种多级方法允许使用更大的块和更小的块。...下图显示了 AArch64 中虚拟地址空间的布局: 如左图所示,EL0/EL1的虚拟地址空间有两个区域:内核空间和用户空间。内核空间在顶部,用户空间在底部。内核空间和用户空间有各自单独的转换表。...如右图所示,其他所有异常级别的地址空间在底部有一块单独的区域。 每个区域的地址空间的大小最多为52位。然而,每个区域都可以独立地缩小。TCR_ELx寄存器中的TnSZ字段控制虚拟地址空间的大小。...因此,如果TCR_EL1.SZ1设置为32,则 EL0/EL1 虚拟地址空间中内核区域的大小为 2的32次方个字节(0xFFFF_FFFF_0000_0000 到 0xFFFF_FFFF_FFFF_FFFF...statge 指的是把输入地址转换为输出地址的过程。对于stage1,就是从VA到IPA的过程。stage2 从IPA到PA的过程。
综述 本文描述了Armv8-A AArch64的虚拟化支持。包括stage 2页表转换,虚拟异常,以及陷阱。...AArch64的虚拟化 对于ARMv8, Hypervisor运行在EL2异常级别。只有运行在EL2或更高异常级别的软件才可以访问并配置各项虚拟化功能。...然而,当配置HCR_EL2.TWI==1时,如果在EL0/EL1执行WFI则会导致EL2的异常。(注:陷入不是为虚拟化而设计的,有陷入到EL3和EL1的异常,但异常对虚拟化实现至关重要。)...在此之前,从EL1访问*_EL2寄存器时的行为是未定义的,通常是会产生一个EL1的异常。而控制比特NV和NV1使得这种访问可以被陷入到EL2。...从EL1访问*_EL2寄存器将会被重定向到一块内存区域,该内存区域的地址由Host Hypervisor在 VNCR_EL2中指定。
3 AArch64虚拟化 运行在EL2或更高异常级别上的软件,可以访问控制虚拟化: Stage-2地址转换 EL1/0指令和寄存器访问的捕获 虚拟异常的产生 异常级别(EL),各层上运行的软件以及安全、...8 虚拟化主机扩展 下图展示了一个软件和异常级别对应关系的简化版本: 可以看到独立hypervisor和ARM异常级别的对应关系。hypervisor运行在EL2上,VM运行在EL0/1上。...下表总结了典型的设置: 执行 E2H TGE Guest内核(EL1) 1 0 Guest应用(EL0) 1 0 Host内核(EL2) 1 1* Host应用(EL0) 1 1 当发生异常,从VM退出...从EL1访问_EL2寄存器,通常是未定义的,这种访问会造成到EL1的异常。而NV和NV1控制位则将这种异常陷入到EL2。...问:在哪个异常级别中可以使用虚拟中断? 答:虚拟中断只有在EL0或EL1中执行,并且只有设置HCR_EL2中相应的路由标志位才能启用。 问:SMMU是什么?如何使用SMMU进行虚拟化?
我们从5个方面描述: 1,AArch64,A64指令集,这里有一个误解是,64bit的指令集是指通用寄存器是64位宽的,而不是指32位的指令集编码变成64位的。...3,AArch64摒弃了之前的处理器模式、优先级级别等传统概念。提出了EL(Exception level)。...放弃privilege level的概念。形成Exception level,可以将EL0归属于non-privilege level,EL1/2/3属于privilege level。...2)Application位于特权等级最低的EL0,Guest OS(Linux kernel、window等)位于EL1,提供虚拟化支持的Hypervisor位于EL2(可以不实现),提供Security...3)只有在异常发生时(或者异常处理返回时),才能切换Exception level(这也是Exception level的命名原因,为了处理异常)。
同样的这里的vCPU严格来说应该是vPE。 2 AArch64的虚拟化 对于ARMv8, Hypervisor运行在EL2异常级别。...Stage 2转换 EL1/0指令和寄存器访问 注入虚拟异常 安全状态和非安全状态下的异常级别及可运行的软件如图4所示 图4:AArch64的虚拟化 注意:安全状态的EL2用灰色显示是因为,安全状态的...然而,当配置HCR_EL2.TWI==1时,如果在EL0/EL1执行WFI则会导致EL2的异常。(注:陷入不是为虚拟化而设计的,有陷入到EL3和EL1的异常,但异常对虚拟化实现至关重要。)...图27:从EL2访问EL1寄存器 异常 通常系统寄存器HCR_EL2.IMO/FMO/AMO的这几个比特位可以用来控制物理异常被路由至EL1或EL2。...在此之前,从EL1访问*_EL2寄存器时的行为是未定义的,通常是会产生一个EL1的异常。而控制比特NV和NV1使得这种访问可以被陷入到EL2。
EL0 Unprivileged,applications(with task protection,etc) EL1 Operating system,kernel,etc EL2 Hypervisor...(for virtualisation) EL3 Secure monitor(for switching to/from secure state) svc,hvc,smc指令切换,对EL1~3...有三种不同的中断向量,客户端可以生产virtual exceptions CP15 is no more Cache,address and TLB management now have dedicated...context(EL0 is managed by EL1) This means up to 3 stage translation depending on the context UEFI...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
EL3 只有 Secure-State,并且控制 EL0和EL1 在两种模式间切换; EL0 和 EL1 必须实现,EL2 和 EL3 是可选的。...初始化 EL1 - EL3 asm.S - arm64_elX_to_el1 对各个 EL 的配置,需要 CPU 在对应的 EL 状态下才能配置 EL1 EL1 不需要配置直接返回 //读取现在的异常级别...设置 EL0/EL1 为 non-Secure State 开启 HVC 指令 使用 AARCH64 指令 cmp x9, #(0b10 << 2) //当前为异常级别 2,跳转到 inEL2...(0b0101)) /* EL1h runlevel */ msr spsr_el3, x9 //配置 EL1 并准备进入 EL1 * b .confEL1 从 EL3 返回 EL1...EL1 的异常处理为 AARCH64 指令,同上 mov x9, #HCR_EL2_RW msr hcr_el2, x9 /* disable EL1 FPU traps */ mov x9
,而是需要特殊配置的) 说明1:配置使用SP_EL0是在PE已经切换到targe exception level上进行的 说明2:即使异常处理没有发生异常等级切换,也需要处理上述栈指针的配置 例如...此时如果发生异常,并且target exception level也是EL1,虽然异常等级不会切换,但是栈指针也会自动切换为SP_EL1。...3:在Linux内核中,当从EL0陷入EL1时,使用SP_EL1作为当前栈指针。...SP_ELx:x 可以是 1, 2, 或 3,代表不同的异常级别。不同的异常级别对应不同的操作模式,比如操作系统的内核模式或中断处理模式,每个异常级别都有自己的堆栈。...的异常等级都实现了一个ELR_ELn,以异常等级为后缀 当异常发生时,异常返回地址将被保存在target exception level的ELR寄存器;当异常返回时,将使用的ELR寄存器中的值恢复到PC
从MMU发出的指令abort。 当cpu尝试去执行一块没有执行权限的内存区域,则会发生指令abort 从MMU发出的数据abort。...,则最终会通过SVC指令进入到内核空间 HVC(Hypervisor Call) 当在ARMv8-A架构下,normal world, EL1尝试去访问EL2的时候,则会陷入到虚拟化层的,其中是通过...如果当前的异常发生在EL1,则将PSTATE的状态保存到SPSR_EL1中 将PC的值存储在ELR_ELn寄存器中,也是根据当前所处的EL级别。...当一个异常发生时,如果确定异常的类型 当异常发生时,我们可以从ESR_ELn寄存器中获取对应的异常状态。 ?...如果异常级别是EL1,也就是Current EL,则偏移地址为0x200 如果异常类型是64位应用程序,异常级别是EL0发生,则偏移地址为0x400 如果异常类型是32位应用程序,异常级别是EL0发生,
这类Hypervisor典型的案例有Linux KVM等。 对应于ARM异常处理体系结构,通常虚拟机操作系统的应用程序或用户空间处于EL0安全等级。虚拟机操作系统的内核态空间处于EL1安全等级。...QNX Hypervisor资源层级示意图 在Hypervisor正常运行期间,qvm 进程实例需要执行以下操作: 捕获从虚拟机出入的访问尝试,并根据类型进行相应的处理; 在切换物理CPU之前保存VM的上下文...2.3 ARM 虚拟机和虚拟处理器支持 ARM架构中的下陷机制是通过异常处理来实现的。如上文所述,通常虚拟机操作系统的应用程序或用户空间处于EL0安全等级。...如下如左边所示,当超出EL1安全等级的VM或者应用程序指令执行时,将向 EL2级别的Hypervisor发出异常下陷,交由Hypervisor来处理异常,然后通过上下文切换返回到EL1安全等级的VM。...通过注入断言TWI信号,如果满足HCR_EL2.TWI==1,则在EL0或EL1安全等级上执行WFI将导致异常并下陷到EL2安全等级上处理。
AArch64异常模型由几级异常组成,分别是EL0 – EL3,EL0和EL1又分别有安全和非安全模式,EL2是hypervisor级别,仅存在于安全模式,EL3是最高异常优先级别,仅存在于安全模式。...该基地址一下的内存目前Linux并没有使用,因此强烈建议基地址就是于RAM的开始地址,从映像开始,必须保证有image_size大小可用空间给kernel映像使用。...如果kernel是进入EL1异常级别,那么那么必须将CNTHCTL_EL2[EL1PCTEN]比特置1. – Coherency 在进入kernel时,必须保证由kernel引导的所有CPU都处在同一个同步域内...– System registers 为防止在一种不确定状态中执行,在kernel在开始进入一个异常级别运行前,在一个更高异常级别上的软件必须首先将kernel即将要运行的异常级别中的所有可写架构系统寄存器初始化到一种确定的状态...、Cache、MMU、体系timer、coherency、和系统寄存器的要求适用于所有的CPU,所有CPU都必须让kernel必须进入同一个异常级别。
尽管Non-secure状态永远不能对Secure 的数据进行操作,但Secure World 可以将NS行分配到缓冲区。另外,缓存的启用和禁用在每个异常级别都是不同的。...缓存控制对于两个世界来说都是独立的,但对所有的异常级别来说并不是独立的。所以,EL0不能直接启用或禁用缓存,而EL2可以覆盖Non-secure EL1的行为。...在这种情况下,EL3是AArch32,以提供一个安全的操作系统和监视器。 下图显示了当EL3执行AArch64以提供安全监视器时的安全模型。EL1用于安全操作系统。...当EL3使用AArch64时,EL3被用来执行负责在Non-secure state和Secure state之间切换的代码。...为了与AArch32保持一致,Secure state的EL1和EL0具有和Non-secure state的EL1和EL0不同的虚拟地址空间。
我们软件需要做的其实就是管理这个页表,按照ARM的技术要求去创建一个这样的页表,然后再将其基地址写入到TTBR1_EL1或TTBR0_EL1。...当然,根据实际的场景和需要,这个基地址和页表中的内容都会发生动态变化。例如,两个user进程进行切换时,TTBR0_EL1是要从一个user的页表地址,切换到另外一个user的页表地址。...在EL0/EL1的系统中,MMU地址转换时,如果虚拟地址在0x00000000_ffffffff - 0x0000ffff_ffffffff范围,MMU会自动使用TTBR0_EL1指向的页表,进行地址转换...The TCR_EL1 has separate enable bits for EL0 and EL1 如果使用memory tagging, 虚拟地址的[63:56]用于传输签名数据,bit[55]...表示是否需要签名.TCR_EL1也会有一个bit区分是给EL0用的还是给EL1用的 启用hypervisor 如果启用了hypervisor那么虚拟地址转换的过程将有VA—>PA变成了VA—>IPA—>
领取专属 10元无门槛券
手把手带您无忧上云