本文节选自《实验指导手册》第二版第16.6章
实验指导手册是奔跑吧Linux内核入门篇第二版配套实验书,pdf版本已经release,可以免费下载和自由打印!
下载方法:
登陆“奔跑吧linux社区”微信公众号,输入“奔跑吧2”获取下载地址。
本文是《奔跑吧Linux内核 入门篇》第二版中第16章的实验16-4:中断实验。在实现操作系统基本功能之前,我们先实现中断处理功能,我们以树莓派上ARM Core里面的generic timer为中断源,把中断这条路径先打通,以后在做进程创建和进程切换的时候也是需要用的,可以作为时钟中断来使用。
1.实验目的
1)了解和熟悉ARM64汇编语言。
2)了解和熟悉ARM64的异常等级处理。
3)了解和熟悉ARM64的中断处理流程。
4)了解和熟悉树莓派中系统定时器(system timer)的用法。
2.实验要求
1)在boot.s中实现对ARM64异常向量表的支持。
2)将树莓派中的系统定时器作为中断源,编写中断处理程序,每当有定时器中断到来时输出“Timer interrupt occured”。
3.实验详解
本实验对初学者有一定难度,读者需要熟悉如下几个方面。
-
ARMv8体系结构中的中断处理过程。
-
树莓派3B以及树莓派4B上的中断控制器。
-
树莓派上的定时器外设
-
ARMv8上的generic timer
-
中断上下文保存与恢复
3.1 中断处理过程
ARM64处理器核心一般都有两个和中断相关的管脚:nIRQ 和 nFIQ,并且是每个处理器核心都有一对这样的管脚。
另外,PSTATE状态中有两个比特位和中断相关:
-
I:用来屏蔽IRQ中断
-
F:用来屏蔽FIQ中断
下图是ARM64处理器发生中断的处理流程。
3.2 树莓派上的中断控制器
ARM公司提供了标准的GIC控制器,例如树莓派4b上支持GIC-400,树莓派3b上支持传统的中断方式(legacy interrupt)。
树莓派4b上提供和支持两种中断控制器,而树莓派3b只支持传统的中断控制器。
-
GIC-400 (默认)
-
传统的中断控制器(legacy interrupt controller)
树莓派3b和4b支持多种中断源,如图所示。
-
ARM Core N:ARM Core本身的中断源,例如Core里面的generic timer
-
ARMC:可以被VPU和CPU访问的中断源,例如mailbox等
-
ARM_LOCAL:只能被CPU访问的中断源,例如本地timer等
下面这个图是树莓派传统中断控制器的路由情况。
从图上可以看到,ARM core N和ARM_LOCAL的中断都会路由到ARM_LOCAL routing的硬件单元,而ARMC中断会被路由到ARMC routing的硬件单元。
下面这个图是中断状态的路由情况。
中断状态寄存器 路由过程:
-
先读SOURCEn中断状态寄存器
-
SOURCEn寄存器 bit 8 是否置位,若置位,读取PENDING2寄存器
-
若PENDING2的bit24置位,则读PENDING0寄存器
-
若PENDING2的bit25置位,则读PENDING1寄存器
树莓派4b上还支持GIC-400的中断控制器,这个留给读者自己去学习。
3.3 ARM Core的generic timer
我们以ARM core上的generic timer为例来说明,如何在树莓派上使用timer中断。
Cortex-A72支持4个ARM Core的generic timer:
-
CNT_PS_IR