本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。
将X86(Local APIC+I/O APIC)与RISC-V(IMSIC+APLIC)进行对比。
1 组件对比
X86:
- Local APIC(Local Advanced Programmable Interrupt Controller,本地高级中断控制器),位于CPU中,每个core都有一个自己的LAPIC。
- IOAPIC(I/O Advanced Programmable Interrupt Controller,I/O 高级中断控制器),通常位于外部设备芯片上,例如南桥上。像PIC 一样,连接各个产生中断的设备。
RISC-V:
- IMSIC(Incoming Message-Signaled Interrupt Controller),位于CPU中,每个Hart都有一个自己的IMSIC。
- APLIC(Advanced Platform-Level Interrupt Controller),APLIC的任务是收集和处理中断,然后将这些中断以线连接或者MSI的方式传递给hart。
IMSIC的作用,相当于X86中Local APIC;
APLIC的作用,相当于X86中IOAPIC。
为处理外部中断,X86中Local APIC+I/O APIC的组合,与RISC-V中IMSIC+APLIC,非常相似。
2 处理对比
对外部中断的处理,可以从下图,进一步对比:
- 外部中断进入APLIC(或IOAPIC),转换为MSI消息;
- 判断IOMMU是否启用
- 若启用,则对MSI进行转换,结果依然是MSI消息,再传递到IMSIC(Local APIC);
- 若禁用,则直接传递到IMSIC(Local APIC)。
- MSI消息进入Hart(Core)中的IMSIC(Local APIC)后,进行处理,会将中断对应的pending置位等,以便软件检测到中断,进而进入中断服务程序。
3 X86中断架构参考文档
- 《计算机中断体系一:历史和原理》
- 《x86_64 架构中的APIC概述》
- 《汇编学习笔记(26) - APIC》
- 《【x86架构】APIC – 高级可编程中断控制器》