Linux中断子系统学习笔记

概述

Linux下中断模型:外设(产生中断信号),中断控制器(负责处理外设产生的中断控制器),CPU
工作原理:外设产生一个中断,通过irq request line向CPU方向通知中断发生。由于外设很多,所以使用中断控制器(ARM里叫GIC)集合中断信号,再传给CPU进行处理。

中断控制器是连接外设中断系统和CPU系统的桥梁。根据外设irq request line的多少,中断控制器可以级联CPU的主要功能是运算,因此CPU并不处理中断优先级,那是中断控制器的事情。

对于CPU而言,一般有两种中断请求,例如:对于ARM,是IRQ和FIQ信号线,分别让ARM进入IRQ mode和FIQ mode。对于X86,有可屏蔽中断和不可屏蔽中断。

在这里插入图片描述
这里以全志H3的GIC图为例,CPU的四个CORE都连接上了GIC,并且都接入了右边的总线。
详细图:
在这里插入图片描述
CPU被动的接受中断信号

以下为GIC的构成
在这里插入图片描述
GIC的内部构成有:Distributor和CPU interface

Distributor的接入有:SPI(32-1019),PPI(16-31),SGI(0-15)
CPU interface 有几个CORE就有几个interface。

SPI:shared peripheral interrupt , 这是常见的外部设备中断,也定义为共享中断,比如按键触发一个中断,手机触摸屏触发的中断,共享的意思是说可以多个Cpu或者说Core处理,不限定特定的Cpu。

PPI:private peripheral interrupt,私有中断,这些中断一般是发送给特定的CPU的,比如每个CPU有自己对应的Physicaltimer,产生的中断信号就发送给这个特定的CPU进行处理。

SGI:software generated interrupt,软件上产生的中断,中断号范围0~15,也就是最前的16个中断。如果在X86平台上做过开发工作的同学可能有影响,其实这就是相当于IPI,简单的说Cpu_1要给Cpu_2发送特定信息,比如时间同步,全局进程调度信息,就通过软件中断方式,目标CPU接受到这样的中断信息,可以获取到信息是哪个CPU发送过来的,具体的中断ID是哪个数字,从而找到对应处理方式进行处理。

Distributor作用总的来说就是中断路由,具体:

  1. 整个中断控制器设备的使能与关闭。
  2. 对每一个中断的优先级控制。
  3. 对每一个中断的触发方式设置。
  4. 对没一个中断的目标发送CPU进行设置,决定分发到哪个具体的CPU上进行处理。
  5. 对中断的去向,是到G0还是G1,这个是安全域的概念。
  6. 记录每个中断的状态,是否到来,是否处理中,是否处理完,是否在等待发送状态等等。

CPU interface的作用:

  1. 使能和发送一个具体的中断信号到特定对应的CPU上,
  2. 确认具体中断已经被CPU接受,处理,以及处理完成。
  3. 设置CPU能接受的中断的优先级别。以及对应的基于级别的中断抢断等处理。

中断处理过程:外部产生中断,例如SPI 0 interrupt,中断发送后送入GIC的Distributor,Distributor负责判断分发到特定的CPU上的CPU interface,例如CPU0的CPU interface,CPU interface负责判断中断优先级是否大于当前的执行的任务,如果是则CPU Interface就发送一个物理的SIGNAL(比如由低电平到高电平)到CPU的IRQ线上,CPU感知到中断信号,从而转到中断模式进行处理,处理完后CPU0将SIGNAL拉低。

GIC状态
在这里插入图片描述
Inactive或Deactive:GIC上中断配置好之后,没有其对应的中断到来,或者之前处理的中断已经完全结束了,此时处于Inactive或者Deactive。
Pending:中断信号到来,GIC获取到,这个时候要经过一系列的的判断,然后送给对应的CPU来处理,在CPU确认该中断并处理之前,此时处于Pending。
Active:中断由GIC路由到特定的CPU CORE上,CORE正在处理中断并且还没结束,此时处于Active。
Active and Pending:GIC上终端信号线可能依旧有效,比如高电平触发的SIGNAL线还没有被拉低,或者说又来一个同样的中断,那就是Activeand Pending。

另外,中断有两种形态,一种就是直接通过signal相连,用电平或者边缘触发。另外一种是基于消息的,被称为MSI (Message Signaled Interrupts)。

现在开始了解Linux的中断子系统。

中断域

在Linux内核中,使用两个ID标识中断。
IRQ numberCPU需要为每一个外设中断编号,我们称之IRQ Number,SPI(32-1019),PPI(16-31),SGI(0-15)就是CPU的IRQ number。这个IRQ number是一个虚拟的interrupt ID,和硬件无关,仅仅是被CPU用来标识一个外设中断。
HW interrupt ID:对于interrupt controller而言,它收集了多个外设的interrupt request line并向上传递,因此,interrupt controller需要对外设中断进行编码。Interrupt controller用HW interrupt ID来标识外设的中断。在interrupt controller级联的情况下,仅仅用HW interrupt ID已经不能唯一标识一个外设中断,还需要知道该HW interrupt ID所属的interrupt controller

划重点,IRQ number是CPU用来标识确定不同的中断,而HW interrupt ID是中断控制器用来标识中断的。
因此,linux kernel中的中断子系统需要提供一个将HW interrupt ID映射到IRQ number上来的机制
中断数少的时候,HW interrupt ID映射到IRQ number上来的机制是比较简单的,一一对应映射即可。在中断数逐渐增多的时候,一个中断控制器不同接受到所有的中断信号,于是提出了中断级联的机制,进而提出了中断域这个概念,每个中断控制器只负责管理自己底下的中断,并且进行HW interrupt ID编码,编码有效范围仅限所在的中断控制器。
Linux由HW interrupt ID到IRQ number的映射机制有:
线性映射,Radix Tree map,寄存器配置映射。

中断描述符

之前说了IRQ number,内核中用于储存每个一个IRQ number对于的中断具体信息用struct irq_desc来描述,我们称之中断描述符struct irq_desc。所有的中断描述符都会被储存至一个数组中,通过IRQ number为下标访问读取中断描述符,如图。
在这里插入图片描述
过程:外部发送中断–>GIC–>HW interrupt ID–>IRQ number->通过IRQ numbe下标寻址irq_desc->执行irq_desc里的highlevel irq-events handler。
执行irq_desc里的highlevel irq-events handler过程又分为

  1. 调用中断描述符的底层irq chip driver进行mask,ack等callback函数,进行interrupt flow control。
  2. 调用该中断描述符上的action list中的specific handler(我们用这个术语来区分具体中断handler和high level的handler)。这个步骤不一定会执行,这是和中断描述符的当前状态相关,实际上,interrupt flow control是软件(设定一些标志位,软件根据标志位进行处理)和硬件(mask或者unmask interrupt controller等)一起控制完成的。

High level irq event handler

当外设触发一次中断后,一个大概的处理过程是:

  1. 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler

  2. machine driver对应的中断处理handler中会根据硬件的信息获取HW interrupt ID,并且通过irq domain模块翻译成IRQ number

  3. 调用该IRQ number对应的high level irq event handler,在这个high level的handler中,会通过和interupt controller交互,进行中断处理的flow control(处理中断的嵌套、抢占等),当然最终会遍历该中断描述符的IRQ action list,调用外设的specific handler来处理该中断

  4. 具体CPU architecture相关的模块会进行现场恢复。

在这里插入图片描述

ARM中断处理过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值