APLIC 是 RISC-V 高级中断架构的核心组件,用于集中管理系统中所有外部中断源。它支持两种中断传递模式:
一、中断源与中断标识
1.中断源编号
2.中断域(Interrupt Domains)
二、内存映射控制区域
APLIC 的控制寄存器通过内存映射访问,每个中断域对应独立的内存区域,主要包含以下功能模块:
1. 域配置(domaincfg)
2. 源配置(sourcecfg[1..1023])
3. MSI地址配置
三、中断挂起与使能管理
1.挂起位操作
2.使能位控制
四、中断传递机制
1. 直接传递模式
2. MSI转发模式
五、同步与原子性
六、复位与初始化
设计意义与功能特点
1.灵活性与可扩展性
APLIC 的多域设计和MSI模式支持,使其适用于从嵌入式到数据中心的多样化场景,尤其在虚拟化环境中可为每个虚拟机分配独立中断域。
性能优化
批量操作寄存器和原子化指令减少了中断处理延迟,适合高吞吐量场景(如网络数据包处理)。
2.虚拟化支持
MSI模式与IOMMU结合,允许客户机直接管理设备中断,减少Hypervisor介入,提升性能。
3.兼容性考虑
保留传统直接传递模式,兼容旧有软件;同时支持PLIC兼容模式(eidelivery=0x40000000),平滑过渡到新架构。
在RISC-V系统中,PLIC 处理外部中断是通过线中断而非MSI(message signal interrupt) 的方式,当系统的hart不具有IMSIC时,hart本身不支持MSI,因此所有的外部中断必须通过 PLIC。即使hart具有IMSIC,且大多数的中断使用 MSI 的方式,但有些设备还是以线中断的方式发出。特别是对于不需要在系统中启动总线事务的设备,支持MSI的成本较高,因此使用线中断时成本较低的选择。与MSI不同,当前计算机平台普遍支持线中断。这也是许多商用设备或控制器选择线中断而非MSI的另一个原因,除非实现像PCIe那样规定MSI的标准。
Advanced PLIC(以下简称 APLIC) 不向下兼容,也就是说不与RISCV PLIC兼容。完整的AIA架构是需要APLIC这个组件的。只要向 hart 发送 interrupt 是使用 wire interrupt 而不是 MSI,就可以使用 PLIC 建立一个可行的系统。不过,假设系统中不需要支持MSI,使用原有的PLIC也是可行的。
在不包含IMSIC的系统中,只会有一个PLIC或者APLIC,作为系统的外部中断控制器,将中断发送到每一个hart中。APLIC与每个hart之间采用独享的中断线连接,每个特权等级都对应一根中断线。
在包含IMSIC的系统中,IMSIC作为每个hart的外部中断控制器,其只接收MSI中断。在这种情况下,APLIC角色发生变化,不再充当hart的外部中断控制器,其作用为将线中断转换丞MSI中断发送到IMSIC中。当 hart具有IMSIC时,系统可能包含多个APLIC,用于将wire interrupt转换为MSI,每个APLIC对应一组外设。
一个APLIC支持固定数量的中断源,这些中断源分别对应APLIC模块的物理中断线输入。通常,每个中断源的输入线都会连接一个设备或是设备控制器的输出中断线。对于电平触发的中断,可以将多个外设的中断线相或接入到APLIC的输入中断线上。当APLIC的输入中断线固定设置为0或者1,则该中断源通常配置为Detached模式。
每个APLIC的interrupt source都有一个唯一标识号(ID),范围为1到N,其中N是APLIC的源总数。0表示不是APLIC的有效中断标识号。APLIC可以支持的最大interrupt source为1023。
当 APLIC 将中断直接传递给 harts(不是将中断当作 MSI 转发)时,APLIC是该harts的外部中断控制器,并且APLIC的interrupt ID直接成为该中断的minor ID,并附带软件配置的优先级。
当APLIC通过MSI转发中断时,软件会为每个中断源的MSI配置一个新的interrupt ID。因此,在这种情况下,APLIC interrupt ID只区分APLIC的诸多输入interrupt,到IMSIC时就会使用软件配置的interrupt ID。
APLIC支持一个或多个interrupt domain,每个domain分别对应一组hart的某一特权等级(machine或者supervisor level),可以触发组内hart的对应特权等级的中断。每个domain都有各自的物理地址内存映射的控制区域,控制一个完整独立的APLIC。
下图是一个最简单的系统,只有一个hart并且不支持S mode,只有一个machine level的interrupt domain。
下图为SMP系统基本架构,其中hart支持S mode,并且具有多个hart,在这种情况下,APLIC通常会为supervisor level提供一个独立的interrupt domain,此interrupt domain允许操作系统直接在S态处理接收到的中断,避免调用M mode来处理中断,提高处理中断的效率。
APLIC的中断域是一个树状结构,根域总对应的是machine level。输入的线中断首先进入根中断域。每个中断域会有选择地将部分中断源进行委托给子中断域。需要注意的是不论在哪一个中断域,某一中断源的ID都是固定且一致的。对于根以下的中断域,未委托到该中断域的中断源对于该域来说表现为未实现。
下图显示了三个中断域的结构,两个在M level,一个在S level。当结合 PMP(physical memory pr