鐵人賽
當系統中存在 IOMMU ,使運行中的 VM(virtual machine)的 guest os 可以直接控制 I/O 設備。IOMMU 負責將 guest 實體地址轉換成機器的實體地址。
為了處理從 guest OS 設備所發出的 MSI,IOMMU 必須能夠將這些 MSI 重新定位到 IMSIC 中的 guest interrupt file。
因為來自設備的 MSI 只是記憶體的寫入,所以它們也會受到 IOMMU 用於其他寫入記憶體的地址轉換,但是 AIA 要求 IOMMU 對 VM 中的 MSI 進行特殊處理,部份原因是為了簡化軟體,部份原因是為了支援 memory-resident interrupt file。
對於系統中的 IOMMU 做出以下假設:
AIA 需要在設備 context 中新增以下欄位:
MSI 地址 mask 以及地址 patten 都是無符號整數,寬度與 guest 實體 page number 相同,也就是 12 bit。
為了支援將 I/O 設備的 MSI 直接傳送到 VM,而無需 hypervisor 干涉,IOMMU 必須能夠將 MSI 的 guest 實體地址轉換為機器中的 IMSIC guest interrupt file 的實際實體地址,如下所示:
這種地址轉換由在 IOMMU 中的 設備 context 配置的 MSI page table 控制(也就是 MSI page table)。每個 interrupt file 都占用 4KB 地址空間,所需的地址轉換是從 virtual page address 到 physical page addres,與 RISC-V 地址轉換相同。
來自設備的 memory 寫入,會通過寫入的 target 地址來判別 MSI,如果 IOMMU 確定寫入的 MSI 是到相對應的 VM 中的 interrupt fule 位置,則該寫入被視為 VM 的 MSI。後面幾天會介紹如何判別寫入的 target 地址被判為 MSI 。