ARM向量表
| 向量表 | 作用 | 说明 |
|---|---|---|
| RVBAR | 在 AArch64 中,重置向量不再是异常向量表的一部分。 有复位向量的专用配置输入引脚和寄存器。 | 在 AArch64 中,处理器从 IMPLEMENTAION‑DEFINED 地址开始执行, 该地址由硬件输入引 脚RVBARADDR定义, 可以通过 RVBAR_EL3 寄存器读取。 您必须在此地址放置引导代码。 |
| VBAR_EL1 | AArch64 模式下的向量表包含 16 个条目, 每个 条目大小为 128B,最多包含 32 条指令。 | |
| VBAR_EL2 | AArch64 模式下的向量表包含 16 个条目, 每个 条目大小为 128B,最多包含 32 条指令。 | |
| VBAR_EL3 | AArch64 模式下的向量表包含 16 个条目, 每个 条目大小为 128B,最多包含 32 条指令。 | |
向量表必须放置在 2KB 对⻬的地址。
通过初始化 VBAR_ELn 寄存器来指定地址。
向量表结构
下图显示了向量表的结构。

初始化向量表
展示了如何在复位后初始化 VBAR_EL3、VBAR_EL2 和 VBAR_EL1。

向量表
显示了 AArch64 中异常的典型向量表。
更新SPSR_ELn(其中n是获取异常的Exception级别),以存储在异常结束时正确返回所需的PSTATE信息。
PSTATE被更新以反映新的处理器状态(这可能意味着抛出Exception级别,也可能保持不变)。
在异常末尾要返回的地址存储在ELR_ELn中。寄存器名称上的_ELn后缀表示在不同的Exception级别上存在这些寄存器的多个副本。例如,这意味着SPSR_EL1与SPSR_EL2是不同的物理寄存器。

而我们在异常处理中,又会调用下一级的函数来干活,图形也就如下所示:

当异常处理完成后,processor由高级别返回低级别时,使用ERET指令返回
每个异常级别都有自己的一套向量表,这些表的基地址分别写在VBAR_EL3, VBAR_EL2 and VBAR_EL1系统寄存器中. 向量表中的每个条目有16 instructions long(0x80字节)(在ARMv7-A和AArch32中,每个条目只有4个字节)。这意味着在AArch64中顶层处理程序可以直接在向量中,而不是跳转到其它地址处执行.
VBAR_ELn执行的每个table中,定义了16个entries,具体走哪一个entry是由下面几个因素决定的: • The type of exception (SError, FIQ, IRQ, or Synchronous) 异常类型(SError, FIQ, IRQ,或Synchronous) • If the exception is being taken at the same Exception level, the stack pointer to be used (SP0 or SPn).如果异常是在相同的exception级别获取的,则使用的堆栈指针(SP0或SPn)。
• If the exception is being taken at a lower Exception level, the Execution state of the next lower level (AArch64 or AArch32).如果在较低的exception级别获取异常,则下一个较低级别(AArch64或AArch32)的执行状态。
一张经典的向量表,如下所示:

举一个超级简单的例子: kernel code执行在EL1,这时来了一个IRQ,该中断没有配置到hypervisor和secure environment中,所以它的处理仅仅是在kernel中完成,程序跳转到VBAR_EL1+0x280,栈使用sp_el1(将SPSel设置程sp_el1)
异常返回
软件必须告诉处理器何时从异常中返回。这是通过代码完成的使用ERET指令。这将从SPSR_ELn中恢复异常前的PSTATE并返回通过从ELR_ELn恢复PC,将程序执行返回到原始位置。 在A64指令集中,使用寄存器X30(与RET指令一起)返回子例程
ELR_ELn寄存器用于存储来自异常的返回地址。它的价值寄存器是自动写入的入口异常,并被写入到PC作为其中之一执行用于从异常中返回的ERET指令的效果。
除了SPSR和ELR寄存器之外,每个异常级别都有自己专用的堆栈指针登记。它们是SP_EL0、SP_EL1、SP_EL2和SP_EL3。这些寄存器用来指向专用的栈。堆栈可以,例如,用来存储寄存器被损坏异常处理程序,使它们可以在返回之前恢复到原来的值原始代码
处理程序代码可以从使用SP_ELn切换到使用SP_EL0。例如,SP_EL1可能指向存储小堆栈的内存块,内核可以始终保证该小堆栈是有效的。SP_EL0可能指向较大的内核任务堆栈. 但不能保证不发生溢出。这切换通过写入SPSel寄存器来控制。
PSTATE


当前processor的状态保存在PSTATE,当异常到来时,PSTATE的值会自动保存在SPSR中。 aarch64中由三个SPSR : SPSR_EL3, SPSR_EL2, and SPSR_EL1 例如,如果发生了一个异常target到EL1,那么当前处理器的状态会自动保存到SPSR_EL1中;

中断的处理流程


同步中断触发方式

异常后的处理
异常综合寄存器(ESR_ELn)和故障地址寄存器(FAR_ELn)是为异常处理程序提供关于同EL步异常原因的信息。
ESR_ELn保存了异常原因,而FAR_ELn保存了所有同步指令和数据中止以及对齐故障的故障虚拟地址。
异常链接寄存器(ELR_ELn)也保存了导致中止数据访问的指令的地址(对于数据中止)。这些在内存故障后被更新,但在其他情况下也会被设置,例如,通过分支到错位的地址。如果一个异常从AArch32中的异常级别进入使用AArch64的异常级别,并且该异常写入了与目标异常级别相关的故障地址寄存器,FAR_ELn的前32位都被设置为0。
异常综合寄存器,ESR_ELn,包含了允许异常处理程序确定异常原因的信息。它只对同步异常和SError进行更新。它不对IRQ或FIQ进行更新,因为这些中断处理程序通常从通用中断控制器(GIC)的寄存器中获取状态信息。

Bit[31:26](ESR_ELn.EC)表示异常类别,它使处理程序能够区分各种可能的异常原因(如未分配的指令,从MCR或MRC到CP15的异常,FP操作的异常,SVC、HVC或SMC的执行,数据中止,以及对齐异常)。例如,EC=101111是一个SError中断。
Bit[25](ESR_ELn.IL)表示被困指令的长度(16位指令为0,32位指令为1),并对某些异常类别进行设置。
Bit[24:0] (ESR_ELn.ISS)构成指令特定综合症(ISS)字段,包含该异常类型的特定信息。例如,当一个系统调用指令(SVC、HVC或SMC)被执行时,该字段包含与操作码相关的即时值,如SVC为0x123456。
相关文章:
ARM向量表
向量表作用说明RVBAR在 AArch64 中,重置向量不再是异常向量表的一部分。 有复位向量的专用配置输入引脚和寄存器。在 AArch64 中,处理器从 IMPLEMENTAION‑DEFINED 地址开始执行, 该地址由硬件输入引 脚RVBARADDR定义, 可以通过 R…...
leetcode刷题日记——除自身以外数组的乘积
[ 题目描述 ]: [ 思路 ]: 题目要求获取数组中每个元素除自己以外的各元素的乘积最简单的方法就是算出数组所有元素的乘积,然后除以自身,即可得到除自身外各元素的乘积 但要考虑到其自身为0的情况,即当期自身为0时&am…...
【信奥一本通提高篇】基础算法之贪心算法
原文 https://bbs.fmcraft.top/blog/index.php/archives/22/ 贪心算法 概述 近年来的信息学竞赛试题,经常出现求一个问题的可行解或最优解的题目。这类问题就是我们通常所说的最优化问题。贪心算法是求解这类问题的一种常用算法。在众多的算法中,贪心…...
PyQt6实例_批量下载pdf工具_批量pdf网址获取
目录 前置: 步骤: step one 安装包 step two 获取股票代码 step three 敲代码,实现 step four 网址转pdf网址 视频 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本节讲…...
KMeans算法案例
KMeans算法案例 案例介绍 已知:客户性别、年龄、年收入、消费指数 需求:对客户进行分析,找到业务突破口,寻找黄金客户 数据集共包含顾客的数据, 数据共有 4 个特征, 数据共有 200 条。接下来,使用聚类算法对具有相似…...
IDApro直接 debug STM32 MCU
使用IDA pro 逆向分析muc 固件的时候, 难免要进行一些动态的debug,来进一步搞清楚一些内存的数据、算法等,这时候使用远程debug 的方式直接在mcu上进行debug 最合适不过了。 不过有个前提条件就是一般来说有的mcu 会被运行中的代码屏蔽 RDP、…...
六十天前端强化训练之第三十六天之E2E测试(Cypress)大师级完整指南
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. E2E测试核心概念 2. Cypress框架特性 3. 工作原理 4. 测试金字塔定位 二、核心代码示例:用户登录全流程测试 三、实现效果展示 四、学习要…...
创建和管理Pod
创建和管理Pod 文章目录 创建和管理Pod[toc]一、什么是Pod1.Pod 的核心定义2.Pod 的组成与结构3.Pod 的生命周期4.Pod 的使用场景5.高级特性 二、Pod与容器1. 为什么使用 Pod 作为 Kubernetes 的最小部署单元?2. 单一容器 Pod3. 多容器 Pod4. 初始化容器(…...
20250330-傅里叶级数专题之离散傅里叶变换(5/6)
5. 傅里叶级数专题之离散傅里叶变换 推荐视频: 工科生以最快的速度理解离散傅立叶变换(DFT) 哔哩哔哩 20250328-傅里叶级数专题之数学基础(0/6)-CSDN博客20250330-傅里叶级数专题之傅里叶级数(1/6)-CSDN博客20250330-傅里叶级数专题之傅里叶变换(2/6)-CSDN博客20250330-傅里叶…...
Android设计模式之代理模式
一、定义: 为其他对象提供一种代理以控制对这个对象的访问。 二、角色组成: Subject抽象主题:声明真是主题与代理的共同接口方法,可以是一个抽象类或接口。 RealSubject真实主题:定义了代理表示的真实对象,…...
《非暴力沟通》第十二章 “重获生活的热情” 总结
《非暴力沟通》第十二章 “重获生活的热情” 的核心总结: 本章将非暴力沟通的核心理念延伸至生命意义的探索,提出通过觉察与满足内心深处的需要,打破“义务性生存”的桎梏,让生活回归由衷的喜悦与创造。作者强调,当行动…...
3.29:数据结构-绪论线性表-上
一、时间复杂度 1、ADT 2、定义法计算时间复杂度:统计核心语句的总执行次数 (1)例题1,与2022年的真题对比着写 此题关键在于求和公式的转化,类型为:线性循环嵌套非线性循环 2022年那道题如果考场上实在脑…...
Java项目如何打jar包?
1.java把项目打包成jar 步骤一、IDEA -> File -> Project Structure -> Artifacts -> -> JAR -> From moduls with dependencies... -> 选择 Module 和 Main Class -> 选择 JAR files from libraries JAR files from libraries 解释 extract to the t…...
【奶茶经济学的符号暴力本质】
金字塔式七层分析框架:奶茶经济学的符号暴力本质 第一层:缺货的戏剧经济学 结论:13.7%缺货率是精密计算的神经钩 机制:喜茶新品首日仅投放86.3%门店,制造"限量焦虑"激活前额叶决策区矛盾验证: …...
Python PDF解析利器:pdfplumber | AI应用开发
Python PDF解析利器:pdfplumber全面指南 1. 简介与安装 1.1 pdfplumber概述 pdfplumber是一个Python库,专门用于从PDF文件中提取文本、表格和其他信息。相比其他PDF处理库,pdfplumber提供了更直观的API和更精确的文本定位能力。 主要特点…...
大模型架构记录13【hr agent】
一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…...
conda 清除 tarballs 减少磁盘占用 、 conda rename 重命名环境、conda create -n qwen --clone 当前环境
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 conda clean --tarballsconda rename 重命名环境conda create -n qwen --clone …...
Java基础-24-继承-认识继承-权限修饰符-继承的特点
在Java中,继承是面向对象编程(OOP)的一个重要特性。通过继承,一个类可以复用另一个类的属性和方法,从而实现代码的重用性和扩展性。以下是关于继承的一些关键点,包括权限修饰符和继承的特点。 1. 继承的基本…...
Bootstrap 表格:高效布局与动态交互的实践指南
Bootstrap 表格:高效布局与动态交互的实践指南 引言 Bootstrap 是一个流行的前端框架,它为开发者提供了丰富的组件和工具,使得构建响应式、美观且功能丰富的网页变得更加简单。表格是网页中常见的元素,用于展示数据。Bootstrap 提供了强大的表格组件,可以帮助开发者轻松…...
pycharm相对路径引用方法
用于打字不方便,以下直接手写放图,直观理解...
新能源智慧灯杆的智能照明系统如何实现节能?
叁仟新能源智慧灯杆的智能照明系统可通过以下多种方式实现节能: 智能调光控制 光传感器技术:在灯杆上安装光传感器,实时监测周围环境的光照强度。当环境光线充足时,如白天或有其他强光源时,智能照明系统会自动降低路…...
Jenkins教程(自动化部署)
Jenkins教程(自动化部署) 1. Jenkins是什么? Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行&…...
行业智能体大爆发,分布式智能云有解
Manus的一夜爆红,在全球范围内引爆关于AI智能体的讨论。 与过去一般的AI助手不同,智能体(AI Agent)并非只是被动响应,而是主动感知、决策并执行的应用。Gartner预测,到2028年,15%的日常工作决策…...
日语Learn,英语再认识(5)
This is a dedicated function — it exists solely to solve this case. This is a dedicated function. It’s a dedicated method for solving this case. 其他备选词(但没dedicated精准): special → 含糊,有时只是“特别”…...
【区块链安全 | 第十四篇】类型之值类型(一)
文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址(Address)类型转换地址的成员balance 和 transfersendcall,delegatecall 和 staticcallcode 和 codehash 合约类型(Contract Types)固定大小字节数组&…...
音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流
一、通过FFmpeg命令使用UDP发送TS流 通过以下FFmpeg命令可以将一个mp4文件转换为ts封装,并基于UDP发送(推流): ffmpeg.exe -re -i input.mp4 -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:1234 其中: “in…...
Error in torch with streamlit
报错信息: This is the error which is a conflict between torch and streamlit: Examining the path of torch.classes raised: Tried to instantiate class path.path’, but it does not exist! Ensure that it is registered via torch::class Steps to reproduce: py…...
网络基础知识介绍
目录 一、计算机网络背景与发展 1.1 计算机网络的背景 编辑1.2 计算机网络的发展历程 二、网络协议 2.1 认识网络协议 2.3 协议分层 2.4 OSI七层模型 2.5 TCP/IP 五层(或四层)模型 三、网络传输基本流程 3.1 网络传输流…...
MIPS-32架构(寄存器堆,指令系统,运算器)
文章目录 0 Preview:寄存器32通用0 $zero1 $at2—3 \$v0-$v14—7 \$a0-$a38—15 \$t0-$t716—23 \$s0-$s724—25 \$t8-$t926—27 \$k0-$k128 $gp29 $sp30 $fp 指令系统运算存储器 0 Preview: MIPS架构有32位版本和64位版本,本文介绍32位版本 寄存器 正如笔者曾说…...
zip和tar.gz
本文来源: 在压缩文件格式选择上,zip和tar.gz有本质差异,主要体现在以下五个方面: 一、压缩机制不同 tar.gz是"两步走"方案:先用tar工具将多个文件/目录打包为单个未压缩的归档文件(保留权限…...
