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

小明:老师,老师,这个怎么老是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。

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