ARM64的启动过程之(六):异常向量表的设定

一、前言

本文主要描述了4.1.10内核初始化过程中如何初始化异常向量表。当然,首先需要准备一些异常的基础知识,这主要在第二章,如果你非常熟悉ARM64的异常,那么可以忽略这个章节。 第三章描述了ARM64上各种形形色色的异常,第四章描述了ARM64上硬件提供的协助,最后一章描述了代码过程。

为了简化,本文对所描述的异常进行了限制:

1、所有的exception level的运行状态都是AArch64,不考虑异常发生在AArch32 excution state的时候

2、不考虑支持security extension,也就是说EL3状态的异常处理也不在本文描述

3、不考虑virtualization的支持,也就是说EL2的异常处理不会在本文描述

一句话总结,本文主要描述EL0和EL1这两个exception level下的异常向量表的设定。

 

二、 异常(exception)的基础知识

1、什么是异常(exception)?

对于ARM64而言,exception是指cpu的某些异常状态或者一些系统的事件(可能来自外部,也可能来自内部),这些状态或者事件可以导致cpu去执行一些预先设定的,具有更高执行权利的软件(也叫exception handler)。执行exception handler可以进行异常的处理,从而让系统平滑的运行。exception handler执行完毕之后,需要返回发生异常的现场。上面这段话非常的拗口,但是不要紧,当进入细节的时候一切会慢慢清晰起来,下面我们逐一介绍各种异常:中断(interrupt),abort,reset,异常指令……

2、exception level

上一节中,我们在定义异常的时候说道:一旦异常发生,系统(包括硬件和软件)将切换到具有更高执行权利的状态,对于cpu而言,就是exception level了,ARM64最大支持EL0~EL3四个exception level,EL0的execution privilege最低,EL3的execution privilege最高。当发生异常的时候,系统的exception会迁移到更高的exception level或者维持不变,但是绝不会降低。此外,不会有任何的异常会去到EL0。

对比是一个不错的学习方法,我们先看看ARM32的情况。对于ARM32而言,cpu可以处在各种processor mode下,例如User、FIQ、IRQ、Abort、Undefined、System,这些不同的mode又对应两种privilege level,non-privilege(user processor mode)和privilege(其他processor mode)。

来到ARM64,processor mode这个概念已经消失了,取而代之的是exception level,如果没有支持两个security state(但是支持虚拟化),那么ARM64有3个exception level,分别是:EL0(对应user mode的application),EL1(guest OS)和EL2(Hypervisor)。如果支持两个security state(但是不支持虚拟化),ARM64还是有3个exception level,分别是:EL0(对应trusted service),EL1(trusted OS kernel)和EL3(Secure monitor)。如果支持了虚拟化并且同时支持两种security state,那么ARM64的处理器可以处于4种exception level,具体如下(摘自wowo同学的文章里面的图片,^_^):

由于EL3是和安全相关的,目前linux kernel并不涉及这部分的内容,因此本文将不考虑EL3这个exception level。

2、异步异常(asynchronous exception)和同步异常(synchronous exception)

虽然异常各具形态,但是基本可以分成两类,一类是asynchronous exception,另外一类是synchronous exception。

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。

synchronous exception和asynchronous exception相反,其特点是:

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

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

synchronous exception又可以细分成两个类别,一种我们称之为synchronous abort,例如未定义的指令、data abort、prefetch instruction abort、SP未对齐异常,debug exception等等。还有一种是正常指令执行造成的,包括SVC/HVC/SMC指令,这些指令的使命就是产生异常。

3、precise exception

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值