虚拟化中设备直通的实现 (2)

下面以Intel VT-d技术为例介绍硬件对于中断重映射的支持。
为了支持中断重映射,需要对中断源进行升级,包括(I/O APIC,MSI,MSI-X),让中断重映射硬件能够从中断消息中提出中断重映射表的索引。因此VT-d设计了可重映射的中断消息格式。

虚拟化中设备直通的实现

中断重映射硬件能够通过handle与subhandle计算出中断在中断重映射表的索引值。
为了让中断重映射硬件知道中断重映射表的位置,需要在HV初始化的时候分配一块区域作为中断重映射表,并将该区域写入中断重映射表地址寄存器。
中断重映射表里的中断重映射条目(IRTE)如下

虚拟化中设备直通的实现

MSI中断发送流程

先介绍MSI中断的发送流程

PCIe 设备在发送 MSI/MSI-X中断请求之前,系统软件需要合理设置PCIe设备MSI/MSI-X Capability 寄存器,使 Message Address寄存器的值为0xFEExx00y,同时合理地设置 Message Data寄存器Vector字段。

PCIe设备提交MSI/MSI-X中断请求时,需要向0xFEExx00y地址写Message Data寄存器中包含的数据,并以存储器写TLP的形式发送到RC。当桥片收到这个TLP后,发现这个TLP的目 的地址在系统总线Interrupts存储器空间中,则将PCIe总线的存储器写请求转换为系统总线Interrupt Message总线事务,并在系统总线上广播。

系统总线上的CPU,根据APIC ID信息,选择是否接收这个Interrupt Message总线事务,并进入中断状态,之后该CPU将直接从这个总线事务中获得中断向量号,执行相应的中断服 务例程,而不需要从APIC中断控制器获得中断。

虚拟化中设备直通的实现

设置中断重映射表

以MSI中断为例,为了之后使用MSI中断,操作系统启动时需要对PCI配置空间中的MSI capability进行设置,包括:

读取设备的消息控制寄存器的Mulitple Message Capable栏位获得设备支持的消息数量以及是否支持64bit消息地址。然后使能对应的enable bit。

分配base message data pattern以及Message Address。

最后使能MSI enable bit并关闭其它的中断选项。
当虚拟机设置直通设备的MSI(X)信息时,将触发VM-Exit,此时HV可以设置中断重映射表,并向Message Address中写入可重映射的中断消息。
当在Message Address中写入可重映射的中断消息后,设备发送MSI中断时将发送这个中断消息到总线上,VT-d硬件能够读懂这个消息,并利用可重映射的中断消息索引出中断重映射条目,将其发送给LAPIC。

DMA重映射

DMA重映射的实现介绍正在整理中。

参考资料


https://kernelgo.org/armv8-virt-guide.html
https://kernelgo.org/vfio-insight.html
https://github.com/minosproject/minos
PCIE_Base_Specification_Revision_4_0_Version 1_0.pdf
vt-directed-io-spec.pdf
https://zhuanlan.zhihu.com/p/326412992
https://luohao-brian.gitbooks.io/interrupt-virtualization/content/vt-d-dma-remapping-fen-xi.html
https://zhuanlan.zhihu.com/p/194244760

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzyfgy.html