【原创】Linux中断子系统(一)-中断控制器及驱动分析

Read the fucking source code! --By 鲁迅

A picture is worth a thousand words. --By 高尔基

说明:

Kernel版本:4.14

ARM64处理器,Contex-A53,双核

使用工具:Source Insight 3.5, Visio

1. 概述

从这篇文章开始,来聊一聊中断子系统。
中断是处理器用于异步处理外围设备请求的一种机制,可以说中断处理是操作系统管理外围设备的基石,此外系统调度、核间交互等都离不开中断,它的重要性不言而喻。

来一张概要的分层图:

【原创】Linux中断子系统(一)-中断控制器及驱动分析

硬件层:最下层为硬件连接层,对应的是具体的外设与SoC的物理连接,中断信号是从外设到中断控制器,由中断控制器统一管理,再路由到处理器上;

硬件相关层:这个层包括两部分代码,一部分是架构相关的,比如ARM64处理器处理中断相关,另一部分是中断控制器的驱动代码;

通用层:这部分也可以认为是框架层,是硬件无关层,这部分代码在所有硬件平台上是通用的;

用户层:这部分也就是中断的使用者了,主要是各类设备驱动,通过中断相关接口来进行申请和注册,最终在外设触发中断时,进行相应的回调处理;

中断子系统系列文章,会包括硬件相关、中断框架层、上半部与下半部、Softirq、Workqueue等机制的介绍,本文会先介绍硬件相关的原理及驱动,前戏结束,直奔主题。

2. GIC硬件原理

ARM公司提供了一个通用的中断控制器GIC(Generic Interrupt Controller),GIC的版本包括V1 ~ V4,由于本人使用的SoC中的中断控制器是V2版本,本文将围绕GIC-V2来展开介绍;

来一张功能版的框图:

【原创】Linux中断子系统(一)-中断控制器及驱动分析

GIC-V2从功能上说,除了常用的中断使能、中断屏蔽、优先级管理等功能外,还支持安全扩展、虚拟化等;

GIC-V2从组成上说,主要分为Distributor和CPU Interface两个模块,Distributor主要负责中断源的管理,包括优先级的处理,屏蔽、抢占等,并将最高优先级的中断分发给CPU Interface,CPU Interface主要用于连接处理器,与处理器进行交互;

Virtual Distributor和Virtual CPU Interface都与虚拟化相关,本文不深入分析;

再来一张细节图看看Distributor和CPU Interface的功能:

【原创】Linux中断子系统(一)-中断控制器及驱动分析

GIC-V2支持三种类型的中断:

SGI(software-generated interrupts):软件产生的中断,主要用于核间交互,内核中的IPI:inter-processor interrupts就是基于SGI,中断号ID0 - ID15用于SGI;

PPI(Private Peripheral Interrupt):私有外设中断,每个CPU都有自己的私有中断,典型的应用有local timer,中断号ID16 - ID31用于PPI;

SPI(Shared Peripheral Interrupt):共享外设中断,中断产生后,可以分发到某一个CPU上,中断号ID32 - ID1019用于SPI,ID1020 - ID1023保留用于特殊用途;

Distributor功能:

全局开关控制Distributor分发到CPU Interface;

打开或关闭每个中断;

设置每个中断的优先级;

设置每个中断将路由的CPU列表;

设置每个外设中断的触发方式:电平触发、边缘触发;

设置每个中断的Group:Group0或Group1,其中Group0用于安全中断,支持FIQ和IRQ,Group1用于非安全中断,只支持IRQ;

将SGI中断分发到目标CPU上;

每个中断的状态可见;

提供软件机制来设置和清除外设中断的pending状态;

CPU Interface功能:

使能中断请求信号到CPU上;

中断的确认;

标识中断处理的完成;

为处理器设置中断优先级掩码;

设置处理器的中断抢占策略;

确定处理器的最高优先级pending中断;

中断处理的状态机如下图:

【原创】Linux中断子系统(一)-中断控制器及驱动分析

Inactive:无中断状态;

Pending:硬件或软件触发了中断,但尚未传递到目标CPU,在电平触发模式下,产生中断的同时保持pending状态;

Active:发生了中断并将其传递给目标CPU,并且目标CPU可以处理该中断;

Active and pending:发生了中断并将其传递给目标CPU,同时发生了相同的中断并且该中断正在等待处理;

GIC检测中断流程如下:

GIC捕获中断信号,中断信号assert,标记为pending状态;

Distributor确定好目标CPU后,将中断信号发送到目标CPU上,同时,对于每个CPU,Distributor会从pending信号中选择最高优先级中断发送至CPU Interface;

CPU Interface来决定是否将中断信号发送至目标CPU;

CPU完成中断处理后,发送一个完成信号EOI(End of Interrupt)给GIC;

3. GIC驱动分析 3.1 设备信息添加

ARM平台的设备信息,都是通过Device Tree设备树来添加,设备树信息放置在arch/arm64/boot/dts/下

下图就是一个中断控制器的设备树信息:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppxjf.html