Armv8之Execution State 和 Exception Level(一)
@
ARMV8系统级编程模型主要包括异常级别、运行状态、安全状态、同步异常、异步异常、DEBUG等。本文主要对系统级编程模型做一个概要介绍。
1. 典型的Exception Level使用模型
异常级别 | 运行的软件 |
---|---|
EL0 | Secure or Non-secure application |
EL1 | Secure or Non-secure OS |
EL2 | Hypervisor (可以理解为上面跑多个虚拟OS) |
EL3 | Secure Monitor(ARM Trusted Firmware) |
2.异常相关术语
术语 | 说明 |
---|---|
Taking an exception | PE第一次回应一个异常,此时PE state称为taken from, 之后PE状态为taken to |
Returning from exception | 当异常返回指令被提交运行,PE state就是return from exception |
异常级别 | 不同异常级别优先级不同,如EL3的异常高于EL1的异常 |
精准异常(precise exception) | 找到某条指令,这条指令前的所有指令都执行完毕,这条指令之后的所有指令都未执行(执行的需要回退),这样PE状态就被记录下载,异常处理完成后就可以恢复。除了SError irq 之外,其它的都是精准异常 |
同步异常(synchronous exception ) | (1)异常的产生是和cpu core执行的指令或者试图执行相关 (2)硬件提供给handler的返回地址就是产生异常的那一条指令所在的地址 (3)synchronous exception又可以细分成两个类别: a) 一种我们称之为synchronous abort,例如未定义的指令、data abort、prefetch instruction abort、SP未对齐异常,debug exception等等; b) 另一种是正常指令执行造成的,包括SVC/HVC/SMC指令,这些指令的使命就是产生异常。 |
异步异常(asynchronousexception ) | asynchronous exception基本上可以类似大家平常说的中断,它是毫无预警的,丝毫不考虑cpu core感受的外部事件(需要注意的是:外部并不是表示外设,这里的外部是针对cpu core而言,有些中断是来自SOC的其他HW block,例如GIC,这时候,对于processor或者cpu(指soc)而言,这些事件是内部的),这些事件打断了cpu core对当前软件的执行,因此称之interrupt。interrupt或者说asynchronous exception有下面的特点: (1)异常和CPU执行的指令无关。 (2)返回地址是硬件保存下来并提供给handler,以便进行异常返回现场的处理。这个返回地址并非产生异常时的指令。 根据这个定义IRQ、FIQ和SError interrupt属于asynchronous exception。 |
SError interrupt | SError interrupt是发生了external abort导致的异步异常(或称中断)。 external abort来自memory system, 是访问外部memory system产生的异常(当然不是所有的来自memory system的abort都是external abort,例如来自MMU的abort就不是external abort,这里的external是针对processor而非cpu core而言,因此MMU实际上是internal的)。external abort发生在processor通过bus访问memory的时候(可能是直接对某个地址的读或者写,也可能是取指令导致的memory access),processor在bus上发起一次transaction,在这个过程中发生了abort,abort来自processor之外的memory block、device block或者interconnection block,用来告知processor,搞不定了,你自己看着办吧。external abort可以被实现成synchronous exception(precise exception),也可以实现成asynchronous exception(imprecise exception)。如果external abort是asynchronous的,那么它可以通过SError interrupt来通知cpu core |
3. Execution State
3.1 两种Execution State
ARMv8 提供AArch32 state和 AArch64 state 两种Execution State,下表是两种Execution State对比:
Execution State | 说明 |
---|---|
AArch32 | 提供13个32bit通用寄存器R0-R12,一个32bit PC指针 (R15)、堆栈指针SP (R13)、链接寄存器LR (R14) |
提供一个32bit异常链接寄存器ELR, 用于Hyp mode下的异常返回 | |
提供32个64bit SIMD向量和标量floating-point支持 | |
提供两个指令集A32(32bit)、T32(16/32bit) | |
兼容ARMv7的异常模型 | |
协处理器只支持CP10\CP11\CP14\CP15 | |
AArch64 | 提供31个64bit通用寄存器X0-X30(W0-W30),其中X30是程序链接寄存器LR |
提供一个64bit PC指针、堆栈指针SPx 、异常链接寄存器ELRx | |
提供32个128bit SIMD向量和标量floating-point支持 | |
定义ARMv8异常等级ELx(x<4),x越大等级越高,权限越大) | |
定义一组PE state寄存器PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE当前的状态信息 | |
没有协处理器概念 |
3.2 决定Execution State的寄存器
寄存器及bit位 | 说明 |
---|---|
SPSR_EL1.M[4], Saved Program Status Register (EL1) | 决定EL0的执行状态: (1) 0b1 :AArch32 execution state (2) 其它 :AArch64 execution state |
HCR_EL2.RW, bit [31], Hypervisor Configuration Register | 决定EL1的执行状态: (1) 0b0 :较低的级别都是AArch32 (2) 0b1 :EL1的执行状态为AArch64。 在EL0上执行时,EL0的执行状态由PSTATE.nRW的当前值确定。 |
SCR_EL3.RW, bit [10], Secure Configuration Register | 决定EL2或EL1的执行状态: (1) 0b0 :较低的级别都是AArch32 (2) 0b1 :下一层较低的异常级别是AArch64 |
SPSR_EL3.M[4], Saved Program Status Register (EL3) | 决定EL3的执行状态: (1) 0b1 :AArch32 (2) 0b0 :AArch64 |
AArch32和AArch64之间的执行状态切换只能通过发生异常或者系统Reset来实现。
4. Secure state
Secure state | 说明 |
---|---|
Non-secure | EL0/EL1/EL2, 只能访问Non-secure 物理地址空间 |
Secure | EL0/EL1/EL3, 可以访问Non-secure 物理地址空间 & Secure 物理地址空间,可起到物理屏障安全隔离作用 |
4.1 EL3对secure state的影响
EL3是否实现 | 说明 |
---|---|
实现EL3 | (1) EL3只有secure state; (2) Non Secure state到secure state只能发生在EL3接收到异常; (3) secure state到non secure state只能发生在异常从EL3返回; (4) 如果 FEAT_SEL2未实现,EL2只有non secure state. (5) 如果 FEAT_SEL2实现,EL2可以存在 secure state,并通过SCR_EL3.EEL2 比特位置 1来使能 |
未实现EL3 | (1) 如果没有实现EL2,则secure state由SOC厂商决定; 2) 如果实现EL2且未实现 FEAT_SEL2, 则只有non secure state |
4.2 EL3使用AArch64 or AArch32的影响
EL3是否实现 | 说明 |
---|---|
Common | (1) User mode(AArch32才有) 只执行在Non- Secure EL0 or Secure EL0; (2) EL2只有Non-secure state( FEAT_SEL2未实现时); (3) EL0 既有Non-secure state 也有Secure state |
EL3处于AArch64执行状态 | (1) 若EL1使用AArch32,那么Non-Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在Secure EL1; (2) 若 SCR_EL3.NS = = 0,则切换到Secure EL0/EL1状态,否则切换到Non-secure EL0/EL1状态; 当SCR_EL3.{EEL2, NS} =={1,0},那么EL2也处于Secure状态 (3) Secure state 通常只有Secure EL0/EL1/EL3,但是在实现FEAT_SEL2的前提下EL2也可以处于Secure; (4) SCR.NS决定的是low level EL的secure/non-secure状态,不是决定当前的; |
EL3处于AArch32执行状态 | (1) 若EL1使用AArch32,那么Non- Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在EL3; (2) Secure state只有Secure EL0/EL3,没有Secure EL1 ; (3) SCR_EL3.NS决定的是low level EL的secure/non-secure状态,不是决定当前的; |
5. execution state与secure state组合
5.1 EL3使用AArch64时(注意两个图的差别和脚注)
5.2 EL3使用AArch32时
5.2.1 Armv8-A Security model when EL3 is using AArch32
5.2.2 AArch32 PE modes
5.2.3 AArch32 通用寄存器, PC, 和特殊寄存器 一览表
参考:
(1) 《Arm Architecture Reference Manual Armv8, for Armv8-A architecture profile - The AArch64 System Level Memory Model D4.4 Cache support》。
(2) ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST(注意本文部分描述有误)
Armv8之Execution State 和 Exception Level(一)的更多相关文章
- web项目引用Java项目,连接报错error HTTP Status 500 - Servlet execution threw an exception
错误信息 项目背景: 一个web项目引用一个java Project,项目中添加了引用,但是打开页面访问,总报500错误.提示:servlet初始化错误. 环境:Eclipse luna JDK: 1 ...
- spring使用jackson返回object报错:Handler execution resulted in exception: Could not find acceptable representation
问题:在springmvc中添加Jackson jar包返回Object类型,处理器方法的produces属性不写,默认根据类型,但如果指定了(错误原因)produces = "text/h ...
- javax.servlet.ServletException: Servlet execution threw an exception 异常解决之一
配置JDBC连接的JDBC.properties文件不存在(那天很奇怪配置文件不存在了,我也没有去移动那个文件.诡异呀)也会导致这个异常. 然后就报javax.servlet.ServletExcep ...
- Filter execution threw an exception 错误
Filter execution threw an exception 错误,我在web.xml中配置了一个filter用spring来解决懒加载的问题,为什么就会包这个错 java.lang.NoS ...
- struts2 type="redirect"源码解析
首先解释一下几个名词: request.getRequestDispatcher()是请求转发,前后页面共享一个request ; response.sendRedirect()是重新定向,前后页面不 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常
1.前言 本文介绍异常相关内容,包括异常类型,异常进入,异常返回,异常层次结构,异常的路由等 2. RESET ARMV8体系结构支持两种类型的RESET Cold reset:Reset PE所有 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST
1.前言 ARMV8系统级编程模型主要包括异常级别.运行状态.安全状态.同步异常.异步异常.DEBUG 本文主要对系统级编程模型做一个概要介绍 2. 异常级别 2.1 Exception level概 ...
- ARMV8 datasheet学习笔记1:预备知识
1. 前言 ARMv8的架构继承以往ARMv7与之前处理器技术的基础; 除了支持现有的16/32bit的Thumb2指令外,也向前兼容现有的A32(ARM 32bit)指令集. 基于64bit的AAr ...
- armv8 memory translation table descriptor
上一节大致给出了descriptor的结构,这篇细致分析各个field: 1) Table Descriptor:stage2中不包含任何的attribute的field,每个level中的descr ...
- ARMv8 架构与指令集.学习笔记
目 录 第1章 ARMv8简介. 3 1.1基础认识. 3 1.2 相关专业名词解释. 3 第2章 Execution State 4 2.1 提供两种Execution State 4 2.2 决定 ...
随机推荐
- KingbaseES V8R3 由于修改系统时间导致sys_rman备份故障案例
案例说明: 此案例,为复现"current time may be rewound"错误.对于数据库环境,在使用前必须保证系统时间的正确性.如果数据库创建后,再将系统时间修改为 ...
- QT学习(二)
这一篇学习QT中最重要的也是最有特色的信号槽机制. (因为我学习过MFC,所以我觉得QT的信号槽机制和MFC中的消息响应机制是一一对应的.不过是MFC用的是宏来实现,而QT用的是消息和槽.相对来说QT ...
- Macos下用pycharm运行django项目死活安装不上mysqlclient怎么办!!??
花了我三天时间,佛了 我刚从win过渡到mac,想着把代码迁移一下. 然后看到依赖里面有一个mysqlclient,然后pip3 install死活装不上 解决方案: 在这里写上这个 然后就好,死了
- 为什么最近每份 Android 简历都说 “熟悉 MQTT 协议”?
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- Linux Netlink学习笔记
参考链接:https://www.systutorials.com/docs/linux/man/7-netlink/ 1. 监听Netlink消息类型示例 Netlink是用户程序与内核通信的soc ...
- jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(1)
前言:前面写过2篇文章,介绍jenkins通过slave节点部署构建并发布应用到虚拟机中,本篇介绍k8s(k3s)环境下,部署jenkins,通过流水线脚本方式构建发布应用到k8s(k3s)集群环境中 ...
- K8s nginx-ingress 如何配置二级目录转发远程静态服务器基于Vue路由history模式打包的应用程序
背景 首先这标题有点绕,我先解释下: 首先我们有静态服务器,上面某个目录有Vue路由history模式打包的应用程序(也就是build后的产物): 但是静态服务器一般不做对外域名用的,我们需要在k8s ...
- 记Mybatis动态sql
目录 记MyBatis动态SQL 1.< SQL >标签 2.< if >标签 3.分支标签 1.第一种:用在查询条件上用choose-when:otherwise可不要 2. ...
- Logstash:Logstash-to-Logstash 通信
文章转载自:https://elasticstack.blog.csdn.net/article/details/117253545 在有些时候,我们甚至可以建立 Logstash-to-Logsta ...
- 前端三件套 HTML+CSS+JS基础知识内容笔记
HTML基础 目录 HTML基础 HTML5标签 doctype 标签 html标签 head标签 meta标签 title标签 body标签 文本和超链接标签 标题标签 段落标签 换行标签 水平标签 ...