ARM64 Exception vectors

2024-02-17 13:58
文章标签 vectors arm64 exception

本文主要是介绍ARM64 Exception vectors,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ARM64 异常向量即 Exception vectors
参见源D1.10.2描述。
When the PE takes an exception to an Exception level that is using AArch64, execution is forced to an address that
is the exception vector for the exception. The exception vector exists in a vector table at the Exception level the
exception is taken to.
当PE发生异常在某一个异常级别时候,执行被强制跳转到一个地址即异常向量地址处。异常向量存在异常向量表中。每当异常发生时,自动跳转到异常向量中执行。
A vector table occupies a number of consecutive word-aligned addresses in memory, starting at the vector base
address.
一个异常向量一般位于内存中,并且这些异常向量有个基地址,叫做VBA。
Each Exception level has an associated Vector Base Address Register (VBAR), that defines the exception base
address for the table at that Exception level.
每个异常级别都有一个VBAR,即保存异常向量表基地址。通过此基地址,我们找到异常向量。
由于ARM64有四个异常级别,显然有四个VBAR。
 
对于每种异常级别来说,当异常发生时,PE能识别的异常种类如下:
— Synchronous exception.  同步异常
— SError. 系统error
— IRQ.   普通中断
— FIQ.   快速中断
当异常发生时,我们必须能获取一些状态信息,比如当前PE所处的EL。如EL1,EL0等。
根据异常级别我们需要给出使用的SP,以及其他一些寄存器等。
我们看下面一些数据描述:
Exception taken from                   Offset for exception type
                        Synchronous :IRQ or vIRQ :FIQ or vFIQ :SError or vSError
Current Exception level with SP_EL0     0x000   :0x080           :0x100        :    0x180
 
Current Exception level with SP_ELx, x>0   0x200 :0x280            : 0x300     :    0x380
 
Lower Exception level, 
where the implemented level
immediately lower than the target level   0x400 : 0x480           : 0x500       :0x580
is using AArch64
 
Lower Exception level, where the 
implemented level
immediately lower than the target level  0x600 : 0x680            : 0x700 :     0x780
is using AArch32.a
 
其实对于reset复位来说,ARM64定义了一个特殊的复位向量,这个值保存到RVBAR_ELx中,x是每种异常级别对应一个RVBAR寄存器。这样的话,通过
配置RVBAR_ELx寄存器,可以让复位时运行一个特殊的向量,或者干脆就让从某个地址开始运行。
 
从ARM64来看,复位reset后,处理器处于最高优先级级别。并且,复位后只能是处于最高异常级别,所以,如果实现了EL3,则复位一定跳转到EL3中。
这样从最高优先级开始运行。
这样的话,如果没有实现EL3,那就是EL2,或者EL1。但总不能EL0吧。
RVBAR_EL1:
  RVBAR_EL1 is a 64-bit register;
  Bits [63:0] 复位地址
     Reset Address. The IMPLEMENTATION DEFINED address that execution starts from after reset when
executing in 64-bit state. Bits[1:0] of this register are 00, as this address must be aligned, and the
address must be within the physical address size supported by the PE.
     四字节对其,并且物理可寻址。
To access the RVBAR_EL1:
MRS <Xt>, RVBAR_EL1 ; Read RVBAR_EL1 into Xt
 
与此类似的还有:
RVBAR_EL2, Reset Vector Base Address Register (if EL3 not implemented)
RVBAR_EL3, Reset Vector Base Address Register (if EL3 implemented)
 
 
根据以上信息,我们可以得到一些更有用的信息:
1. 每个处理器运行级别下异常发生时跳转是不一样的。EL0是以0x80为偏移。
2. 如果要实现异常处理中断函数,必须考虑每个异常基地址问题。
3. 硬件约束导致软件想扩展异常是不可能的。
根据上面信息,ARM64在Linux内核中定义的向量表如下:

.text

/* * Exception vectors. */

 .align 11 ENTRY(vectors) ventry el1_sync_invalid  // Synchronous EL1t ventry el1_irq_invalid   // IRQ EL1t ventry el1_fiq_invalid   // FIQ EL1t ventry el1_error_invalid  // Error EL1t

 ventry el1_sync   // Synchronous EL1h ventry el1_irq    // IRQ EL1h ventry el1_fiq    // FIQ EL1h ventry el1_error_invalid  // Error EL1h

 ventry el0_sync   // Synchronous 64-bit EL0 ventry el0_irq    // IRQ 64-bit EL0 ventry el0_fiq    // FIQ 64-bit EL0 ventry el0_error_invalid  // Error 64-bit EL0

#ifdef CONFIG_COMPAT ventry el0_sync_compat   // Synchronous 32-bit EL0 ventry el0_irq_compat   // IRQ 32-bit EL0 ventry el0_fiq_compat   // FIQ 32-bit EL0 ventry el0_error_invalid_compat // Error 32-bit EL0 #else ventry el0_sync_invalid  // Synchronous 32-bit EL0 ventry el0_irq_invalid   // IRQ 32-bit EL0 ventry el0_fiq_invalid   // FIQ 32-bit EL0 ventry el0_error_invalid  // Error 32-bit EL0 #endif END(vectors)

可以看到,向量表基地址是2^11即低11位为0,说明按照2048字节对齐。
每个向量采用的对齐方式,这里ventry实现如下:
/*
* Vector entry
*/
.macro ventry label
.align 7
b \label
.endm
可以看到,这样的话,每个向量是2^7即128字节对齐,低7位为0.
这个跟上面硬件约束0x000:0x080:0x100:0x180向对应。
并且可以发现,不同PE级别的异常异常向量地址是连续增加的,这样便于软件设计。
这样的话,vector也就是一个数组。每个元素按照0x80对齐。
所以,这个vectors中每个元素不能乱动,打乱顺序。
并且,对于硬件给出的偏移地址来说,这些地址都是基于同一个VBA来说的,这样的话,每个
VBAR.ELx应该是同一个值。这又简化了软件设计,因为我们只需要把一个VBA设置到不同的
VBAR.el0,VBAR.el1,,VBAR.el2,,VBAR.el3中即可。
如果是EL0中发生异常,那么就偏移小些,前面四个即可。如果EL1则有简单偏移。
 
更进一步我们可以看到,不管哪种异常,reset导致的是最高优先级异常。至于reset从哪里运行,则由RVBAR控制。可以了解平台实现。
 
 
 
 
 
  
 
 
 

这篇关于ARM64 Exception vectors的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717979

相关文章

myEclipse失去焦点时报错Unhandled event loop exception的解决方案

一句话:百度杀毒惹的祸。。。。果断卸载后问题解决。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArra

这个错误说的是一个不可变数组负值给了一个可变的数组。有可能你前面定义的数组是一个可变数组,但是在你其他方法里面用他的时候,他就是一个不可变数组,因为在可变数组拿到别的地方用的时候,他会默认为不可变的,可能这只是一个类里面你只是简单的声明了他吧,并没有进行对他初始化,或者分配什么内存,所以他只是一个不可变的数组,当你在其他地方用他的时候,他就默认为不可变的数组,他可能因为你的没分配内存,而变回不可变

Exception in plugin Android ButterKnife zelezny

所在页面的布局文件命名id有问题,不能有两个下划线,,如tv__name

深入拆解 Java 虚拟机 】Exception异常笔记

【深入拆解 Java 虚拟机 】Exception异常笔记 try-with-resource语法糖finally try-with-resource语法糖 try后对象的close方法都会被运行。 package com.exception.demo;public class Foo implements AutoCloseable {private final Strin

《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统,而作为基础组件中的consul 针对不同的客户环境需要多次部署集群,作为一个运维工程师,提升工作效率也是工作中的重要一环。所以我觉得有必要针对 x86_64 + ARM64 CPU架构cons

Exception in thread main java.lang.NoClassDefFoundError: org/apache/juli/l

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/juli/l MyEclipse整合免安装版的Tomcat7,------> 看图吧 最后这个就可以在myeclipse里,使用你的tomcat,而不是用.bat打开!!!!

本地电脑交叉编译ffmpeg 到 windows on arm64

本地电脑交叉编译ffmpeg 到 windows on arm64 我这里有编译好的win on arm 的 ffmpeg : https://github.com/wmx-github/ffmpeg-wos-arm64-build 使用 llvm-mingw 工具链 https://github.com/mstorsjo/llvm-mingw/releases 前缀 aarch64-w64-

Java中Exception知识点

Exception 不论代码块是否处于try或者catch块中,只要执行该代码块时出现异常,系统都会自动生成一个异常对象try块里声明的变量是局部变量try和catch块后的花括号不可省略捕获多种异常时,多种异常类型之间用竖线|隔开捕获多种异常时,异常变量有隐式的final修饰,因此不能对异常变量进行赋值如果在异常处理代码中使用System.exit(1)退出虚拟机,则finally块不会执行除

chapter12-异常(Exception)——(作业)——day15

目录 457-异常课后作业 458-异常课后作业2 457-异常课后作业 package chapter12.exception.homework;/*** @author LuHan* @version 1.0*/public class Homework01 {public static void main(String[] args) {try {if(args.l

异常(Exception)JAVA072-076

来源:http://www.bjsxt.com/ 1、S01E072_01异常(Exception)机制 (1)JAVA是采用面向对象的方式来处理异常的。处理过程: 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的