乐趣区

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

“一个行者问老和尚:“您得道前,做什么?”老和尚:“砍柴担水做饭。”行者问:“那得道后呢?”老和尚:“砍柴担水做饭。”行者又问:“那何谓得道?”老和尚:“得道前,砍柴时惦记着挑水,挑水时惦记着做饭;得道后,砍柴即砍柴,担水即担水,做饭即做饭。”

很多时候平庸的日子不平庸。

上一次咱们讲到 ARM v8 的异样向量表(上一期节目点击这里)。咱们以 data abort 这个异样为例子。假如 data abort 产生在 EL1 这个异样级别里。它会从异样向量表里跳转到 el1_sync 这个汇编函数里。

第 270 行的 kernel_entry 是一个汇编的宏,用来保留产生异样现场,把相干 CPU 寄存器保留到 EL1 的栈里,这里和 ARM32 的代码相似,会有一个栈框,这栈框的大小是 S_FRAME_SIZE,该栈框大小是一个软件定义的,而非硬件定义,也就是说你能够实现一个和 Linux 实现不一样的栈框。

接下来读取 esr_el1j 寄存器的值。ESR_EL1 寄存器全称 exception syndrome register,能够参考 ARM v8 手册第 D10.2.36 章内容。这个寄存器有点相似 ARM v7 中的 DFSR 寄存器。这个寄存器的具体定义在 D10.2.39 章。

在这个寄存器里,EC 域保留了异样的类型(exception class)。对于 current EL 的 data abort,能够看手册的定义,当 EC== 100101 的时候就是示意以后 EL 产生了 data abort 异样。

这个值和代码里 273 行的 ESR_ELx_EC_DABT_CUR 的定义是吻合的,它定义在 arch/arm64/include/asm/esr.h 文件中。

所以依据 274 行代码会跳转到 el1_da 汇编函数里。这个函数也是在 entry.S 文件里。

首先去读取 far_el1 寄存器。这个寄存器是在第 D10.2.40 章里。这寄存器保留了导致异样产生的虚拟地址,那咱们操作系统就能够读取这个寄存器来持续后续的异样解决,它很相似 ARM V7 中的 DFAR 寄存器。

第二步是开启中断。

第三步跳转到 do_mem_abort 函数里。

这个函数有三个参数,其中第一个和第二参数须要留神,第一个参数是异样产生时候那个谬误的虚拟地址,即读取的 FAR_EL1 寄存器,第二参数是 ESR_EL1 寄存器。不过第二个参数有不少花头。

ESR_EL1 寄存器的 bit 26~31 比特位是 Exception class,bit 0 ~24 是 ISS 域,它会依据 exception class 的不同 而有不同的解读,也就是说,Exception class 不同,ISS 域的编码是 不一样的。对应 Data abort 这个类型来说,ISS 的编码是在 ARM v8 手册的 2460 页里。见上面这个图。

其中 bit 0~5 是批示具体产生了那种类型的 data abort。咱们以 level 3 的页表转换谬误为例(translation fault level 3),咱们看到在 DFSC 域里,它是 000111,也就是 7 号。

咱们看一下 Linux 内核代码,在 arch/arm64/mm/fault.c 文件中有一个 fault_info[] 的数组,咱们看看 7 号是对应是神马?

咱们惊奇发现 fault_info[] 数组里 7 号就是 level 3 的 translation fault,对应的处理函数是 do_page_fault 函数,见第 386 行代码。大家能够从 0 开始来数这个数组。

咱们通过两期的笨叔点滴来 go through 了一遍 ARM V8 上产生异样的台前幕后,心愿对大家有所帮忙。更多精彩内容敬请关注笨叔的第二季《奔跑吧 Linux 内核》配套视频。

第二季来啦

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

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

过程的生命周期

过程管制块

过程调度的实质

CFS 调度器

过程切换是怎么玩

SMP 负载平衡

大小核调度是怎么回事

为啥须要中断

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

中断底层汇编解决

中断高低半部

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

软中断是怎么回事

tasklet 和 workqueue 怎么玩

什么是中断上下文

为啥须要锁

什么是原子操作

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

内存屏障是什么

spinlock 怎么用

信号量和 mutex 该选谁

RCU 怎么用

为啥这里要增加一个锁

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

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

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

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

退出移动版