1.前言

ARMV8系统级编程模型主要包括异常级别、运行状态、安全状态、同步异常、异步异常、DEBUG

本文主要对系统级编程模型做一个概要介绍

2. 异常级别

2.1 Exception level概述

ELx(x<4),x越大等级越高,执行特权越高

执行在EL0称为非特权执行

EL2 没有Secure state,只有Non-secure state

EL3 只有Secure state,支持EL0/EL1的Secure 和Non-secure之间的切换

EL0 & EL1 必须要实现,EL2/EL3则是可选实现

当接收到一个异常时,异常级别只能调高或保持;

当从异常返回时,异常级别只能调低或保持

在接收到异常将要切换或保持的异常级别称为目标异常级别

每个异常级别本身有一个默认固定的目标异常级别,还可以通过寄存器设置目标异常级别,目标异常级别不能为EL0

当PE运行在一个异常级别时,可以访问如下两种资源:

  1. 当前异常级别和安全状态组合下的资源;
  2. 低异常级别可访问的资源(要符合安全状态)

2.2  典型的Exception Level使用模型

异常级别

运行的软件

EL0

Application

EL1

Linux kernel- OS

EL2

Hypervisor (可以理解为上面跑多个虚拟OS)

EL3

Secure Monitor(ARM Trusted Firmware)

2.3 异常相关术语

术语

说明

Taking an exception

PE第一次回应一个异常,此时PE state称为taken from, 之后PE状态为taken to

Returning from exception

当异常返回指令被提交运行,PE state就是return from exception

异常级别

不同异常级别,异常的优先级不同如EL3的异常高于EL1的异常

精准异常

找到某条指令,这条指令前的所有指令都执行完毕,这条指令之后的所有指令都未执行(执行的需要回退),这样PE状态就被记录下载,异常处理完成后就可以恢复。除了SError irq之外,其它的都是精准异常

同步异常

(1)异常的产生是和cpu core执行的指令或者试图执行相关

(2)硬件提供给handler的返回地址就是产生异常的那一条指令所在的地址

(3)synchronous exception又可以细分成两个类别:

a). 一种我们称之为synchronous abort,例如未定义的指令、data abort、prefetch instruction abort、SP未对齐异常,debug exception等等;

b). 还有一种是正常指令执行造成的,包括SVC/HVC/SMC指令,这些指令的使命就是产生异常。

异步异常

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. exeution 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的异常模型,映射到ARMV8异常模型

使用32bit虚拟地址

使用CPSR来保存当前PE状态

协处理器只支持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越大等级越高,权限越大

提供64bit虚拟地址

定义一组PE state寄存器SPSR_ELx来保存 PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE当前的状态信息

没有协处理器概念,系统寄存器带后缀n标志最低的异常访问级别

注:AArch32与AArch64的切换称为interprocessing, interprocessing只能发生在(1)reset ;(2)异常级别的转换时

3.1 决定Execution State的条件

SPSR_EL1.M[4] 决定EL0的执行状态,为0 =>64bit ,否则=>32bit

HCR_EL2.RW 决定EL1的执行状态,为1 =>64bit ,否则=>32bit

SCR_EL3.RW确定EL2 or EL1的执行状态,为1 =>64bit ,否则=>32bit

AArch32和AArch64之间的切换只能通过发生异常或者系统Reset来实现.(A32 -> T32之间是通过BX指令切换的)

4. Secure state

Non-secure

EL0/EL1/EL2, 只能访问Non-secure 物理地址空间

Secure

EL0/EL1/EL3, 可以访问Non-secure 物理地址空间 & Secure 物理地址空间,可起到物理屏障安全隔离作用

4.1 EL3对secure state的影响

实现EL3

  1. EL3只有secure state;
  2. Non Secure state到secure state只能发生在EL3接收到异常;
  3. secure state到non secure state只能发生在异常从EL3返回;
  4. 如果EL2实现,只有non secure state.

未实现EL3

  1. 如果没有实现EL2,则secure state由SOC厂商决定;
  2. 如果实现EL2, 则只有non secure state

4.2 EL3使用AArch64 or AArch32的影响

Common

User mode(AArch32才有) 只执行在Non- Secure EL0 or Secure EL0

SCR_EL3.NS决定的是low level EL的secure/non-secure状态,不是决定自身的

EL2只有Non-secure state

EL0 既有Non-secure state 也有Secure state

EL3使用

AArch64

若EL1使用AArch32,那么Non-Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在Secure EL1

若 SCR_EL3.NS == 0,则切换到Secure EL0/EL1状态,否则切换到Non-secure EL0/EL1状态

Secure state 有Secure EL0/EL1/EL3

EL3使用

AArch32

若EL1使用AArch32,那么Non- Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在EL3

Secure state只有Secure EL0/EL3,没有Secure EL1

5. execution state与secure state组合

  • EL3使用AArch64

图 EL3使用AArch64时execution state和secure state组合

  • EL3使用AArch32

图 EL3使用AArch32时execution state和secure state组合

6. 参考文档

[1] DDI0487A_k_armv8_arm_iss10775.pdf

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST的更多相关文章

  1. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(4)- 其它

    1. 前言 2.可配置的指令使能/禁用控制和trap控制 指令使能/禁用 当指令被禁用,则这条指令就会变成未定义 指令Trap控制 控制某条或某些指令在运行时进入陷阱,进入陷阱的指令会产生trap异常 ...

  2. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常

    1.前言 本文介绍异常相关内容,包括异常类型,异常进入,异常返回,异常层次结构,异常的路由等 2.  RESET ARMV8体系结构支持两种类型的RESET Cold reset:Reset PE所有 ...

  3. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器

    1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...

  4. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型

    1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性   2. 存储系统体系结构 2.1.    地址空间 指令地址空间溢出 指令地址计算((address_of ...

  5. ARMV8 datasheet学习笔记5:异常模型

    1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32.AArch64架 ...

  6. ARMV8 datasheet学习笔记3:AArch64应用级体系结构

    1.前言 本文主要从应用的角度介绍ARMV8的编程模型和存储模型 2. AArch64应用级编程模型 从应用的角度看到的ARM处理器元素: 可见的元素(寄存器/指令) 说明 可见的寄存器 R0-R30 ...

  7. ARMV8 datasheet学习笔记1:预备知识

    1. 前言 ARMv8的架构继承以往ARMv7与之前处理器技术的基础; 除了支持现有的16/32bit的Thumb2指令外,也向前兼容现有的A32(ARM 32bit)指令集. 基于64bit的AAr ...

  8. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer

    1.前言 2.generate timer 2.1 概述 提供了一个系统计数器,用来实时测量流逝的时间: 提供了一个虚拟计数器,用来测量某个虚拟机上流逝的虚拟时间: 定时器,每隔一段时间会触发事件,支 ...

  9. ARMV8 datasheet学习笔记2:概述

    1. 前言 本文主要概括的介绍ARMV8体系结构定义了哪些内容,概括的说: ARM体系结构定义了PE的行为,不会定义具体的实现 ARM体系结构也定义了debug体系结构和trace体系结构 ARM体系 ...

随机推荐

  1. 自学工业控制网络之路1.1-工业控制系统发展历程CCS DCS FCS

    返回 自学工业控制网络之路 自学工业控制网络之路1.1-工业控制系统发展历程CCS DCS FCS 工业控制系统是对诸如图像.语音信号等大数据量.高速率传输的要求,又催生了当前在商业领域风靡的以太网与 ...

  2. pthread_cond_wait() 函数的使用

    1. 首先pthread_cond_wait 的定义是这样的 The pthread_cond_wait() and pthread_cond_timedwait() functions are us ...

  3. 【洛谷P1072】Hankson 的趣味题

    题目大意:给定四个数字 a,b,c,d,求满足 \(gcd(a,x)=b,lcm(c,x)=d\) 的 x 的个数. 题解: 解法1:根据 lcm 的性质,x 一定为 d 的约数.因此,直接枚举 d ...

  4. (转)Java程序员的面试经历和题库

    背景:最近我在找工作,前期就像打了鸡血的一样,隔一段时间没有面试,就又松懈了下来,看到别人写的面经,感觉就像打脸一般,以后要多多总结前人的经验,时刻保持压力状态才是. 作者:nuaazhaofeng2 ...

  5. selectionStart和selectionEnd属性

    在网上看了很多用js在光标处插入文字的代码,很多都没有用,互抄而已,浪费时间.最近用到一个新方法,可以到达这个需求.IE支持document.selection,Firefox,Chrome,Safa ...

  6. MyEclipse添加模板注释

    只有两个步骤: 1.设置模板 Windows—Preference—Java—Code Style—Code Templates 图中, Configure generated code and co ...

  7. 洛谷 P4378 [USACO18OPEN]Out of Sorts S(树状数组求冒泡排序循环次数)

    传送门:Problem P4378 https://www.cnblogs.com/violet-acmer/p/9833502.html 要回宿舍休息了,题解明天再补吧. 题解: 定义一数组 a[m ...

  8. 获取Field成员变量类

    位于java.lang.reflect.Field包中 getModifiers() 成员变量修饰符(public.private) getName() 成员变量名字 getType() 成员变量类型 ...

  9. C# 线程手册 第三章 使用线程 实现一个数据库连接池(实战篇)

    在企业级软件开发过程中,为了改善应用程序的性能需要通常使用对象池来控制对象的实例化.例如,在我们每次需要连接一个数据库时都需要创建一个数据库连接,而数据库连接是非常昂贵的对象.所以,为了节省为每次数据 ...

  10. loadrunner之WebServices协议脚本编写(三种请求模式)

    以天气预报网站为例:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 一.web_service_call模式 步骤如下 ...