中断与 I/O 架构
描述中断与 I/O 的分离路径、架构设备清单、中断路由、端口 I/O、共享中断状态和数据移动方式。
译自microsoft/nvx · doc/design/2.4-interrupt-and-io-architecture.md。技术细节以英文原文为准。
如图 2.2 所示,中断和 I/O 走不同的路径。设备通过 PIC 和 IOAPIC 的中断请求线(IRQ)发出中断信号,由它们把中断投递给每个处理器的本地高级可编程中断控制器(LAPIC)。LAPIC 同时提供定时器。处理器通过端口 I/O 和 MMIO 访问设备,而批量数据和中断状态则通过客户机 RAM 传递。
图 2.2. 中断与 I/O 路径。
图中包含以下节点:虚拟处理器(每个处理器自带一个 LAPIC)、平台控制端口、固定 virtio-mmio 插槽、PIT 与 RTC(实时时钟)、客户机 RAM(中断状态页与描述符链)、PIC 与 IOAPIC(16 条 ISA 中断线)。节点之间的连线如下(箭头方向与原图一致):
- 虚拟处理器(每个处理器自带一个 LAPIC)
- 端口 I/O → 平台控制端口
- MMIO 配置与通知 → 固定 virtio-mmio 插槽
- 描述符与状态字 ↔ 客户机 RAM(中断状态页与描述符链)
- 固定 virtio-mmio 插槽
- 批量数据与状态位 ↔ 客户机 RAM(中断状态页与描述符链)
- 专用边沿中断 → PIC 与 IOAPIC(16 条 ISA 中断线)
- PIT 与 RTC(实时时钟)
- IRQ 0 和 IRQ 8 → PIC 与 IOAPIC(16 条 ISA 中断线)
- PIC 与 IOAPIC(16 条 ISA 中断线)
- 中断 → 虚拟处理器(每个处理器自带一个 LAPIC)
2.4.1 架构设备
基础芯片组恰好包含以下允许列表中的设备:
- 一个通用 PIC 和 IOAPIC。
- 所选后端的 LAPIC。
- 位于 IRQ 0 的 i8253 PIT。
- 锚定到 UTC 的通用可编程 CMOS 实时时钟(RTC)。
- 原始双向字节通道。
- 携带状态的关机端口。
- 客户机快照请求端口。
串口 UART、调试控制台端口、Hyper-V 电源管理、旧版游戏端口(gameport)、PCI、固件辅助设施,以及那些对客户机访问不存在的旧版端口作出响应的桩(标准 PC 缺失端口垫片)都不存在。
RTC 默认使用二进制编码十进制(BCD)、24 小时字段,状态寄存器 B 为 0x02。PIC、IOAPIC、PIT、RTC、LAPIC 和 VM 时间在每个后端上都使用通用的设备与状态单元机制。IOAPIC 的已保存状态包含每条输入线的置位电平,且路由会在恢复后重新评估,因此在后端重建期间,电平中断既不会丢失,也不会被当作边沿中断处理。时间 ABI 定义了 LAPIC 定时器、PIT 和 RTC 的行为。
2.4.2 中断路由
MP 表描述处理器、ISA 总线、IOAPIC 和旧版 IRQ 路由,它只路由 16 个 ISA 中断。机器配置不使用 ACPI 中断表。专用 virtio 中断采用高有效的边沿投递。没有 virtio 设备使用 RTC 的独占 IRQ 8,并且任何后端上都没有设备使用 IRQ 9、12 或 13。
2.4.3 端口 I/O
端口 I/O 服务于 PIC、PIT 和 CMOS RTC,以及最小化的平台控制设备。表 2.5 列出了平台控制端口。
表 2.5. 平台控制端口。
| 端口 | 功能 |
|---|---|
0xe9 |
字节通道数据 |
0xea |
字节通道状态与记录选择器 |
0xeb |
时间采样窗口 |
0x604 |
关机 |
0x605 |
快照请求与恢复确认 |
平台控制设备 定义了它们的行为。
2.4.4 共享中断状态
如表 2.6 所示,每个固定的 virtio-mmio 插槽在保留的共享状态页中拥有一个小端、自然对齐的 32 位字。
表 2.6. 共享中断状态字。
| 插槽 | 状态 GPA |
|---|---|
| 网络 | 0x30000 |
| 宿主文件系统 | 0x30004 |
| 启动控制台 | 0x30008 |
distro 块存储 |
0x3000c |
scratch 块存储 |
0x30018 |
| 控制台 | 0x3001c |
设备以顺序一致(sequentially consistent)的比较交换循环发布配置变更位和已用缓冲区位,并且只有在前一个字为零时才脉冲输出其中断。客户机驱动用顺序一致的交换把所有待处理位一次消耗并清零,因此稳态处理不会通过 MMIO 执行任何中断状态读取或确认。与该交换发生竞争的设备更新,要么被包含在交换出的值中,要么观察到零值、存储自己的位并发出新的边沿。设备复位和拆除会清零该字。快照静默阶段会在传输状态中保存待处理的值;恢复时把它写回而不重放边沿,机器契约则记录中断模式、页地址和页大小。
2.4.5 数据移动
设备配置和队列通知使用 MMIO。批量控制台、块存储、网络和文件系统数据通过客户机 RAM 中的描述符链传递,而不是通过 MMIO 窗口。