Linux内核异常向量表在哪,ARM64的启动过程之(六):异常向量表的设定
ARM64的启动过程之(六):异常向量表的设定
作者:linuxer 发布于:2015-11-24 18:22
分类:ARMv8A Arch
一、前言
本文主要描述了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
什么是precise exception呢?现代的cpu设计越来越复杂,各种pipe技术,各种cache技术,分支预测,multi-issue,out-of-order-execution等等,这些都让cpu core执行指令处于一个混沌的状态(主要是指不象sequential cpu 那么清晰),因此,当发生一个exception的时候,需要一个快刀来斩断那些处于各种纠缠中的乱麻一样的各种cpu以及memory的状态。这时候,我们需要选定一条指令,该指令之前的指令(不包括该指令)都已经全部执行完毕,修改了硬件上下文(cpu状态寄存器,各种通用寄存器,系统寄存器等等,memory hierarchy状态)。而该指令之后(包括该指令)的指令都没有执行
Linux内核异常向量表在哪,ARM64的启动过程之(六):异常向量表的设定相关推荐
- arm linux内核启动过程,ARM64的启动过程之(一):内核第一个脚印
ARM64的启动过程之(一):内核第一个脚印 作者:linuxer 发布于:2015-10-10 15:06 分类:ARMv8A Arch 一.前言 kernel的整个启动过程涉及的内容很多,不可能每 ...
- linux内核启动第一个进程,ARM64的启动过程之(一):内核第一个脚印
ARM64的启动过程之(一):内核第一个脚印 作者:linuxer 发布于:2015-10-10 15:06 分类:ARMv8A Arch 一.前言 kernel的整个启动过程涉及的内容很多,不可能每 ...
- ARM64的启动过程之(四):打开MMU
原文地址:http://www.wowotech.net/linux_kenrel/turn-on-mmu.html 一.前言 经过漫长的前戏,我们终于迎来了打开MMU的时刻,本文主要描述打开MMU以 ...
- ARM64的启动过程之(二):创建启动阶段的页表
原文地址: http://www.wowotech.net/linux_kenrel/create_page_tables.html 一.前言 本文主要描述了ARM64启动过程中,如何建立初始化阶段页 ...
- ARM64的启动过程之(三):为打开MMU而进行的CPU初始化
原文地址:http://www.wowotech.net/linux_kenrel/__cpu_setup.html 一.前言 上一节主要描述了为了打开MMU而进行的Translation table ...
- ARM64的启动过程之(一):内核第一个脚印
一.前言 kernel的整个启动过程涉及的内容很多,不可能每一个细节都描述清楚,因此我打算针对部分和ARM64相关的启动步骤进行学习.整理,并方便后续查阅.本文实际上描述在系统启动最开始的时候,boo ...
- linux内核网络协议栈--ip层报文转发之ip_local_out()函数(六)
IP层本地报文发送有两个函数ip_local_out和ip_local_out_sk,实际实现两者是等同的,因为本地发送的报文,skb必然关联着一个sock对象. 1.ip_local_out函数 s ...
- ARM64的启动过程之(五):UEFI
原文地址: http://www.wowotech.net/linux_kenrel/UEFI.html 一.前言 在准备大刀阔斧进入start_kernel之际,我又重新review了一下head. ...
- mysql数据库和表的关系_MySQL数据库学习【第六篇】表与表之间的关系
表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 ...
最新文章
- Http 与 Socket 区别
- python的日志简单使用
- BZOJ-1875-HH去散步-SDOI2009-矩阵乘法
- springboot与springcloud的关系(转载)
- 使用run-rs启动mongodb
- java - 通用 CRUD(增、删、改、查)工具类,代码高效复用
- python卸载pip_PIP安装和卸载包,pip
- 史上最全!用Pandas读取CSV,看这篇就够了
- Telephone Calls
- Python:assert基本用法
- CoreOS那些事之系统升级
- CCNA培训课总结笔记--RIP的基本配置(五)
- eviews建立时间序列模型_Eviews系列12|时间序列模型常见问题解答
- 【数字图像处理5.3】SLIC算法 超像素分割(无监督聚类方式)python
- 数组分割 java_分割java数组
- 如何免费将office文档转成PDF的几种方法
- oppo小布机器人_看这一篇就够了,1分钟带你了解OPPO小布的隐藏玩法!
- 为什么要建立计算机网络体系结构标准,请问什么是网络体系结构?为什么要定义网络体系结构?...
- Keras.layers.BatchNormalization的批归一化方法
- 2015年3季度基金持股超流通股30%的个股一览
热门文章
- 如何对全国麦当劳、KFC这些餐饮巨头做空间分析
- 主成分分析函数Matlab,matlab中主成分分析的函数1
- linux deepin树莓派,树莓派4B ARM64 deepin15.5桌面系统安装
- Apple - Bonjour (NSNetService)
- 【实战篇】是时候彻底弄懂BERT模型了(收藏)
- 安科瑞AWT100无线数据采集通信终端
- Python输入整数n,求斐波拉契数列第n个数
- 设置nesC在vim中的语法高亮
- 哈希碰撞率(hash collision)实测
- JVM垃圾回收与一次线上内存泄露问题分析和解决过程