iommu-spec 要點


iommu-spec 要點

術語和硬件結構

Context

狀態的硬件表示,用於標識設備和設備分配到的domain.

PCI-E連接在北橋上,北橋內部也有可能集成設備. PCI legacy設備連接在南橋上.

DMA & Interrupt Remapping就發生在北橋中,PCI-E & 南橋與處理器之間.

Overview

VMM支持的4種IO虛擬化model:

  1. 純軟件模擬,兼容性很好,性能很差
  2. 類似於virtio,兼容性很差(需要host和guest都有特定的驅動支持),性能有所提升
  3. 類似於VFIO的透傳設備方式,minimal or no VMM involvement,性能最好
  4. 將IO設備的不同function分配給不同的VM,能提供比物理硬件更多的虛擬IO設備

VT-D為VMM提供了以下硬件支持:

  1. IO設備透傳,支持分離和保護設備
  2. DMA重映射,即來自設備的DMA訪問會經過地址翻譯
  3. 中斷post,即將中斷傳送給特定vcpu
  4. 穩定性,記錄DMA和中斷的嚴重錯誤,方便恢復系統

該spec中,domain指的Platform抽象的隔離環境,是host 物理內存分配的一個獨立區域。

DMA重映射為隔離設備訪問memory提供了硬件支持,並且DMA重映射允許每個設備都透傳到specific domain,domain和設備之間的聯系為獨立的,一系列的page_tables.當設備嘗試訪問system memory時,DMA重映射硬件利用這些page_tables翻譯出需要訪問的實際物理地址,並確定設備是否有全向訪問這部分memory. 頻繁使用的頁表會在硬件中cache.DMA重映射可以為每個設備單獨配置,也可以為一些設備統一配置。

OS對DMA重映射的利用方式

  1. 保護OS: 操作系統可以定義一個domain,將自己的核心代碼和數據結構放進去,限制系統中所有IO設備的訪問,這樣可以防止錯誤或無意的設備驅動錯誤導致系統崩潰,可以提高操作系統的穩定性.
  2. 支持傳統PCI設備訪問高端內存: 操作系統可以利用domain更好的管理legacy devices對高端內存(大於4G)的訪問,這種管理原理就是利用IO page table將這些設備的DMA映射到高端內存中。如果不使用這種方法,想要legacy devices想要訪問高端地址,只能依賴於操作系統提供的“跳躍緩存機制”。
  3. DMA隔離: 操作系統可以創建多個domain,為每個domain透傳一個或多個設備,每個設備驅動將自己的io-buffer顯式地注冊到OS,OS將這些io-buffer透傳到特定的domain,使用硬件強制完成DMA domain的保護。
  4. 對於支持PCI-E功能的設備,OS可以使用DMA重映射硬件功能與I / O設備共享應用程序進程的虛擬地址空間。 共享的虛擬內存以及對I / O page-fault的支持,使應用程序可以將任意數據結構自由地傳遞到圖形處理器或加速器等設備,而無需進行數據固定和編組的開銷。

VMM對DMA重映射的利用方式

如果使用設備直接透傳的方式,一方面可以提高虛擬機的IO性能,另一方面,虛擬機中的設備驅動也不需要特地為虛擬IO設備設計,只使用普通設備驅動即可。

設備直接透傳相比於純軟件模擬,虛擬機無需在每次IO訪問時都exit到VMM處理,而只需要在訪問被保護的IO資源時才由VMM接手,被保護的資源類似於: 配置設備時的IO訪問,中斷管理等。因為被保護的資源會影響系統功能和隔離功能。

為了支持設備直接透傳,VMM必須強制使用DMA Request的隔離。IO設備能被透傳給domain,重映射硬件能將來自該domain中的IO設備的DMA(access)限制在該domain的memory中。對於可能在分配后變換位置的domain,可以通過配置硬件實現在該情況下的地址翻譯。

IO設備透傳允許其它IO共享用途。例如,將IO設備透傳到為其它用戶partition提供IO服務的partition中,重映射硬件使虛擬化軟件可以選擇正確的透傳設備+純軟件模擬的虛擬化解決方案。

DMA 重映射也使能了基於SR-IOV和Scalable IOV的硬件,SR-IOV支持將單設備物理功能配置為能透傳到不同partition的多虛擬功能。Scalable IOV功能也類似,一個單功能設備可以被配置為支持多虛擬功能,這些虛擬功能能被透傳到不同的partition.

Guest對DMA重映射的利用方式

spec的這部分講了Remapping Hardware的虛擬化思路。

VMM可以將重映射硬件虛擬出來給Guest,VMM將Guest對重映射的訪問傳遞給重映射硬件寄存器,VMM管理一份對重映射硬件的訪問的數據結構的shadow備份即可。在更新Guest IO page-tables時,Guest軟件執行適當的虛擬無效操作,虛擬無效請求可以被VMM攔截,以更新相應的影子頁表並執行重新映射硬件的無效(以使重映射硬件執行影子頁表配置的重映射需求)。

由於錯誤DMA操作無法重啟,VMM不能使用lazy模式更新shadow 重映射數據結構。為了維持shadow重映射數據結構與Guest重映射數據結構的一致性,VMM需要將虛擬重映射硬件的請求級別提到最高,或者使用處理器內存管理機制對Guest重映射數據結構進行寫保護(可以提高該數據結構的同步頻率)。

重映射的硬件支持包含2級地址翻譯,第一級地址翻譯將GVA轉換為GPA,第二級地址翻譯將GPA轉換為HPA,VMM可以對Guest OS對第一級地址翻譯的使用進行虛擬化,不使用shadow IO頁表,但是通過配置硬件來執行第一級和第二級的地址翻譯嵌套操作。

DMA重映射和處理器memory虛擬化的聯系

DMA重映射和處理器memory虛擬化都由VMM提供,也就是說,DMA重映射時,被重映射的地址有可能是memory虛擬化之后的地址GPA,也有可能是虛擬化之前的地址HPA,具體由VMM的實現決定。

DMA重映射細節

DMA請求的類型

重映射硬件將來自Root-complex集成設備和來自PCI-E獨立設備的輸入memory請求分為2類:

  1. 不帶address-space-identifier的請求

    這類請求是來自endpoint devices的普通memory請求。這類請求的數據結構中會包含請求類型(read/write/atomic)、目標DMA地址/大小、發起請求的設備source_id(Bus/Device/Function).

  2. 帶address-space-identifier的請求

    這類請求是帶有額外信息的來自endpoint devices的memory請求,額外信息為目標地址空間標識。這類請求與上面的普通請求不同的是,含有很多額外屬性,有:目標進程地址空間標識符(PASID- target process address space identifier),還有可選的屬性,如執行請求標志(Exectue-Requested. ER),用來說明此次取的數據用於執行這些數據中的指令;特權模式請求標志(Privileged mode Requested. PR),用來說明此次請求由用戶還是超級管理員發起。具體需要看PCI-E spec里的Process Address space ID Capability.

為簡單起見,該spec將這些類別稱為沒有PASID的請求和帶有PASID的請求。 使用唯一的PASID標記DMA流請求,可實現I / O設備的可擴展且細粒度的共享,以及具有主機應用程序的虛擬內存的設備的操作。 后面的部分描述帶PASID的請求的這些用法。 在2.0版之前的本規范版本僅支持重新映射請求,而無需PASID。

Domains和地址翻譯

domain被定義為platform上的一個抽象環境,host物理內存的一個子集被分配到該domain中.允許訪問物理memory的IO設備會被分配給一個domain,並且以domain的設備來標識。對於虛擬化應用,軟件會將每個vm當做一個domain.

domain的隔離特性是通過禁止domain內的device訪問domain外的memory來實現的。多個相互隔離的domain在以下情況支持,即當所有IO設備都被透傳到一些domain,domain內的設備只能訪問domain內的物理資源。DMA重映射架構使包含任意數量domain的復雜IO透傳方案稱為可能。每個domain都擁有自己的address space。重映射硬件將接收到的DMA請求的地址看做DMA Address.取決於軟件應用模型,一個設備的
DMA地址空間可能是device被透傳到的vm的GPA地址空間,可能是host應用中DMA請求時的VA地址空間,可能是vm內的客戶端應用的GVA地址空間,被host軟件管理的IOVA地址空間,Guest軟件管理的GIOVA地址空間。以上這些情況下,DMA重映射將device發起的DMA請求中的地址轉換為對應的HPA.

上面的這張圖說明了DMA地址翻譯的情況。IO設備1和2分別被透傳到domain1和domain2,負責創建和管理domain的軟件(如qemu)為2個domain分配了物理memory,並且建立起DMA地址翻譯功能,由設備1和設備2發起的DMA請求中的地址由重映射硬件翻譯成對應的HPA.

可以看到,在domain1和domain2內部的軟件使用的VA都是一樣的,這個VA由CPU內存管理單元維護,但是2個domain對應的物理地址不同,收到domain內的DMA請求后,重映射硬件會將請求中的地址翻譯為Host物理地址。

Host platform可能支持一個或多個重映射硬件單元。每個硬件單元支持重映射在自己的硬件視野中看到的DMA請求地址。例如,一個桌面平台會將一個硬件重映射單元分配給處理器,以翻譯所有的DMA傳輸。具有一個或多個核心組件的服務器平台可以在每個組件中支持獨立的硬件轉換單元,每個轉換模塊都在其I / O層次結構(例如PCI Express根端口)中轉換DMA請求。該體系結構支持以下配置:根據軟件編程,這些硬件單元可以共享相同的轉換數據結構(在系統內存中)或使用獨立的結構。

重映射硬件在進一步的硬件處理(例如地址解碼,偵聽處理器緩存和/或轉發到內存控制器)之前,將請求中的地址轉換為主機物理地址(HPA)。

重映射硬件-軟件視野

重映射架構允許硬件實現支持單個PCI段組,以將重映射功能暴露給單個硬件單元覆蓋整個CPI段組,或作為多個硬件單元,每個支持互相排斥的PCI段組中的設備子集。例如,一種實現可能將一個硬件單元暴露出來以支持root bus上的單個或多個集成設備,其余硬件單元給一系列的PCI-E root ports上的設備用。BIOS將每個硬件單元報告給軟件。對於支持多個PCI段組的的硬件實現,重映射架構需要將獨立的重映射硬件單元(一個PCI段組至少一個)暴露出來,以處理每個段組中的請求。

將設備映射到domain

出現在地址轉換硬件上的每個inbound請求都需要標識發起該請求的設備。標識IO事務的發起者的屬性在本文檔中稱為“source-id”。重映射硬件可以以implementation-specific的方式確定事務的源ID。例如,某些IO總線協議可以提供原始設備身份作為每個IO事務的一部分。在其他情況下(例如,對於Root-Complex集成設備),可以基於Root-Complex內部實現中繼承source-id。
對於PCI Express設備,source-id是PCI Express事務層header中的請求者標識符。設備的請求者標識符由其PCI Bus/Device/Function編號組成,由配置軟件分配,並唯一標識發起請求的硬件功能。圖3-6說明了PCI Express規范中定義的Requester-id。

重映射數據結構

重映射硬件有2種地址翻譯模式,legacy和scalable模式,兩種模式的區別在於,scalable模式會將不帶PASID的請求轉換為帶PASID的請求,而legacy模式沒有該功能,其余功能差不多,均是利用多級table思想,進行地址翻譯。

  • Legacy Mode

下圖顯示了legacy模式下的多級Table思想。

Root Table的功能就是將設備映射到對應domain。Root Table的地址可以從 Root Table Address Register (RTADDR_REG)中讀取,Root Table含有256個entry,因為PCI bus number space是0-255,Root Table中的每個entry都指向對應的Context Table,后者代表的是該bus上的所有device,Context Table一共256個entry,而每個PCI device最多有8個function,一條PCI bus上最多有32個device,所有256個entry正好可以實現device[i]_function[j]的全映射,Context Table中的每個entry都將一個device 映射到對應的domain,source_id中的device和function_number就是用來在Context Table中找到對應entry的。可以通過編輯device對應的Context Table中的entry,使多個device映射進一個domain.

  • Scalable Mode

Scalable模式下的多級table與legacy模式類似,用Root Table來index PCI總線,但是Context Table分為lower和upper context table,分別用於index某PCI總線上的0-15號設備和16-31號設備,每個context table的entry指向Scalable mode下的PASID Directory,PASID Directory中的entry中包含指向一級頁表和二級頁表的指針。一二級頁表用於翻譯DMA地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM