[A-26]ARMv8/v9-GIC的中断类型

ver0.1

前言

前一篇文章中,我们从总线的视角下认识了GIC,并且对GIC的系统架构做了浅入浅出的分析。现在大家脑海中在SOC的视角下应该对GIC已经有了基本的认识,这个是很关键的,不要搞了半天的中断,连发起中断的核心节点都不认识,那可不行。中断在一个系统中的地位,无论从硬件还是软件都值得我们花一点时间搞清他的模样。那么我们已经清楚了,GIC这个中断控制器因为SOC的规模等等因素会有不同的布局,但是无论怎么布局组件化的结构不会变,工作的模型和基本原理也不会变。本文我们将继续介绍GIC相关的基础概念,对这个控制器支持的中断类型做一下介绍,并围绕这些中断类型串联起GIC一些重要组件的功能介绍,为我们进一步理解中断子系统工作原理打下基础。本文涉及到很多基础知识做支撑,还是希望大家多读一读笔者的前序文章,先找找感觉:
(1) [V-02] 虚拟化基础-CPU架构(基于AArch64)
(2) [A-25]ARMv8/v9-GIC的系统架构(中断的硬件基础)

正文

1.1 中断类型

我们在讲解VMSA的时候,也有一篇专门的文章来讨论ARM内存模型的类型。这是一个本源的课题,因为不同的类型决定了内存模型支持属性不一样,进而导致内存模型在工作的时候行为也不一样,例如就不能对设备类型的内存区域做缓存处理、做可执行的标记、以及重排优化的访问等等,违反这些原则要么受到系统的惩罚,要么就要花费很多的软件维护成本来保证操作的一致性和准确性。那么我们在讨论中断的时候也是一样的方法论,先搞清楚中断的类型这个本源的问题,这样在进行后续讨论的时候,心里就有了大致的路线图。
先简单回顾一下GIC的系统架构,如图1-1所示。
1-1

图1-1 GIC-720AE 布局实例

在看一下手册中对720AE的介绍:

The GIC-720AE provides the following interrupt features:
• Support for the following interrupt types:
◦ Up to 56000 physical Locality-specific Peripheral Interrupts (LPIs). A peripheral generates these interrupts by writing to a memory-mapped register in the GIC-720AE.
◦ Direct injection of up to 56000 virtual LPIs for each virtual processing element (vPE), when the GIC is configured to support GICv4.1.
◦ Up to 1984 Shared Peripheral Interrupts (SPIs) in groups of 32.
◦ Up to 48 Private Peripheral Interrupts (PPIs) that are independent for each core and can be programmed to support either edge-triggered or level-sensitive interrupts.
◦ Up to 16 physical Software Generated Interrupts (SGIs) for each core, which the core generates through its GIC CPU interface.
◦ Direct injection of up to 16 virtual SGIs for each vPE, when the GIC is configured to support GICv4.1.
◦ Provides four logical views so that up to three different OSs within a system can be assigned a different view.
• Up to 32 Interrupt Translation Service (ITS) modules that provide device isolation and ID translation for message-based interrupts and enable virtual machines to program devices directly.
• Interrupt masking and prioritization with 32 priority levels, 5 bits for each interrupt.
• Interrupt types
◦ The GIC-720AE manages SPIs, SGIs, PPIs, and LPIs. When GICv4.1 is enabled, SGIs and LPIs can be injected into virtual Processing Elements (vPEs).

我们从GIC-720AE系统框图和核心Feature的介绍中可以看出GIC支持四种类型的中断,分别是SPIs、SGIs、PPIs、LPIs。还是看一下手册中对这4种中断类型的介绍:

Interrupt types
The GIC can deal with four different types of interrupt sources:
• Shared Peripheral Interrupt (SPI). Peripheral interrupts that can be delivered to any connected core.
• Private Peripheral Interrupt (PPI). Peripheral interrupts that are private to one core. An example of a PPI is an interrupt from the Generic Timer.
• Software Generated Interrupt (SGI). SGIs are typically used for inter-processor communication and are generated by a write to an SGI register in the GIC.
• Locality-specific Peripheral Interrupt (LPI). LPIs were first introduced in GICv3 and have a very different programing model to the other three types of interrupt. The configuration of LPIs is covered in the Arm CoreLink Generic Interrupt Controller v3 and v4: Locality-specific Peripheral Interrupts guide.

下面我们就对这些类型做一下介绍,看一下不同中断类型还关联了哪些知识点。

1.1.1 SPI (Shared Peripheral Interrupt)

前面我们说过,中断机制就是PE的信使,负责把外设的消息精确的投送给CPU。现代CPU的微架构已经变得越来越复杂,简单的说现在处理器单元的特点就是:异构、多核、大规模。本文不是讨论CPU对的微架构,大家只需要知道一个结论,SOC上的CPU单元越来越复杂,它有很多个PE-Cores,每个PE-Core都可以单独处理一个任务,从而让CPU整个体现出并发执行任务的能力。在这样的背景下,当一个中断信号到来的时候,就要解决第一个问题,到底应该让哪个PE-Core来响应这个中断,总不能让所有的PE-Cores都停下来处理这个中断信号。这也就是SPI这种类型中断的最大特点了,经过配置,外设发出的这种类型的中断可以被路由到任何一个PE-Core进行处理,如图1-2所示。
1-2

图1-2 SPI类型中断路由图

因为配置灵活,限制少,所以SPI是广大人民群众喜闻乐用的中断类型,不论是硬件还是软件设计中都会被大规模的使用,大家通常讨论的中断,其实多数情况下也是SPI类型的。

1.1.2 PPI (Private Peripheral Interrupt)

PPI中断是指私有外设中断,就是每个核心私有的中断。与SPI(Shared Peripheral Interrupt,共享外设中断)可以路由到多个CPU不同,PPI中断会特定地送达到指定的CPU上,主要就得突出私有的这个特点,PPI中断的主要应用场景包括CPU本地时钟等,如图1-3所示。
1-3

图1-3 PPI类型中断路由图

由于PPI中断是私有的,因此它们通常用于与特定CPU紧密相关的任务或功能,如本地时钟中断,这些中断需要被特定CPU及时响应和处理。可以这么理解PPI,这种类型的中断就是太重要了,属于中断中的VIP,必须要得到对应的PE-Core及时的处理。以Timer为例,为啥要每个PE-Core配置一个专属时钟,就是为了让PE-Core有机会能够更加公平的分配自己的计算资源。

1.1.3 SGI (Software Generated Interrupt)

SGI,即软件生成的中断,是通过软件写入到一个专门的寄存器(如GICD_SGIR寄存器)来触发的一个中断事件。这种中断主要用于核间通信,内核中的IPI(inter-processor interrupts,即处理器间中断)就是基于SGI实现的。SGI中断可以由任何一个处理器核心产生,并发送给系统中的其他一个或多个处理器核心,如图1-4所示。
1-4

图1-4 SGI类型中断路由图

SGI主要跟的工作场景,我们简单列举一下:
• 核间同步:通过SGI中断可以实现处理器核心之间的同步操作,确保各个核心在执行任务时的协调一致。
• 任务调度:在多核处理器系统中,SGI中断可以用于任务调度,将一个核心上的任务调度到其他核心上执行。
• 错误处理:当某个处理器核心检测到错误时,可以通过SGI中断通知其他核心进行错误处理或采取相应的补救措施。

1.1.4 LPI (Locality-specific Peripheral Interrupts)

先看一段手册中的描述:

Locality-specific Peripheral Interrupts (LPIs) are edge-triggered message-based interrupts that can use an Interrupt Translation Service (ITS), if it is implemented, to route an interrupt to a specific Redistributor and connected PE.
GICv3 provides two types of support for LPIs. LPIs can be supported either:
• Using the ITS to translate an EventID from a device into an LPI INTID.
• By forwarding an LPI INTID directly to the Redistributors, using GICR_SETLPIR.

LPI是基于消息的中断,它可以有两种触发⽅式:
(1) 使⽤ITS将device ID和event ID转换为LPI的中断ID,如图1-5所示。
1-5

图1-5 LPI类型中断路由图

(2) 通过写GICR_SETLPIR寄存器直接将LPI中断号转发到redistributor上。

基于内存地址的中断,也称之为基于消息的中断,由外设写⼀个内存地址产⽣,这个内存地址⼀般映射⾄GICITS内部的translator寄存器。ITS接收外设写⼊的数据后进⾏翻译,然后再向特定redistributor产⽣⼀个中断。该类型中断是⼀种基于消息的中断,外设不需要通过硬件中断线连接到GIC上,⽽可以向特定地址写⼊消息来触发中断。笔者认为,这种类型的中断机制的设计,主要目的就是ARM进军大规模集成PE-Core的场景,比如PC和服务器等,Intel是不是得有点危机感了啊。为了篇幅的完整性,这里我们只做简单描述,后面会规划具体的文章仔细的讲解这种比较新颖的中断类型。

1.2 中断标识符(INTID)

这部分比较好理解,每个中断后面都关联着一个设备,哪怕是PE-Core之间的中断也得有确认身份的途径。别人打过来一个电话,总得知道对方是谁吧,ARM的设计就比较简单,直接分配“电话号码”,一个整型值,如图1-6所示。
1-6

图1-6 各类型中断的ID范围

1.3 设备发射中断的方式

设备(PE-Core)需要和CPU进行通信的时候,都会发出中断信号,这个信号需要经过两个阶段才能最终到达CPU那里。第一个阶段就是设备或者PE-Core将中断请求抛到GIC的核心组件(Distributor\ITS\Redistributor)上,如图1-7所示;第二阶段、GIC通过CPU对的Interface将中断请求路由到相应的PE-Core进行处理。
1-7

图1-7 GIC一般设备中断通知模型

通过图1-7以及1.1中对各种中断类型的介绍,我们可以将上面的第一个阶段,也就是设备发出中断请求到GIC这一段归类为设备发射中断的阶段。这个阶段的设备有两种方式可以发射中断信号:信号的方式、消息的方式。
信号的方式可以抽象成图1-8的样子。
1-8

图1-8 信号方式的中断

信号型方式的最大特点是,设备需要和GIC有超越总线以为的硬线连接,中断信号的传递不经过SOC总线,一般在小规模SOC上应用比较广泛,如图1-9中的实例。
1-9

图1-9 ARMv8a 系统架构

消息型的中断方式和信号型的发射方式最大的不同就是外设发出的中断请求是要经过系统的一致性总线的,对于GIC和设备的驱动方式和传统的信号型都不一样,如图1-10所示。
1-10

图1-10 消息型中断发射方式

关于消息型通信方式的原理需要一些总线方面的知识,其实也可以通过VMSA的物理地址空间的概念去理解,这一部分我们不展开讨论了。道理是相通的,大家可以看前序的文章:
(1)[A-14]ARMv8/ARMv9-Memory-内存模型的类型(Device & Normal)

结语

本文我们介绍了GIC支持的中断类型,对每种类型的中断特点已经应用场景做了介绍。后面对GIC标识符已经发射中断的方式也做了归类介绍。其实本篇成文之后,篇幅实在是太长了,所以截取一部分独立成文,哈哈哈。请大家保持关注,下一篇我们会结合ARM的执行状态进一步研究GIC的核心组件。

Reference

[00] <Armv8-A-virtualization.pdf>
[01] <DEN0024A_v8_architecture_PG.pdf>
[02] <learn_the_architecture_aarch64_exception_model.pdf>
[03] <corelink_gic_720ae_generic_interrupt_controller_trm.pdf>
[04] <arm_generic_interrupt_controller_v3_and_v4_virtualization_guide.pdf>
[05] <learn_the_architecture_generic_interrupt_controller_v3_and_v4_lpis.pdf>
[06] <80-ARM-GIC-wx0005_Arm-gicv3_v4学习这一篇就够了.pdf>
[07] <80-ARM-GIC-wx0003_ARM架构Generic-Interrupt-Controller-GIC之Distributor和CPU-interface.pdf>
[08] <80-ARM-GIC-HK0001-一文搞懂GICv3中断控制器的工作原理.pdf>
[09] <80-ARM-GIC-wx0001_ARM-gicv3_gicv4的总结-基础篇.pdf>
[10] <80-ARM-INT-yk0001_万字长文玩转中断:从硬件看中断之GIC.pdf>
[11] <learn_the_architecture_generic_timer.pdf>

Glossary

GIC - Generic Interrupt Controller
SCMI - System Control and Management Interface (SCMI)
ACPI - Advanced Configuration and Power Interface (ACPI)
PSCI - Power State Coordination Interface (PSCI)
UEFI - Unified Extensible Firmware Interface (UEFI)
UART - Universal Asynchronous Receiver/Transmitter
SPI - Shared Peripheral Interrupt
PPI - Private Peripheral Interrupt
SGI - Software Generated Interrupts
MPAM - Memory System Resource Partitioning and Monitoring
LPI - Locality-specific Peripheral Interrupt (LPI)
PE - Processing Element
MSI - message-signaled interrupts (MSI)
IAR - Interrupt Acknowledge Registers
EOIR - End of Interrupt Registers
IRM - Interrupt Routing Mode
ITS - Interrupt Translation Service
ITT - Interrupt Translation Tables
vPE -virtual processing element
IPI - inter-processor interrupts
IRI - Interrupt Routing Infrastructure

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值