中断对于cpu来说扮演着举足轻重的角色,从软硬件层面涉及面广,因此流程相对也比较复杂。硬件层面涉及到arm的gic中断控制器以及CPU内部扩展的gpio中断控制器,外设利用中断资源硬件设备,软件层面涉及和架构强相关的异常处理代码,linux为屏蔽硬件涉及差异搞出来的中断子系统。以下从各个层面对中断进行展开讨论。
一.中断体系架构
中断从软硬件上来分层大致可以分成四层,概述如下:
1.硬件连接层:普通外设连接到中断控制器,中断控制器连接到处理器核的IRQ和FIQ脚,对于处理器来说,中断控制器和普通外设一样,都是外设,所不同的是中断控制器电路是集成在了处理器内部。
2.架构代码:中断对于处理器来说属于异常模式,当中断来临的时候,处理器需要切换到异常模式,执行处理异常的代码,就是上图中的arch code,这一块代码和处理器的体系架构相关,arm64的代码路径位于:kernel\arch\arm64\kernel\entry.S。其次就是中断控制器的驱动代码,ARM中断控制器是ARM用来管理外设中断的硬件电路,分为四个版本GIC_V1/GIC_V2/GIC_V3/GIC_V4/
3.中间层:和硬件无关,对于所有体系架构来说都是一样,是linux用来屏蔽硬件架构差异做的一个通用层;
4.应用层:各种外设驱动,调用中间层提供的通用接口来设置自己的中断和中断服务程序
二.中断控制器
2.1:GIC中断控制器硬件模块介绍
首先需要了解一下中断控制器这个硬件模块。中断控制器是帮助处理器管理繁杂外设中断的硬件电路,让处理器可以专心的做一件事情:机械的根据PC指针来执行对应代码段。从arm发布的GIC_V3规格书来看支持如下功能:
— The Armv8 architecture. —>arm8架构
— Locality-specific Peripheral Interrupts (LPIs). —>特殊外设中断(INTID:8192-)
— Private Peripheral Interrupts (PPIs). —>CPU私有外设中断(INTID:16-31)
— Software Generated Interrupts (SGIs). —>软中断,用于核间通信(INTID:0-15)
— Shared Peripheral Interrupts (SPIs). —>共享外设中断,用于普通外设(INTID:32-1019)
— Inter