关于arm64:笨叔点滴14-ARMv8里异常处理哪些蛇神牛鬼

8次阅读

共计 3465 个字符,预计需要花费 9 分钟才能阅读完成。

“小明同学在一次计算机的实验课里,怎么也出不来试验后果。

小明:老师,老师,这个怎么老是 404 啊?

老师:你把这个配置文件的某某项填空就行

小明乐不可支的批改配置文件。

过了一会,小明又嘟囔不行。

老师:你把配置文件发给我。

。。。

老师:小明同学,滚。。。,我让你填空就行,就怎么给我填了一个“空”字

昨天的笨叔点滴里和大家 go through 一下 ARM v7 手册和 Linux 内核代码里异样解决局部的哪些事儿。有小伙伴微信上和笨叔叔说,今晚能不能介绍一下 ARMv8 上的异样解决,我说好啊,这要看我家小笨笨明天早晨乖不乖了,乖的话,笨叔的空余工夫就多一些。

话说 ARM v8 是和一个 ARM v7 齐全不兼容的架构,然而又偏偏把 ARM v7 融入了 ARM v8 里,说不出什么感觉,至多还没有让笨叔感觉到拍案称绝,但至多 64 位和 32 位能够比拟完满的交融,兴许是为了往后兼容吧,毕竟软件生态最重要。另外一点,ARMv8 架构做的越来越成熟了,齐全有大家闺秀的风范,齐全有能力和其余的架构比一比,这一点从 ARM v8 的汇编代码能够窥探进去,简洁老练!

ARMv8 的最新手册是 V8.3 版本,全程有 6666 页,大家一看 6666 预计都吓坏了,其实大家不必放心,且来听笨叔给你剖析剖析:

这 6666 页里有很多内容和 ARMv7 是反复的,第 F 和 G 章是讲 ARM v7。另外,ARM 的芯片手册是把所有的运行模式都揉在一块来形容,比方我做的零碎不必虚拟化,不必 secure monitor,那剩下的有用内容就不是很多了。若再把 ARM v7 和介绍指令集的章节去掉,那这 6666 页就没有这么恐怖了,对吧?

01

咱们来打开 ARM v8 手册第 D.1 章,第一页就通知你 ARM v8 有哪些 EL,EL 是 exception level 的意思,翻译成中文兴许叫异样等级,咱们下文还是简称 EL 等级吧,和芯片手册和代码同步。ARM 芯片手册通常应用 ELn 来示意第 n 个异样等级。

这里有 4 个 EL,其中 EL0 是用户态,EL1 是内核态也就是特权模式,EL2 是虚拟化的 hypevisor 模式,EL3 是平安 monitor。是不是和 x86 的 ring0~ring3 很像呢?这是向 x86 前辈致敬吗?哈哈~~

在第 D1.2.5 章里,介绍了异样次要是分成 2 大类。一类是同步,另外一类是异步。

这里次要是说,同步异样是:

导致异样产生的起因是执行了某个指令

异样返回地址就指明了是因为执行了那个“陷阱”指令导致的

这个异样产生是准确的。

那啥是异步异样呢:

这个异样的产生不是因为执行了某个指令而中的陷阱

异样返回地址没法指明是中了哪条指令的陷阱

这个异样产生是不准确的

如果笨叔再用本人的话来翻译一下就是,所谓的同步异样就是说中了指令的陷阱,这样的,这些异样的产生是比拟精准的。而异步异样是和运行的指令没有关系,因为它是被中圈套。如果用打猎来说的话,你在地里挖个陷阱来打猎,这是同步异样,任何猎物只有跑到这里就中圈套。如果你追着这猎物射箭,对于猎物来说,它什么时候被杀中,它是不晓得的,它又不能说 NG 重来:笨叔,咱们重来,我在后面跑,你从新射我。

所以,咱们在 ARMv7 里说的那些异样,比方 data abort 等,就很吻合这里说的同步异样,而 IRQ 和 FIQ 中断就很吻合异步异样,ARMv8 里还有 System Error 也是属于异步异样。

在 D1.10 章里蕴含了很多和异样相干的内容。比方当一个异样产生了之后,ARM 处理器做了那些事件?

下面这一大段都是形容异样产生了,ARM 处理器做了那些事件。这好比之前那个打猎的例子,不论是刻舟求剑式的还是射箭式的,中了都要去解决现场吧,万一你的猎物被第三者偷走了,咋办?下面的步骤,笨叔简略总结一下:

处理器的状态保留到对应(target)的异样等级的 SPSR_ELx 寄存器里

返回地址保留到对应的异样等级的 ELR_ELx 寄存器里

PSTATE 寄存器里的 DAIF 域都设置为 1。PSTATE 寄存器是 ARM v8 里新增的寄存器。

如果是同步异样,那么到底什么起因导致的呢?请君看 ESR_ELx 寄存器。

设置一下栈指针,指向对应异样等级里的栈。

迁徙到对应的异样等级,而后跑到异样向量表里。

总的来说,这个过程和 ARM v7 的差不了太多。

接下来,咱们看一下异样向量表,到底和 ARM v7 的有啥不一样。

在第 D1.10.2 章里就形容异样向量表了。

这里第一句话是说,这个向量表会占用一大段间断的空间,这是什么鬼呢?咱们稍后再解释。

第二段说,每个 EL 等级里都有一个对应的 VBAR 寄存器,用来指向异样向量表的基地址。那你肯定会疑难,那怎么放呢?

第三段说,异样向量表里必须蕴含同步异样,Serror,IRQ 和 FIQ 这种信息。

在第 D.1.10.2 章里有一个表 D1-7,这个表,预计很多人看了间接晕倒,太艰涩难懂了。

啥是 current EL with SP_EL0,啥是 current EL with SP_ELx 呢?笨叔刚开始看这个表,也晕,功力不够,之因太笨。呵呵,就像武侠小说里说的,功力不够看文治秘籍会头晕。

还好,ARM 公司提供了另外一份比拟厚道的文档,那就是《ARM Cortex-A Series Programmer‘s Guide for ARMv8-A》,这个文件绝对简略易懂一些。在第 10.4 章里有形容这个异样向量表是怎么回事的。

她说:在 ARM v7 的异样向量表,每个表项只有 4 个字节,只能寄存一条跳转指令,然而咱们在 ARM v8 里降级啦,咱们每个表项须要 128 个字节,这样咱们能够寄存 32 条指令。小伙伴留神啦,ARM v8 指令集里一条指令的位宽是 32bit 的,而不是 64bit,小明同学最近去面试就被面试官鄙视了。异样向量表里要蕴含 4 组,每一组蕴含 4 个表项。这怎么了解?

比方以后零碎只运行 Linux 内核不包含虚拟化或者平安个性,那最高的 EL 等级是 EL1,那么它就肯定有 EL0。所以下面说的 Current EL 就是说的以后零碎最高的 EL 等级。那 current EL with SP_EL0 是啥意思呢,其实是说,当零碎运行在 EL1 的时候,而后应用 EL0 的 SP,貌似还没有这种场景。current EL with SP_EL1,这是说零碎运行在 EL1 里,SP 也是应用 EL1,那就是在内核态里产生了异样,这个场景是有的。

第 10.4 章这个表,比拟适宜咱们去了解下面说的那一大段废话。

举个栗子,当 OS 运行在内核态时产生了 IRQ 中断,这时候应该跳转到异样表里的 0x280 处。如果 OS 运行在用户态并且正在执行 32bit 的 app,产生了 IRQ 中断,它应该跳转到哪里呢?

对于异样向量表,还有一个问题须要思考,那就是异样向量表放在哪里?ARM v8 里提供了 VBAR(Vector Base address register)。这几个寄存器的形容是在第 D10.2 章里。

小明同学问:这里有三个雷同的 VBAR 寄存器,我应该设置那个呢?

咱们来看一下 Linux 内核代码(以 runninglinux_4.0 为例)。代码门路是在 arch/arm64/kernel/entry.S 文件里。

笨叔在图上圈了 4 组,就是咱们方才说的那 4 组。

然而小明同学由有疑难了,笨叔叔,你不是说,每个表项是 128 个字节吗,我怎么看每个表项如同是 4 个字节啊?

当初的小明同学曾经变得聪慧了。

猫腻暗藏在 entry 这个宏里。

留神这里的 127 行的 align 这个伪指令,它的威力很大。这里 align 7 示意依照 2 的 7 次方来对齐,2 的 7 次方是 128。

(未完待续,今天咱们持续以 data abort 异样解决为例,介绍 ARM v8 上异样解决的那些蛇神牛鬼)

第二季来啦

大家期待的第二季视频来了,咱们这次是过程治理、锁机制以及中断治理三合一,加量不加价。旗舰篇还是原价 1199,当初特价 999。三合一高级篇特价 299。

高级篇:笨叔和大家彻底理清过程治理、锁机制以及中断治理相干的概念。比如说:

过程的生命周期

过程管制块

过程调度的实质

CFS 调度器

过程切换是怎么玩

SMP 负载平衡

大小核调度是怎么回事

为啥须要中断

中断产生了 ARMv7 和 ARMv8 处理器做了啥

中断底层汇编解决

中断高低半部

如何写好一个中断处理函数

软中断是怎么回事

tasklet 和 workqueue 怎么玩

什么是中断上下文

为啥须要锁

什么是原子操作

ARMv7 和 ARMv8 处理器怎么进行原子操作的

内存屏障是什么

spinlock 怎么用

信号量和 mutex 该选谁

RCU 怎么用

为啥这里要增加一个锁

旗舰篇蕴含高级篇内容,还包含如下内容:

额定减少外围代码的导读,真正做到自主可控。

综合翻新试验,笨叔率领大家在树莓派上玩一个小 OS。

面试宝典,那些年咱们被虐过的面试题目。

正文完
 0