本文不研究中断虚拟化相关内容,部分内容来自于百问网手册

一、中断类型

Peripheral interrupt :其包含以下两种类型的外围中断,它们可以边缘触发或者高低电平触发

Private Peripheral Interrupt (PPI) :这是一个特定于单个处理器的外围中断。

Shared Peripheral Interrupt (SPI) :共享中断,这部分中断所有的核都可以处理。

Software-generated interrupt (SGI) :通过写入GICD_SGIR寄存器来产生中断,系统常用SGIs来进行内部处理器间通信。GICC_IAR或者GICC_AIAR来表明哪个处理器请求中断。

Virtual interrupt :虚拟中断

Maintenance interrupt :在GIC虚拟扩展中,用于发出关键事件的 level-sensitive 中断

二、中断状态

① 非活动状态(Inactive)–这意味着该中断未触发。

② 挂起(Pending)–这意味着中断源已被触发,但正在等待CPU核处理。待处理的中断要通过转发到CPU接口单元,然后再由CPU接口单元转发到内核。

③ 活动(Active)–描述了一个已被内核接收并正在处理的中断。

④ 活动和挂起(Active and pending)–描述了一种情况,其中CPU核正在为中断服务,而GIC又收到来自同一源的中断。

外设发给分发器的中断将标记为pending状态(或Active and Pending状态,如触发时果状态是active)。distributor确定可以传递给CPU核的优先级最高的pending中断,并将其转发给内核的CPU interface。通过CPU interface,该中断又向CPU核发出信号,此时CPU核将触发FIQ或IRQ异常。作为响应,CPU核执行异常处理程序。异常处理程序必须从CPU interface寄存器查询中断ID,并开始为中断源提供服务。完成后,处理程序必须写入CPU interface寄存器以报告处理结束。然后CPU interface准备转发distributor发给它的下一个中断。

在处理中断时,中断的状态开始为pending,active,结束时变成inactive。中断状态保存在distributor寄存器中。

三、GIC partitioning

GIC体系结构从逻辑上划分为一个分发器块(Distributor)和一个或多个CPU接口块(CPU interfaces)。

GIC体系结构从逻辑上划分为一个分发器块和一个或多个CPU接口块。GIC虚拟化扩展程序向GIC添加了一个或多个虚拟CPU接口.

Distributor:分发器块寄存器由GICD_prefix标识。负责处理各个中断事件的分发问题,也就是中断事件应该发送到哪个 CPU Interface 上去。分发器收集所有的中断源,可以控制每个中断的优先级,它总是将优先级最高的中断事件发送到 CPU 接口端。分发器端要做的主要工作如下:
①、全局中断使能控制。
②、控制每一个中断的使能或者关闭。
③、设置每个中断的优先级。
④、设置每个中断的目标处理器列表。
⑤、设置每个外部中断的触发模式:电平触发或边沿触发。
⑥、设置每个中断属于组 0 还是组 1。
⑦、转发一个SGI到一个或多个目标处理器。
⑧、每个中断的状态可见性
⑨、为软件提供设置或清除外围设备中断的pending状态的一种机制。

CPU interfaces :每个CPU接口块对系统中连接的处理器执行优先级掩蔽和抢占处理。CPU接口块寄存器由GICC_prefix标识。
每个CPU接口块都为连接到GIC的处理器提供了接口,每个CPU接口都为以下内容提供了一个编程接口:
①、使能或者关闭发送到 CPU Core 的中断请求信号。
②、应答中断。
③、通知中断处理完成。
④、设置优先级掩码,通过掩码来设置哪些中断不需要上报给 CPU Core。
⑤、定义抢占策略。
⑥、当多个中断到来的时候,选择优先级最高的中断通知给 CPU Core。

Interrupt IDs:每一个CPU最多支持1020个中断ID,中断ID为ID0-ID1019

ID32-ID1019 are used for SPIs
ID0-ID15 are used for SGIs
ID16-ID31 are used for PPIs
注意:GIC作为内存映射的外围设备,被软件访问。所有内核都可以访问公共的distributor单元,但是CPU interface是备份的,也就是说,每个CPU核都使用相同的地址来访问其专用CPU接口。一个CPU核不可能访问另一个CPU核的CPU接口

四、中断处理流程

4.1 初始GIC

Distributor和CPU interface在复位时均被禁用。复位后,必须初始化GIC,才能将中断传递给CPU核。在Distributor中,软件必须配置优先级、目标核、安全性并启用单个中断;随后必须通过其控制寄存器使能。对于每个CPU interface,软件必须对优先级和抢占设置进行编程。每个CPU接口模块本身必须通过其控制寄存器使能。在CPU核可以处理中断之前,软件会通过在向量表中设置有效的中断向量并清除CPSR中的中断屏蔽位来让CPU核可以接收中断。可以通过禁用Distributor单元来禁用系统中的整个中断机制;可以通过禁用单个CPU的CPU接口模块或者在CPSR中设置屏蔽位来禁止向单个CPU核的中断传递。也可以在Distributor中禁用(或启用)单个中断。下图可以看出整个中断流向。

4.2 GIC中断处理过程

当CPU核接收到中断时,它会跳转到中断向量表执行。顶层中断处理程序读取CPU接口模块的Interrupt Acknowledge Register,以获取中断ID。除了返回中断ID之外,读取操作还会使该中断在Distributor中标记为active状态。一旦知道了中断ID(标识中断源),顶层处理程序现在就可以分派特定于设备的处理程序来处理中断。当特定于设备的处理程序完成执行时,顶级处理程序将相同的中断ID写入CPU interface模块中的End of Interrupt register中断结束寄存器,指示中断处理结束。除了把当前中断移除active状态之外,这将使最终中断状态变为inactive或pending(如果状态为inactive and pending),这将使CPU interface能够将更多待处理pending的中断转发给CPU核。这样就结束了单个中断的处理。同一CPU核上可能有多个中断等待服务,但是CPU interface一次只能发出一个中断信号。顶层中断处理程序重复上述顺序,直到读取特殊的中断ID值1023,表明该内核不再有任何待处理的中断。这个特殊的中断ID被称为伪中断ID(spurious interrupt ID)。伪中断ID是保留值,不能分配给系统中的任何设备。

五、GIC寄存器

GICD_CTLR Distributor Control Register

位域 读写 描述
1 EnableGrp1 R/W 用于将pending Group 1中断从Distributor转发到CPU interfaces0:group 1中断不转发1:根据优先级规则转发Group 1中断
0 EnableGrp0 R/W 用于将pending Group 0中断从Distributor转发到CPU interfaces0:group 0中断不转发1:根据优先级规则转发Group 0中断

givc2,将中断,分成了group0和group1,使用寄存器GICD_IGROUPRn来对每个中断,设置组。
group0:安全中断,由nFIQ驱动
group1:非安全中断,由nIRQ驱动

GICD_TYPER Interrupt Controller Type Register

位域 读写 描述
15:11 LSPI R 如果GIC实现了安全扩展,则此字段的值是已实现的可锁定SPI的最大数量,范围为0(0b00000)到31(0b11111)。如果此字段为0b00000,则GIC不会实现配置锁定。如果GIC没有实现安全扩展,则保留该字段。
10 SecurityExtn R 表示GIC是否实施安全扩展:0未实施安全扩展;1实施了安全扩展
7:5 CPUNumber R 表示已实现的CPU interfaces的数量。已实现的CPU interfaces数量比该字段的值大1。例如,如果此字段为0b011,则有四个CPU interfaces。
4:0 ITLinesNumber R 表示GIC支持的最大中断数。如果ITLinesNumber = N,则最大中断数为32*(N+1)。中断ID的范围是0到(ID的数量– 1)。例如:0b00011最多128条中断线,中断ID 0-127。中断的最大数量为1020(0b11111)。无论此字段定义的中断ID的范围如何,都将中断ID 1020-1023保留用于特殊目的

GICD_IIDR Distributor Implementer Identification Register

位域 读写 描述
31:24 ProductID R 产品标识ID
23:20 保留
19:16 Variant R 通常是产品的主要版本号
15:12 Revision R 通常此字段用于区分产品的次版本号
11:0 Implementer R 含有实现这个GIC的公司的JEP106代码;[11:8]:JEP106 continuation code,对于ARM实现,此字段为0x4;[7]:始终为0;[6:0]:实现者的JEP106code,对于ARM实现,此字段为0x3B

GICD_IGROUPRn Interrupt Group Registers

位域 读写 描述
31:0 Group status bits R/W 组状态位,对于每个位:0:相应的中断为Group 0;1:相应的中断为Group 1。

对于一个中断,如何设置它的Group ?首先找到对应的GICD_IGROUPRn寄存器,即n是多少?还要确定使用这个寄存器里哪一位。

对于interrtups ID m,如下计算:
n = m DIV 32,GICD_IGROUPRn里的n就确定了;
GICD_IGROUPRn在GIC内部的偏移地址是多少?0x080+(4*n)
使用GICD_IPRIORITYRn中哪一位来表示interrtups ID m?
bit = m mod 32。

GICD_ISENABLERn Interrupt Set-Enable Registers

位域 读写 描述
31:0 Set-enable bits R/W 对于SPI和PPI类型的中断,每一位控制对应中断的转发行为:从Distributor转发到CPU interface:读:0:表示当前是禁止转发的;1:表示当前是使能转发的;写:0:无效1:使能转发

GICD_ICENABLERn Interrupt Clear-Enable Registers

为每个中断提供一个 Clear-enable bit, 向寄存器相应位写1 禁止转发相应的中断从Distributor 到CPU interfaces。读相应bit看一下相应中断是否使能。

位域 读写 描述
31:0 Clear-enable bits R/W 对于SPI和PPI类型的中断,每一位控制对应中断的转发行为:从Distributor转发到CPU interface:读:0:表示当前是禁止转发的;1:表示当前是使能转发的;写:0:无效1:禁止转发

GICD_ISPENDRn Interrupt Set-Pending Registers

为每个中断提供一个Set-pending bit,向Set-pending 写1 设置相应外设中断状态为pending。读一位看看相应中断是否是pending

GICD_ICPENDRn Interrupt Clear-Pending Registers



我们可以用一张图来表示 level-sensitive interrupt 的pending 状态逻辑:

GICD_ISACTIVERn Interrupt Set-Active Registers

位域 读写 描述
31:0 Set-active bits R/W 读:0:表示相应中断不是active状态;1:表示相应中断是active状态;写:0:无效1:把相应中断设置为active状态,如果中断已处于Active状态,则写入无效

GICD_ICACTIVERn Interrupt Clear-Active Registers

位域 读写 描述
31:0 Clear-active bits R/W 读:0:表示相应中断不是active状态;1:表示相应中断是active状态;写:0:无效1:把相应中断设置为deactive状态,如果中断已处于dective状态,则写入无效

GICD_IPRIORITYRn Interrupt Priority Registers

位域 读写 描述
31:24 Priority, byte offset 3 R/W
23:16 Priority, byte offset 2 R/W
15:8 Priority, byte offset 1 R/W
7:0 Priority, byte offset 0 R/W

对于每一个中断,都有对应的8位数据用来描述:它的优先级。每个优先级字段都对应一个优先级值,值越小,相应中断的优先级越高
对于一个中断,如何设置它的优先级(Priority),首先找到对应的GICD_IPRIORITYRn寄存器,即n是多少?还要确定使用这个寄存器里哪一个字节。
对于interrtups ID m,如下计算:
n = m DIV 4,GICD_IPRIORITYRn里的n就确定了;
GICD_IPRIORITYRn在GIC内部的偏移地址是多少?0x400+(4*n)
使用GICD_IPRIORITYRn中4个字节中的哪一个来表示interrtups ID m的优先级?
byte offset = m mod 4。
byte offset 0对应寄存器里的[7:0];
byte offset 1对应寄存器里的[15:8];
byte offset 2对应寄存器里的[23:16];
byte offset 3对应寄存器里的[31:24]。

GICD_ITARGETSRn Interrupt Processor Targets Registers

位域 读写
31:24 CPU targets, byte offset 3 R/W
23:16 CPU targets, byte offset 2 R/W
15:8 CPU targets, byte offset 1 R/W
7:0 CPU targets, byte offset 0 R/W

对于每一个中断,都有对应的8位数据用来描述:这个中断可以发给哪些CPU。处理器编号从0开始,8位数里每个位均指代相应的处理器。例如,值0x3表示将中断发送到处理器0和1。当读取GICD_ITARGETSR0~GICD_ITARGETSR7时,读取里面任意字节,返回的都是执行这个读操作的CPU的编号。
对于一个中断,如何设置它的目杯CPU?优先级(Priority),首先找到对应的GICD_ITARGETSRn寄存器,即n是多少?还要确定使用这个寄存器里哪一个字节。
对于interrtups ID m,如下计算:
n = m DIV 4,GICD_ITARGETSRn里的n就确定了;
GICD_ITARGETSRn在GIC内部的偏移地址是多少?0x800+(4*n)
使用GICD_ITARGETSRn中4个字节中的哪一个来表示interrtups ID m的目标CPU?
byte offset = m mod 4。
byte offset 0对应寄存器里的[7:0];
byte offset 1对应寄存器里的[15:8];
byte offset 2对应寄存器里的[23:16];
byte offset 3对应寄存器里的[31:24]。

GICD_ICFGRn Interrupt Configuration Registers

位域 读写 描述
[2F+1:2F] Int_config, field F R/W 对于每一个中断,都有对应的2位数据用来描述:它的边沿触发,还是电平触发。对于Int_config [1],即高位[2F + 1],含义为:0:相应的中断是电平触发;1:相应的中断是边沿触发。 对于Int_config [0],即低位[2F],是保留位。

对于一个中断,如何找到GICD_ICFGRn并确定相应的位域F?

对于interrtups ID m,如下计算:
n = m DIV 16,GICD_ICFGRn里的n就确定了;
GICD_ICACTIVERn 在GIC内部的偏移地址是多少?0xC00+(4*n)
F = m mod 16。

ICPIDR2 Identification registers: Peripheral ID2 Register

位域 读写 描述
[31:0] - R/W 由实现定义
[7:4] ArchRev R 该字段的值取决于GIC架构版本:0x1:GICv1;0x2:GICv2。
[3:0] - R/W 由实现定义

GICC_CTLR CPU Interface Control Register

此寄存器用来控制CPU interface传给CPU的中断信号。对于不同版本的GIC,这个寄存器里各个位的含义大有不同。以GICv2为例,有如下2种格式:


以“GIC2 with Security Extensions, Non-secure copy”为例,GICC_CTLR中各个位的定义如下:

位域 读写 描述
[31:10] - 保留
[9] EOImodeNS R/W 控制对GICC_EOIR和GICC_DIR寄存器的非安全访问:0:GICC_EOIR具有降低优先级和deactivate中断的功能;对GICC_DIR的访问是未定义的。1:GICC_EOIR仅具有降低优先级功能;GICC_DIR寄存器具有deactivate中断功能。
[8:7] - 保留
[6] IRQBypDisGrp1 R/W 当CPU interface的IRQ信号被禁用时,该位控制是否向处理器发送bypass IRQ信号:0:将bypass IRQ信号发送给处理器;1:将bypass IRQ信号不发送到处理器。
[5] FIQBypDisGrp1 R/W 当CPU interface的FIQ信号被禁用时,该位控制是否向处理器发送bypass FIQ信号:0:将bypass FIQ信号发送给处理器;1:旁路FIQ信号不发送到处理器
[4:1] - 保留
[0] - R/W 使能CPU interface向连接的处理器发出的组1中断的信号:0:禁用中断信号1:使能中断信号

GICC_PMR Interrupt Priority Mask Register

提供优先级过滤功能,优先级高于某值的中断,才会发送给CPU。

位域 读写 描述
[31:8] - 保留
[7:0] - R/W 优先级高于这个值的中断,才会发送给CPU

[7:0]共8位,可以表示256个优先级。但是某些芯片里的GIC支持的优先级少于256个,则某些位为RAZ / WI,如下所示:
如果有128个级别,则寄存器中bit[0] = 0b0,即使用[7:1]来表示优先级;
如果有64个级别,则寄存器中bit[1:0] = 0b00,即使用[7:2]来表示优先级;
如果有32个级别,则寄存器中bit[2:0] = 0b000,即使用[7:3]来表示优先级;
如果有16个级别,则寄存器中bit[3:0] = 0b0000,即使用[7:4]来表示优先级;
注意:imx6ull最多为32个级别

GICC_BPR Binary Point Register

此寄存器用来把8位的优先级字段拆分为组优先级和子优先级,组优先级用来决定中断抢占。

位域 读写 描述
[31:3] - 保留
[2:0] Binary point R/W 此字段的值控制如何将8bit中断优先级字段拆分为组优先级和子优先级,组优先级用来决定中断抢占。更多信息还得看看GIC手册。

GICC_IAR Interrupt Acknowledge Register

位域 读写 描述
[31:13] - 保留
[12:10] CPUID R 对于SGI类中断,它表示谁发出了中断。例如,值为3表示该请求是通过对CPU interface 3上的GICD_SGIR的写操作生成的。
[9:0] Interrupt ID R 中断ID

GICC_EOIR Interrupt Register

写此寄存器,表示某中断已经处理完毕。GICC_IAR的值表示当前在处理的中断,把GICC_IAR的值写入GICC_EOIR就表示中断处理完了。

位域 读写 描述
[31:13] - 保留
[12:10] CPUID W 对于SGI类中断,它的值跟GICD_IAR. CPUID的相同。
[9:0] EOIINTID W 中断ID,它的值跟GICD_IAR里的中断ID相同

imx6ull中断体系之GICV2相关推荐

  1. Linux 内核中断体系 初探

    还是要先理解整个中断的体系,首先要理解对中断的含义 如果这是涉及到的软件的调试的话,没有接触过硬件的同学会对,gdb的调试中的中断有一定的认知 但是,这两个中断指的意思是不相同的,gdb的调试中的中断 ...

  2. 深入理解 x86/x64 的中断体系--IVT VS IDT

    实模式下的中断机制 中断向量表(IVT) 改变中断向量表地址 设置自己的中断服务例程 保护模式下的中断机制 查找 interrupt handler 入口 IDT 表中 descriptor 类型的检 ...

  3. 裸机篇 -- S5PV210的中断体系

        本帖主要通过外部中断实验来学习S5PV210的中断体系. S5PV210的中断体系结构 在官方datasheet -- S5PV210_UM_REV1.1 中的sections 04_inte ...

  4. TQ210——S5PV210中断体系

    TQ210--S5PV210中断体系 中断是指 CPU 在执行程序的过程中,遇到异常情况需要处理, CPU停 止当前程序的运行,保存当前程序运行处的必要参数,转去处理这些异常情况, 处理结束后再返回当 ...

  5. 卷一 内核源代码分析 第二章 异常 2.2.4 OMAP4的中断体系 图书试读版-请勿转载

    作者 crosskernel@gmail.com 2.2.4 OMAP4的中断体系 尽管已经宣布推出手机市场,但是作为移动处理器领域曾经的领袖, Ti在相当长的时间里总是抢先发布性能最强的新一代ARM ...

  6. STM32的中断体系和FSMC控制LCD-第3季第7部分视频课程-朱有鹏-专题视频课程

    STM32的中断体系和FSMC控制LCD-第3季第7部分视频课程-861人已学习 课程介绍         本课程是<朱有鹏老师单片机完全学习系列课程>第3季第7个课程,本课程详细讲解ST ...

  7. imx6ull中断系统 一

    Cortex-A7 中断系统简介 IRQ中断 复位中断(Rest), CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针. DDR 等等. 未定义 ...

  8. Linux系统对中断的处理

    百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041 资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone ...

  9. 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...

    <嵌入式linux应用程序开发完全手册>中断控制器操作(外部中断)学习笔记 一.ARM中断体系 当一个"异常"发生时,或者说当收到一个中断触发信号时,ARM9将会自动完 ...

最新文章

  1. SAP HUM 没有搬到Storage Type 923的HU能用HU02拆包?
  2. sea.js学习网址和书籍
  3. Shell 下记录程序运行时间
  4. Winform DataGridView列的单元格中动态添加图片和文字
  5. android 人生日历,android版人生日历日子怎么用 安卓版人生日历日子使用教程
  6. mysql from_unixtime_MySQL 数据库中日期与时间函数 FROM_UNIXTIME(), UNIX_TIME() ...
  7. web开发的跨域问题详解
  8. MVC教程第四篇:传递表单数据
  9. 动态滤波网络论文解读
  10. 刚装的matlab R2010a运行quad2d时提示找不到指定的程序! 提示信息: libmwblas: load error: csrot Caught
  11. 鬼泣最稳定的服务器,DNF95级版本国服环境下,鬼泣和红神谁更强?深度对比客观分析!...
  12. Android applicationId与包名的区别
  13. matlab角度和弧度的互换_MATLAB弧度与角度转换
  14. 奥斯汀计算机专业排名,德克萨斯大学奥斯汀分校计算机工程类专业排名
  15. USB数据端子 type-A/B/C
  16. JMeter BeanShell 应用
  17. 小米 未检测到任何互联网连接 因此不会自动重新连接
  18. 从零开始的Android:Android应用程序开发概述
  19. java 保存file_java保存文件
  20. 盘点苹果2016WWDC精彩看点, iOS 10官方细节要来了

热门文章

  1. IPv6基础介绍及常用命令盘点
  2. CSS 层叠样式表(2)
  3. 待办事项 数据库表设计
  4. 使用Python将OV7725的RGB565图像数据转换为jpg图像
  5. 2019最新Web前端经典面试试题及答案,持续更新
  6. python用七巧板图片画个图_画一个太大而不能放进一个七巧板的图像
  7. ML之ME:Best-KS分箱/KS值(分类预测问题中评价指标、数据分箱方法)的简介(KS与ROC的关系)、使用方法、案例应用之详细攻略
  8. python语言是解释型语言-解释型语言python
  9. django框架全解
  10. 一个计算机系统所完成的工作总量,教育测量与评价作业和答案