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中断处理过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值