1. 前言

2.可配置的指令使能/禁用控制和trap控制

  • 指令使能/禁用

当指令被禁用,则这条指令就会变成未定义

  • 指令Trap控制

控制某条或某些指令在运行时进入陷阱,进入陷阱的指令会产生trap异常,路由规则如下:

(1)当前为EL1,则陷阱异常传递给EL1(HCR_EL2.TGE定义为1时,会路由到EL2);

(2)当前为EL2,则陷阱异常传递给EL2;

(3)当前为EL3,则陷阱异常传递给EL3;

3. 系统调用

  • SVC

默认情况下SVC产生supervisor call,同步异常目标级别为EL1,使得运行EL0的软件可以调用EL1下的操作系统或软件的接口

  • HVC

如果实现了EL2,默认情况下HVC产生hypervisor call,同步异常目标级别为EL2

注:HVC指令在EL0和secure EL1没有定义

  • SMC

如果实现了EL3,默认情况下SMC产生Secure monitor Call,同步异常目标级别为EL3

注:SMC指令在EL0未定义

注:

1.此处说的默认情况需满足如下两个条件:

(1)系统调用指令的运行等级低于或等于目标异常级别;

(2)系统调用指令没有被trap控制到其他异常级别???

2. 如果运行HVC和SVC的异常级别高于目标异常级别,会引发异常,并被传递给当前异常级别;

3. EL3和EL2可以禁用HVC系统调用;

4. EL2可通过trap(配置陷阱异常)的方式调用SMC;

5. EL3可以禁用SMC

4. 低功耗模式机制

  • Send Event指令

(1)SEV指令,在多处理器系统中,event会被发送给所有的PE;

(2)SEVL指令,设置本地event  Register;

注:

(1)建议SEV前加DSB保证内存访问完成;

(2)SEVL与WFE在同个PE执行,不需要加屏障

所有的异常级别都可以执行SEV和SEVL指令;

  • Event Register

Event register对应每个PE都有一个bit,如果置位说明有一个事件发生,PE要请求某些行为。有如下事件均可导致event register置位:

(1)执行SEV指令;

(2)当前PE执行SEVL指令;

(3)异常返回;

(4)global monitor中关于本PE的标记位被清除;

(5)来自于generic timer event stream的事件;

(6)发送自定义事件

  • Wait for Event(WFE)

PE可以通过使用WFE指令进入低功耗状态,依赖Event register的值,如果接收到WFE wake-up event,会离开低功耗状态。利用WFE指令可以减少spin lock机制的功耗;

WFE指令

  1. 如果PE的event  register值置位,执行WFE指令后,则会清空event register的值,并立即结束;
  2. 如果PE的event register值是空的,PE可以暂停执行并进入低功耗状态,保持直到PE接收到WFE wake-up event

WFE wake-up event in AArch64

  1. 多处理器系统中任何PE执行SEV指令;
  2. 没有被EDSCR.INTdis屏蔽的物理SError,IRQ,  FIQ;
  3. 在NS-EL1或EL0, 没有被EDSCR.INTdis屏蔽的虚拟SError,IRQ,  FIQ;
  4. 异步外部debug request debug event(如果允许halting);
  5. 由timer event stream发送的事件;
  6. 清除Global monitor的PE标记引起的事件;
  7. 自定义实现发送的事件。

注:并不是如上所有事件都会设置event register

  • Wait for Interrupt(WFI)

WFI

软件可以通过使用WFI命令让PE进入低功耗状态。PE进入低功耗状态后,如果接收到WFI wake-up event,会离开低功耗状态

WFI wake-up event

  1. PE接收到的物理SError,IRQ,  FIQ;
  2. Ns EL1或EL0,PE接受到的任何虚拟SError,IRQ,  FIQ;
  3. 异步的外部debug request debug事件;
  4. 一些自定义机制发送的事件

5. Self-hosted debug

  • debugger

Self-hosted debug:PE自身拥有debugger调试器,debugger调试器通过编程让PE产生debug异常

Externel debug:PE受外部debugger调试器的控制,debugger调试器通过编程让PE产生debug事件,这样可以让PE进入debug状态,在debug状态,PE被halted

  • Debug异常

Debug异常包括:

(1)Breakpoint Instruction exceptions

(2)Breakpoint exceptions.

(3)Watchpoint exceptions.

(4)Vector Catch exceptions.

(5) Software Step exceptions

要产生debug异常,需要满足2个条件:

(1)使能Debug异常;

(2)当前的EL和secure state使能debug异常

  • Debug mask bit

当目标异常级别是当前异常级别时PSTATE的D bit可以maskWatchpoint, Breakpoint, and Software Step exceptions

6. Performance Monitor Extension

PMU(Performance Monitor Unit)提供如下:

1. 一个64bit时钟计数器

2.一个自定义数目的32bit事件计数器,每个事件计数器记录某一事件的发生次数

7. Interprocessing

Interprocessing

用来描述AArch32与AArch64运行状态切换的术语

运行状态切换时机

运行状态只能在异常级别变化的时候才能进行切换,也即运行状态只能发生在捕获到异常时传递给高异常级别或从异常返回时返回到低异常级别

当捕获一个异常并切换到更高的异常级别,运行状态可以保持不变 或 32->64

当从一个异常返回切换到更低的异常级别,运行状态可以保持不此案或 64->32

8.  自定义实现对编程模型的影响

  • ARMv8三个自定义选项

(1)实现的异常级别的数目;

(2)哪些异常级别支持AArch32,哪些异常级别支持AArch64;

(3)SIMD和Float-point是否支持

  • 异常级别实现暗含的内容

1. 所有实现必须包含EL0和EL1;

2. EL2和EL3是可选的

3. 可选的组合方式有:

(1)EL0、EL1和EL2­­,只支持non-secure state;

(2)EL0、EL1和EL3,只支持secure state;

(3)EL0、EL1,只能实现一种安全状态,secure state或non-secure state;

(4)EL0、EL1、EL2、EL3均实现

  • 异常级别、运行状态、安全状态的组合方式

实现的异常级别

secure state

EL3

EL2

EL1

EL0

EL0/EL1/EL2/EL3

Sec&non-sec

AArch64/AArch32

AArch64/AArch32

AArch64/AArch32

AArch64/AArch32

AArch64

AArch64

AArch64/AArch32

AArch64/AArch32

AArch64

AArch64

AArch64

AArch64/AArch32

AArch64

AArch64

AArch64

AArch64

AArch32

AArch32

AArch32

AArch32

EL0/EL1 /EL3

Sec&non-sec

AArch64

\

AArch64/AArch32

AArch64/AArch32

AArch64

\

AArch64

AArch64/AArch32

AArch64

\

AArch64

AArch64

AArch32

\

AArch32

AArch32

EL0/EL1/EL2

Non-sec only

\

AArch64

AArch64/AArch32

AArch64/AArch32

\

AArch64

AArch64

AArch64

EL0/EL1

Sec or non-sec

\

\

AArch64

AArch64/AArch32

\

\

AArch64

AArch64

\

\

AArch32

AArch32

  • 五类经典组合图示(EL0/EL1/EL2/EL3都实现)

  • 如果没有实现全部4个异常级别的影响

(1)中断不会路由到这些异常级别;

(2)没有异常通过陷阱进入这些异常级别;

(3)所有从低异常级别通过系统调用切换到未实现的异常级别被作为未定义处理;

(4)不支持从未实现异常级别做地址转换

(5)任何要通过异常返回到未实现的异常级别被视为非法的异常返回

(6)任何和未实现异常级别相关的寄存器都被视为RES0(具有切换到低异常级别功能的相关寄存器除外)

9.参考文档

[1] DDI0487A_k_armv8_arm_iss10775.pdf

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

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

    1.前言 ARMV8系统级编程模型主要包括异常级别.运行状态.安全状态.同步异常.异步异常.DEBUG 本文主要对系统级编程模型做一个概要介绍 2. 异常级别 2.1 Exception level概 ...

  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. 【ARC065E】??

    Description 链接 Solution 问题其实就是从一个点出发,每次可以走与其曼哈顿距离恰好为一个常数\(d\)的点 显然不可能一一走完所有的边,这样复杂度下界至少是\(O(ans)\) 我 ...

  2. virtualenv 包管理

    创建虚拟环境: 1) pip install virtualenv 2) virtualenv  DemoEnv(虚拟环境名) 3) 此处windows和linux不同系统下的文件结构略有不同 lin ...

  3. Java -- JDBC 学习--数据库连接池

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...

  4. Azure Powershell script检测登陆并部署ARM Template

    本文简单提供了一个Azure powershell脚本,能实现如下功能 Azure (China)账户是否已经登陆了,如果没登陆,会提示你登陆. 要创建的资源组是否存在,存在的话不再创建,直接部署te ...

  5. Java_io体系之RandomAccessFile简介、走进源码及示例——20

    Java_io体系之RandomAccessFile简介.走进源码及示例——20 RandomAccessFile 1.       类功能简介: 文件随机访问流.关心几个特点: 1.他实现的接口不再 ...

  6. HDU 3605 Escape (网络流,最大流,位运算压缩)

    HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...

  7. CF 681

    我太水了...... 这是一场奇差无比的CF. A,看题意有困难,实际上还是很水的. B,枚举 1234567 和 123456 的个数,时间复杂度1e6以下 C,业界毒瘤模拟题.最TM坑的是还要输出 ...

  8. Java中由常量类引发的思考

    我们都知道,定义一个常量类是十分简单的.首先差固件一个类,然后类中声明一些public修饰的静态常量.没错就这么简单: 写好之后,在其他地方使用的时候,直接类名.属性名就可以使用了. 而LZ现在想的是 ...

  9. react与fetch

    JavaScript 中的 ajax 很早之前就有一个诟病----复杂业务下的 callback 嵌套的问题.promise 正是 js 中解决这一问题的钥匙. 接下来我们在react项目中应用到的f ...

  10. main方法或者junit单元测试报 类找不到异常

    MyEclipse10.7+Maven项目junit单元测试报找不到类异常,附正常编译后的输出设置   1 首先想到的是输出路径错误 一般不是maven工程的项目编译后的.class文件会在/weba ...