Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ARM深入理解-5.2-通往内核的大门(异常向量表_AArch64)

ARM深入理解-5.2-通往内核的大门(异常向量表_AArch64)

作者头像
Tupelo
发布于 2022-08-15 08:34:04
发布于 2022-08-15 08:34:04
2.5K00
代码可运行
举报
文章被收录于专栏:嵌入式ARM和Linux嵌入式ARM和Linux
运行总次数:0
代码可运行
  • 1 建立向量表
  • 2 建立向量表的示例
  • 3 使能中断

异常初始化的过程:

  1. 建立异常向量表
  2. 异常路由和屏蔽配置

1 建立向量表

AArch64中,reset不再是异常向量表的一部分,它有专用的配置输入管脚和寄存器。其余的异常存储在异常向量表中。

1.1 Reset向量

AArch64中,处理器的开始执行位置是跟处理器的实现有关的,由硬件输入管脚RVBARADDR控制,可以在RVBAR_EL3中读取该地址。启动(boot)代码应该放在该地址处。

1.2 向量表

每个异常级别都有专门的异常向量表,分别存储在下面的寄存器中:

  • VBAR_EL3
  • VBAR_EL2
  • VBAR_EL1

AArch64的向量表与AArch32的不同。每个向量占用128字节,最多包含32个指令。向量表按照2K大小对齐。初始化的时候,将向量表的基地址写入到VBAR_ELx寄存器中即可。

关于向量表更多的细节,可以参考ARM官方文档ARM® Architecture Reference Manual ARMv8, for ARMv8-A architecture规范中异常向量表部分。

下表展示了向量表的组成:

地址

异常类型

描述

VBAR_Eln+0x000

Synchronous

异常EL与异常前的EL相同,且使用SP_EL0

0x080

IRQ/vIRQ

0x100

FIQ/vFIQ

0x180

Serror/vSError

0x200

Synchronous

异常EL与异常前的EL相同, 且使用SP_ELx

0x280

IRQ/vIRQ

0x300

FIQ/vFIQ

0x380

Serror/vSError

0x400

Synchronous

异常前的EL比异常EL低,异常前系统模式为aarch64

0x480

IRQ/vIRQ

0x500

FIQ/vFIQ

0x580

Serror/vSError

0x600

Synchronous

异常前的EL比异常EL低,异常前系统模式为aarch32

0x680

IRQ/vIRQ

0x700

FIQ/vFIQ

0x780

Serror/vSError

2 建立向量表的示例

示例1:展示了reset之后,如何初始化向量表基地址寄存器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LDR X1, = vector_table_el3
MSR VBAR_EL3, X1
LDR X1, = vector_table_el2
MSR VBAR_EL2, X1
LDR X1, = vector_table_el1
MSR VBAR_EL1, X1

示例2:展示了AArch64状态下一个典型的异常向量表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.balign 0x800       // 向量表2k(2048字节)大小对齐
Vector_table_el3:
curr_el_sp0_sync:   // synchronous处理程序
                    // 来自当前EL的异常,使用SP0
.balign 0x80
curr_el_sp0_irq:    // IRQ中断处理程序
                    // 来自当前EL的异常,使用SP0
.balign 0x80
curr_el_sp0_fiq:    // FIQ快速中断处理程序
                    // 来自当前EL的异常,使用SP0
.balign 0x80
curr_el_sp0_serror: // Serror系统错误的处理程序
                    // 来自当前EL的异常,使用SP0

.balign 0x80
curr_el_spx_sync:   // synchronous处理程序
                    // 来自当前EL的异常,使用SPx
.balign 0x80
curr_el_spx_irq:    // IRQ中断处理程序
                    // 来自当前EL的异常,使用SPx
.balign 0x80
curr_el_spx_fiq:    // FIQ快速中断处理程序
                    // 来自当前EL的异常,使用SPx
.balign 0x80
curr_el_spx_serror: // Serror系统错误的处理程序
                    // 来自当前EL的异常,使用SPx

.balign 0x80
lower_el_aarch64_sync:  // synchronous处理程序
                        // 来自低EL且处于AArch64的异常
.balign 0x80
lower_el_aarch64_irq:   // IRQ中断处理程序
                        // 来自低EL且处于AArch64的异常
.balign 0x80
lower_el_aarch64_fiq:   // FIQ快速中断处理程序
                        // 来自低EL且处于AArch64的异常
.balign 0x80
lower_el_aarch64_serror:// Serror系统错误的处理程序
                        // 来自低EL且处于AArch64的异常

.balign 0x80
lower_el_aarch32_sync:  // synchronous处理程序
                        // 来自低EL且处于AArch32的异常
.balign 0x80
lower_el_aarch32_irq:   // IRQ中断处理程序
                        // 来自低EL且处于AArch32的异常
.balign 0x80
lower_el_aarch32_fiq:   // FIQ快速中断处理程序
                        // 来自低EL且处于AArch32的异常
.balign 0x80
lower_el_aarch32_serror:// Serror系统错误的处理程序
                        // 来自低EL且处于AArch32的异常

3 使能中断

异常分为异步和同步异常,异步异常通俗的讲就是我们常规意义上的中断,同步异常就是我们常规意义上的异常

中断包括SErrorIRQFIQ。这些中断在reset之后,默认是屏蔽掉的。因此,如果想要获取SErrorIRQFIQ,必须设置路由规则,并清除掉屏蔽。

另外,想要使能中断,还应该初始化中断控制器,使其发送中断请求给处理器,但这不是本文的范围。

3.1 中断路由规则

中断的路由规则,决定了中断发生时,哪个异常级别处理该中断。如果要路由到EL3,需要设置SCR_EL3.{EA,IRQ,FIQ}

示例3:展示了如何将SErrorIRQFIQ路由到EL3异常级别的设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MRS X0, SCR_EL3
ORR X0, X0, #(1<<3) // 设置EA位
ORR X0, X0, #(1<<1) // 设置IRQ位
ORR X0, X0, #(1<<2) // 设置FIQ位
MSR SCR_EL3, X0

想把中断路由到EL2而不是EL3,必须设置HCR_EL2.{AMO,FMO,IMO}并清除SCR_EL3.{EA,IRQ,FIQ}

示例4:展示如何将SErrorIRQFIQ路由到EL2异常级别的设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MRS X0, HCR_EL2
ORR X0, X0, #(1<<5) // 设置AMO位
ORR X0, X0, #(1<<4) // 设置IMO位
ORR X0, X0, #(1<<3) // 设置FMO位
MSR HCR_EL2, X0

如果中断没有设置路由到EL3或EL2,默认路由到EL1。

3.2 中断的掩码

中断是否被屏蔽,取决于下面的因素:

  • 中断被路由到的目标异常级别
  • PSTATE.{A,I,F}的值

目标异常级别低于当前异常级别,不管PSTATE.{A,I,F}的值是多少,该中断都被屏蔽(隐含规则);

目标异常级别等于当前异常级别,如果PSTATE.{A,I,F}设置为1,则异常被屏蔽;

目标异常级别高于当前异常级别,且目标异常级别是EL2或EL3,不管PSTATE.{A,I,F}的值是多少,异常都会被接收;

目标异常级别高于当前异常级别,且目标异常级别是EL1, 如果PSTATE.{A,I,F}设置为1,则异常被屏蔽;

示例5:展示如何在PSTATE中清除SErrorIRQFIQ的掩码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使能SError, IRQ和FIQ
MSR DAIFClr, #0x7

更多关于使能中断的细节,查看ARM® Architecture Reference Manual ARMv8, for ARMv8-A architecture规范中的异步异常的类型、路由、屏蔽和优先级部分。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式ARM和Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
sparc v8架构的异常处理
对于研究芯片处理器架构,是件非常有意思的事情。刚开始的接触时候也是一头雾水,不知所云,看着厚厚的架构手册,不知道从哪里下手。比如《ARMv8-A Architecture reference manual》一共是6666页纯英文文档,如果没真正看过,估计一上来就开始打退堂鼓了。后面接触的芯片的体系架构多了,自然也明白很多东西其实是有一些共性的,虽然架构不同,但是指令集、流水线以及系统运行的模式也能猜测7到8分准确。本文主要介绍一下sparc v8体系架构下的异常处理,同时简单的对比一下armv8体系架构的异常。
bigmagic
2020/09/10
1K0
sparc v8架构的异常处理
ARM深入理解-5.3-通往内核的大门(异常向量表_AArch32)
在ARMv8架构的AArch32状态下启动处理器的时候,SCTLR.V决定了reset向量的位置,这与AArch64状态下是不同的(AArch64状态下,reset不再是向量表的一部分):
Tupelo
2022/08/15
7570
aarch64系统级体系架构之异常级别
系统的异常级别对于arm芯片来说非常的重要,对于操作系统层面上来说,理解芯片的体系架构,将很容易的进入状态,随心所欲的去玩转芯片,对于做应用来说,熟悉芯片的体系架构,可以解决非常棘手的问题,比如系统的安全还有就是实时性响应问题。比如我们的手机指纹加密数据,实际上是在安全模式下的,此时对于运行在非安全模式下的操作系统,其实是获取不到指纹的数据的,只是处理安全模式下发送过来的结果,类似的还有支付安全。
bigmagic
2020/05/07
1.9K0
aarch64指令集_AArch64应用程序级编程模型
根据实现选择,体系结构支持多级执行特权,由从EL0到EL3的不同异常级别表示。EL0对应于最低的特权级别,通常被描述为无特权。应用层程序员模型是在EL0上执行软件的程序员模型。
全栈程序员站长
2022/11/03
8250
2. uboot 2021.07移植记录--分析start.S
lds文件可以看出,程序入口函数为_start,下面从_start 开始分析start.s文件中有用的部分。
锦小年
2022/01/10
6110
ARM64 SMP多核启动(下)- PSCI
上面说了pin-table的多核启动方式,看似很繁琐,实际上并不复杂,无外乎主处理器唤醒从处理器到指定地址上去执行指令,说他简单是相对于功能来说的,因为他只是实现了从处理器的启动,仅此而已,所以,现在社区几乎很少使用spin-table这种方式,取而代之的是psci,他不仅可以启动从处理器,还可以关闭,挂起等其他核操作,现在基本上arm64平台上使用多核启动方式都是psci。下面我们来揭开他神秘的面纱,其实理解了spin-table的启动方式,psci并不难(说白了也是需要主处理器给从处理器一个启动地址,然后从处理器从这个地址执行指令,实际上比这要复杂的多)。
用户7244416
2021/08/06
3K0
Hypervisor Necromancy;恢复内核保护器(1)
--[ 0 - 简介 直到最近,为了在运行时攻击者破坏整个系统 发现并利用内核漏洞。这使他们能够执行 各种动作;在内核上下文中执行恶意代码, 修改内核数据结构以提升权限,访问受保护的数据, 等已经引入了各种缓解措施来防止此类 动作和管理程序也被使用,除了他们的 为实现这一目标而使用传统的虚拟化支持。在里面 ARM 虚拟化促进了 Android 生态系统 扩展,允许供应商/OEM 实施自己的保护 功能/逻辑。 另一方面,Android 设备已普遍成为主要的 PITA 由于引入的 OEM 和供应商种类繁多,
franket
2022/02/09
3K0
ARMv8 异常处理简介
内核稳定性问题复杂多样,最常见的莫过于“kernel panic”,意为“内核恐慌,不知所措”。这种情况下系统自然无法正常运转,只能自我结束生命,留下死亡信息。诸如:
刘盼
2020/09/10
3.4K0
ARMv8 异常处理简介
海思uboot启动流程详细分析(一)
首先我们可以在u-boot.lds中看到ENTRY(_start),即指定了入口_start,_start也就是整个start.S的最开始;
233333
2019/05/25
3.1K0
linux aarch64启动不了,引导AArch64 Linux
这篇文章基于Russell King所写的《the ARM booting document》,并与AArch64 Linux kernel的所有公开版本相关。
全栈程序员站长
2022/11/03
5.1K0
中断处理流程梳理
在之前的ARMv8-A的异常文章中提到,ARMv8-A将中断也当做一种异常,中断分为IRQ和FIQ
DragonKingZhu
2021/12/07
1.3K0
中断处理流程梳理
Hypervisor Necromancy;恢复内核保护器(2)
在我们的最小实现中,我们不会启用 IRQ 或 FIQ。 此外,我们不会实施任何 EL0 应用程序或执行 `svc` 从我们的内核调用,结果所有 VBAR_EL1 条目都设置为 导致系统挂起(无限循环)。同样,对于 EL3,我们只期望 来自较低级别 AArch64 模式的同步异常。结果只有 相应的“vectors_el3”条目(+0x400)已设置,所有其他条目都会导致 系统挂起与 EL1 向量一样。异常处理程序保存当前 处理器状态(通用和状态寄存器)并调用 第二阶段处理程序。我们遵循`smc`调用约定[05
franket
2022/02/09
2.6K0
char c=168_char16_t
X0~30 for 64 bit W0~30 for 32 bit Also available V0~31,SIMD floating point registers
全栈程序员站长
2022/11/07
7990
Zircon - Fuchsia 内核分析 - 启动(平台初始化)
Zircon 是 Google 新操作系统 Fuchsia 的内核,基于 LK - Little Kernel 演变而来。而 Little Kernel 前面一直作为 Android 系统的 Bootloader 的核心而存在。Zircon 在此基础上增加了 MMU,System Call 等功能。
刘盼
2019/05/08
2.3K0
Zircon - Fuchsia 内核分析 - 启动(平台初始化)
ARMv8 寄存器
本文主要介绍 Armv8/v9 指令集架构中常用部分,详细的还是要看 Arm architecture reference manual.
233333
2024/03/17
3010
ARMv8 寄存器
ARMv8 Linux内核异常处理过程分析「建议收藏」
老样子,为了赚点积分下载其它人的文件,下载以上资料须要资源分2分。 假设没有积分请留言全部文档,留下邮箱就可以。
全栈程序员站长
2022/07/07
2.3K0
ARMv8 Linux内核异常处理过程分析「建议收藏」
10_异常与中断
本章处理器架构的内容主要来自于ARM® Cortex™-A Series Programmer’s Guide version4.0。
韦东山
2022/05/05
1.5K0
10_异常与中断
嵌入式:ARM中断系统设计全解
ARM920T能处理有8个异常,他们分别是:Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),Reserved,IRQ,FIQ ,它们的矢量表是:
timerring
2023/01/04
1K0
嵌入式:ARM中断系统设计全解
海思uboot启动流程详细分析(二)
从start_armboot开始,在startup.c中有包含#include <config.h>
233333
2019/05/25
2.7K1
ARMv8-A Exception Handling
当设备正在愉快的执行时候,此时发生了一个异常,处理器就必须暂停当前的任务,转而去处理发生的异常。当异常处理完毕后,处理就会发回到被打断的程序继续执行。
DragonKingZhu
2020/04/09
2.4K0
相关推荐
sparc v8架构的异常处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验