vt-d spec
通用平台的拓撲
2.2 VMM和虛擬機
VMM - qemu
guest software - 虛擬機里運行的軟件(guest os + app)
2.3. 處理器虛擬化 - VMX
2.4 IO虛擬化
Emulation - 純粹軟件模擬, 比如e1000模擬的網卡
New Software Interfaces - 比如 SRIOV
Assignment - 直接物理IO 設備分給VM
I/O Device Sharing - IO設備共享,SRIOV/SIOV
2.5 Intel® Virtualization Technology For Directed I/O
IO虛擬化的要求,隔離和限制資源訪問
I/O device assignment -
DMA remapping - DMA地址轉換
Interrupt remapping: - 隔離並路由正確的中斷到|VM
Interrupt posting - 直接投遞中斷
Reliability - 記錄和報告 DMA/中斷的錯誤
2.5.1 Hardware Support for DMA Remapping
DMA-remapping 硬件截獲系統內存訪問,利用頁表,決定訪問是不是不允許,以及訪問的實際位置。
常用的分頁結構可以緩存在硬件中。 DMA重新映射可以為每個設備獨立配置,也可以跨多個設備共同配置。
2.5.1.1 OS Usages of DMA Remapping
操作系統保護:操作系統可以定義一個包含其關鍵代碼和數據結構的domain,並限制系統中所有I / O設備對該domain的訪問。 這允許操作系統通過設備驅動程序對設備進行不正確的編程來限制其數據和代碼的錯誤或意外損壞,從而提高了操作系統的健壯性和可靠性。
功能支持:操作系統可以使用domain來更好地管理從舊版設備到高內存的DMA(例如,訪問4GB以上內存的32位PCI設備)。 這是通過對I / O頁表進行編程以將DMA從這些設備重新映射到高內存來實現的。 沒有這樣的支持,軟件就必須通過OS的“反彈緩沖區(bounce buffers)”來復制數據。
DMA隔離:OS可以通過創建多個domain並將一個或多個I / O設備分配給每個域來管理I / O。每個設備驅動程序都會在操作系統中顯式注冊其I / O緩沖區,然后操作系統會使用硬件實施DMA域保護,從而將這些I / O緩沖區分配給特定的domain。請參見圖2-2。
共享虛擬內存:對於支持適當PCI Express1功能(PCI Express *基本規范中的進程地址空間ID - PASID功能)的設備,操作系統可以使用DMA重映射硬件功能與I / O設備共享應用程序進程的虛擬地址空間。共享的虛擬內存以及對I / O頁面故障的支持,使應用程序可以將任意數據結構自由地傳遞到圖形處理器或加速器等設備,而無需進行數據固定和編組的開銷。
圖2-2
2.5.1.2 VMM Usages of DMA Remapping
DMA重新映射的硬件支持可實現設備直接分配,而無需或者最小VMM接入(配置空間和中斷管理), VMM不需要感知設備的特殊知識。
IO設備分配,可以IO共享。一個IO分區的設備,可以給其他分區提供分享。
2.5.1.3 DMA Remapping Usages by Guests
VMM可以將重新映射的硬件虛擬化給guest。
VMM可以攔截來賓對虛擬重映射硬件寄存器的訪問,並管理guest的重映射結構的影子拷貝。來賓更新I / O頁表時,來賓軟件執行適當的虛擬無效操作。虛擬無效請求可以被VMM攔截,以更新相應的影子頁表並執行重新映射硬件操作。
由於故障DMA事務的不可重啟性(與CPU內存管理虛擬化不同),VMM無法對其影子重映射結構執行延遲更新。
為了使影子結構與來賓結構保持一致,VMM可能會以急切的預取行為(包括緩存不存在的條目)暴露虛擬重映射硬件,或使用處理器內存管理機制對guest重映射結構進行寫保護。
在支持兩級地址轉換(將虛擬地址重新映射到guest物理地址的第一級轉換,以及將guest物理地址重新映射到host物理地址的第二級轉換)的硬件實現上,VMM可以通過配置硬件以執行第一級和第二級的嵌套地址轉換,而不需要影子頁表來虛擬化guest操作系統對第一級轉換。
2.5.2 Hardware Support for Interrupt Remapping
通過是能中斷的重映射,實現分區隔離。
2.5.2.1 Interrupt Isolation
RC(Root-Complex) 通過在地址范圍(0xFEEx_xxxxh)的寫事務來標識中斷請求。
中斷是自描述的(中斷請求的屬性,編碼在請求的地址和數據中), 允許任何DMA啟動器來生成具有任何屬性的中斷消息。
VMM利用中斷重映射實現domain中間的外部中斷隔離。 利用中斷重映射硬件,來區分來自特定設備的中斷,並將其路由到分配了該設備的VM上。
VMM還可以利用中斷重映射硬件來控制這些中斷請求的屬性,例如目標CPU,中斷向量,傳送模式等。
VMM還可以使用中斷重映射硬件來區分外部中斷與VMM擁有的處理器間中斷(IPI)。軟件可以 通過 任何外部重映射中斷的屬性(例如向量號)都不匹配VMM IPI的屬性 來確認。
2.5.2.2 Interrupt Migration
中斷重映射體系結構通過中斷的動態重定向, 來實現中斷請求目的從一個邏輯處理器遷移到另一個上。
如果沒有中斷重映射硬件支持,需要軟件對中斷源進行重新編程。 但是,這些資源的重新編程是非原子性的(要求要重新編程多個寄存器),通常很復雜(可能需要臨時屏蔽中斷源),並且取決於中斷源的特性(例如,某些中斷源沒有屏蔽能力;在某些源上被屏蔽時,升降沿中斷可能會丟失)。
中斷重新映射使軟件能夠有效地重定向中斷,而無需在中斷源上重新編程配置。
OS軟件可以使用中斷遷移來平衡處理器之間的負載(例如,在運行I / O密集型工作負載時)。
通過中斷遷移, VMM可以實現將帶有設備分區的虛擬CPU在物理CPU之間進行遷移,以提高CPU利用率。
2.5.2.3 x2APIC Support
英特爾®64 x2APIC架構將APIC尋址能力擴展到32位(從8位)。 有關詳細信息,請參閱《英特爾®64體系結構軟件開發人員手冊,第3B卷:系統編程指南》(Intel® 64 Architecture Software Developer's Manual, Volume 3B: System Programming Guide)。
中斷重新映射使x2APIC支持外部中斷的擴展APIC可尋址性,而無需對中斷源(例如I / OxAPIC和MSI / MSIX設備)進行硬件更改。
2.5.3 Hardware Support for Interrupt Posting
通過硬件支持,優化處理直接分配給虛擬機的I / O設備(PF,SR-IOV的VF或英特爾® SIOV的可分配設備接口ADI,Assignable Device Interfaces )的中斷請求。
2.5.3.1 Interrupt Vector Scalability
來自分配給虛擬機的PF,VF 或 ADI 設備/資源的中斷請求被稱為虛擬中斷,因為它們針對已分配VM的虛擬處理器。
每個VF或ADI都需要其自己的獨立中斷資源,這比沒有I / O虛擬化的情況,需要更多的中斷向量。
沒有中斷投遞硬件支持,平台中的所有中斷源都映射到相同的物理中斷向量空間(Intel®64處理器上,每個邏輯CPU 8位向量空間)。
對於虛擬化用途,當虛擬進程與邏輯處理器之間沒有靜態親和時,在動態環境中跨虛擬處理器划分物理向量空間是一項挑戰。
對支持中斷投遞的硬件,通過允許來自分配給虛擬機的設備中斷請求在虛擬矢量空間中處理,從而自然地可隨虛擬機或虛擬處理器的數量進行中斷向量伸縮。
2.5.3.2 Interrupt Virtualization Efficiency
如果沒有硬件中斷post,需要通過VMM軟件處理分配給VM的設備中斷。
當CPU接收到發往VM的外部中斷時,控制權就會轉移到VMM,要求VMM處理並將相應的虛擬中斷注入虛擬機。VMM處理外部中斷相關的控制轉移會導致硬件和軟件開銷。
有硬件中斷post,設備(PF,VF或ADI)中斷被投遞(記錄)到VMM指定的內存描述符中,並根據中斷目標vCPU的運行狀態進行處理。
如果目標虛擬處理器可在任何邏輯處理器上運行,硬件可直接向虛擬處理器傳遞外部中斷,而無需任何VMM干預。
當目標vCPU被搶占(等待其運行)時收到的中斷可以由硬件累積在內存中,以便在以后調度vCPU時進行傳遞。這避免了在非運行VM的外部中斷到來打亂當前正在運行的vCPU的執行。
如果目標vCPU在中斷到達時暫停(空閑),或者如果中斷符合要求實時處理的條件,則硬件可以將控制權轉移給VMM,從而使VMM可以調度vCPU, 讓硬件直接傳遞pending的中斷到該vCPU。
基於目標vCPU狀態的中斷處理降低了對虛擬機的中斷總時延,並減少了VMM為虛擬化中斷而產生的開銷。
2.5.3.3 Virtual Interrupt Migration
為了優化整體平台利用率,VMM軟件可能需要動態評估最佳邏輯處理器以調度vCPU,導致跨CPU遷移vCPU。
對於帶有設備的虛擬機,跨邏輯處理器遷移vCPU會導致軟件中轉中斷帶來開銷(例如,通過VMM生成的IPI),或者會導致vCPU的每個中斷獨立遷移到新邏輯CPU的復雜性。
中斷post的硬件支持,使VMM軟件能夠在vCPU被調度到另一個邏輯處理器時,以原子方式對所有針對該vCPU的中斷進行遷移。
3 DMA Remapping
介紹用於DMA重新映射的硬件體系結構。該硬件將在集成到處理器組合(Complex)中的Root-Complex(RC)或核心邏輯芯片組組件中實現。
3.1 Types of DMA requests
DMA 可以是來自RC集成的device后者是PCI離散的設備。
共分兩類:
- 不帶有地址空間描述符的請求: 指定訪問類型(讀/寫/原子),目標DMA地址/大小以及發起請求的設備的源ID(BDF)。
- 帶有地址空間描述符的請求: 出來帶有PASID,還有可選屬性,例如Execute-Requested(ER)標志(以指示讀取為指令提取)和Privileged-Mode-Requested(PR)標志(以區分用戶訪問權限和超級訪問權限)。
3.2 Domains and Address Translation
DMA重映射將I / O設備發出的DMA請求中的地址轉換為其相應的主機物理地址(HPA)
3.3 Remapping Hardware - Software View
支持 PCI segment 組重映射(每個組一個重映射硬件),或者組中互斥設備子集的重映射。
可以是根總線上實現硬件重映射,也可以是PCIE root port上實現。
3.4 Mapping Devices to Domains
3.4.1 Source Identifier
對於RC設備,source-id基於RC內部實現派生。
對於PCIE設備,source-id就是BDF。從PCIE的傳輸層header中獲取。
3.4.2 Legacy Mode Address Translation
Root Table Address Register (RTADDR_REG)描述見 Section 10.4.6,
(RTADDR_REG.TTM is 00b), Root Table 是4-KByte大小,包含256個root-entries, 每個root-entry 指向一個context-table,包含256個context-entries.
Root-entry 格式描述見Section 9.1, context-entry 格式描述見Section 9.3.
3.4.3 Scalable Mode Address Translation
RTADDR_REG.TTM is 01b,
context-table 是4-KByte 大小,包含 128 scalable-mode context entries.
context-entries 支持requests-without-PASID 和 requests-with-PASID.
root-entry 格式描述見Section 9.2,context-entry 格式描述見 Section 9.4, PASID-directory-entry 格式描述見Section 9.5, PASID-table entry 格式描述見 Section 9.6.
3.5 Hierarchical Translation Structures
支持1級,2級和嵌套轉換。
層次結構中的每個分頁結構的大小均為4 KB,帶有512個8字節條目,,支持4級和5級頁表。
3.6 First-Level Translation
一級轉換將輸入地址限制為經典地址(即地址位63:N與地址位[N-1]具有相同的值,其中N是4級分頁的48位,而N是 5級分頁的57位)。重映射硬件對第一層轉換的請求將進行經典的地址檢查,作為進行第一層轉換的前提條件,將違反視為轉化錯誤。
3.6.1 Access Rights
3.6.2 Accessed, Extended Accessed, and Dirty Flags
這兩節在寫代碼時候關心吧。
3.7 Second-Level Translation
兩級轉換,就是整個一級轉換完,再去索引二級轉換。嵌套轉換,第一級的頁表除了PML4E,其他的都有第二級轉換索引到。
可以將Context entries和可伸縮模式PASID-Table entries配置為支持第二級轉換。對於Context entries,第二級轉換僅適用於沒有PASID的請求。
使用可伸縮模式的PASID-Table entries,可以將第二級轉換應用於所有請求(帶有或不帶有PASID),適用於嵌套轉換。
每個Context entries都包含一個指向第二級轉換結構基礎的指針。第9.3節描述了Context entries的確切格式。可伸縮模式Context entries引用可伸縮模式PASID結構。
每個可伸縮模式的PASID-Table entries都包含一個指向第二級轉換結構基礎的指針。
二級轉換將輸入地址限制為通過功能寄存器中的最大guest地址寬度(MGAW)字段 報告實現的地址寬度。輸入地址需要進行MGAW地址檢查,任何違規都將被視為翻譯錯誤。
第7章詳細介紹了故障情況及其對軟件的報告。
3.8 Nested Translation
5 Interrupt Remapping
中斷重映射體系結構包括中斷重映射和中斷post。
5.1 Interrupt Remapping
中斷重新映射架構使系統軟件能夠控制和審查由所有中斷源生成的外部中斷請求,包括來自中斷控制器(I / OxAPIC)的請求,支持MSI / MSI-X的設備(包括端點,根端口和Root-Complex集成終端)的請求。
由重映射硬件本身生成的中斷(故障事件和失效完成事件)不受中斷重映射的約束。
中斷請求在Root-Complex這里,顯示為對上游內存的中斷地址范圍0xFEEX_XXXXh寫入請求。
由於中斷請求作為寫請求到達RC,因此中斷重映射與重映射硬件單元(這里指DMA?)位於同一位置。 通過擴展功能寄存器可知道是否支持中斷重映射功能。
5.1.1 Identifying Origination of Interrupt Requests
就是第三節說的source-id
包括,來自各種RC/PCIE/PCI橋的MSI, 遺留的PIN中斷,以及其他的MSI(不如高精度時鍾,由ACPI描述)
5.1.2 Interrupt Request Formats On Intel® 64 Platforms
5.1.2.1 Interrupt Requests in Compatibility Format

5.1.2.2 Interrupt Requests in Remappable Format
5.1.3 Interrupt Remapping Table
中斷重映射硬件使用了 駐留在內存中的單級表(DMA都是多級頁表),稱為中斷重映射表。
中斷重映射表將由系統軟件創建,其基地址和大小通過中斷重映射表地址寄存器指定。
該表中的每個條目的大小均為128位,稱為中斷重映射表條目IRTE(Interrupt Remapping Table Entry)。第9.10節說明了IRTE格式。
對於中斷請求的可重映射格式,中斷重映射硬件將如下計算“ interrupt_index”。 Handle, SHV 和 Subhandle分別對應可重映射中斷格式中的地址或數據中的字段。
if (address.SHV == 0) { interrupt_index = address.handle; } else { interrupt_index = (address.handle + data.subhandle); }
中斷重映射表地址寄存器由軟件編程,並指定中斷重映射表中的IRTE數量(中斷重映射表中的IRTE的最大數量為64K)。
平台中的重映射硬件單元可以配置為共享中斷重映射表或使用獨立的表。
interrupt_index用於在中斷新映射表中索引適當的IRTE表項。
如果計算出的interrupt_index值等於或大於重映射表中IRTE的數量,則硬件視該中斷請求為錯誤。
兼容中斷格式, 所有中斷屬性都編碼在中斷請求的地址/數據中,而可重映射中斷格式僅指定了計算interrupt_index所需的字段。
重映射中斷請求的屬性在IRTE表項中指定,可以通過interrupt_index索引表項.
中斷重映射體系結構定義了對硬件對常用的IRTE緩存的支持,以提高性能。對於軟件可能需要動態更新IRTE的場景,體系結構定義了使IEC無效的命令。
第6章介紹了緩存結構和相關的無效命令。
5.1.4 Interrupt-Remapping Hardware Operation
硬件操作概覽:
- 硬件將中斷請求標識為DWORD大小的請求,寫入范圍為0xFEEx_xxxx的中斷地址。
- 當未啟用中斷重映射時(全局狀態寄存器中的IRES字段為Clear),將按照第5.1.2.1節中描述的兼容性中斷請求格式處理中斷請求。
- 若啟用中斷重映射(全局狀態寄存器中的IRES字段為set),中斷請求將按以下方式處理:
- 兼容格式的中斷請求(即“中斷格式”字段為“Clear”的請求)按以下方式處理:
-
如果啟用了擴展中斷模式(中斷重映射表地址寄存器的EIME字段為set),或者禁用了兼容格式的中斷(全局狀態寄存器中的CFIS字段為Clear),則兼容格式的中斷被阻止。
-
否則,兼容格式中斷將作為直通處理(繞過中斷重映射)
-
-
可重映射格式的中斷請求(“中斷格式”字段為set請求)的處理方式如下:
-
檢查可重映射中斷請求中的保留字段是否為零。如果保留字段檢查失敗,則中斷請求將被阻止。否則,從中斷請求中檢索Source-id,Handle,SHV和Subhandle字段。
- 硬件根據第5.1.3節中所述的算法計算interrupt_index。驗證計算出的interrupt_index小於“中斷重映射表地址寄存器”中配置的中斷重映射表大小。如果邊界檢查失敗,則中斷請求被阻止。
-
如果邊界檢查成功,則從中斷條目緩存中檢索與interrupt_index值相對應的IRTE,或從中斷重新映射表中獲取該中斷。
- 如果相關字段(C)在擴展功能寄存器中設置為“清除”,則從內存中提取IRTE,而不會監聽處理器緩存。硬件必須以單個操作讀取整個IRTE,不能使用多次讀取來獲取IRTE的內容,因為軟件可能會自動更改IRTE的內容。
- 如果IRTE存在(P = 1),則硬件會按照第9.10節中所述,通過對IRTE中的SVT,SID和SQ字段進行編程來驗證中斷請求者。如果源ID檢查失敗,則中斷請求將被阻止。
-
- 如果IRTE 的Mode 字段為 clear (IM=0):
-
硬件以可重映射格式解釋IRTE(如第9.10節所述)。如果檢測到對可重映射格式IRTE的編程無效,則中斷請求將被阻止。
-
如果以上檢查成功,則根據IRTE字段,編程生成重新映射的中斷請求。(remap完成)
-
- 兼容格式的中斷請求(即“中斷格式”字段為“Clear”的請求)按以下方式處理:
5.1.4.1 Interrupt Remapping Fault Conditions
編程的時候需要看這一節。
5.1.5 Programming Interrupt Sources To Generate Remappable Interrupts
軟件執行以下常規步驟,配置中斷源生成可重映射的中斷:
- 分配一個空閑的中斷重映射表條目(IRTE),並按照9.10節中所述的IRTE格式對重映射的中斷屬性進行編程。
- 對中斷源進行編程,以生成可重映射格式的中斷。包括設置適當的句柄,子句柄和SHV字段,這些字段可將分配IRTE的索引有效編碼為interrupt_index(5.1.3節中定義的)。可用以下任何一種方式,使用handle,subhandle和SHV字段對interrupt_index進行編碼:
— SHV = 0; handle = interrupt_index;
— SHV = 1; handle = interrupt_index; subhandle = 0;
— SHV = 1; handle = 0; subhandle = interrupt_index;
— SHV = 1; handle = interrupt_index - subhandle;
5.1.5.1 I/OxAPIC Programming
編程的時候需要看這一節。
5.1.5.2 MSI and MSI-X Register Programming
編程的時候需要看這一節。
5.1.6 Remapping Hardware - Interrupt Programming
由重映射硬件本身生成的中斷(故障事件和無效完成事件)不受中斷重映射的約束。
以下各節介紹了Intel 64平台上的故障事件和無效完成事件的數據/地址寄存器的編程。
5.1.7 Programming in Intel® 64 xAPIC Mode
5.1.8 Programming in Intel® 64 x2APIC Mode1
5.1.9 Handling of Platform Events
5.2 Interrupt Posting
中斷發布(投遞?)功能是中斷重映射硬件的擴展,用於擴展處理可重映射格式的中斷請求。中斷發布使可重映射格式的中斷請求被發布(記錄)在一致主存中的數據結構中,同時向CPU complex通知事件(可選),通過信號通知掛起的中斷投遞。
中斷發布功能(以及Intel 64處理器對發布后中斷處理和APIC虛擬化的支持)使虛擬機監視器(VMM)軟件可以有效地處理分配給虛擬機的設備中斷。
2.5.3節描述了中斷發布的高級用法和好處。
請參閱“英特爾®64體系結構軟件開發人員手冊,第3B卷:系統編程”《Intel® 64 Architecture Software Developer's Manual, Volume 3B: System Programming》,以獲取有關APIC支持虛擬化和中斷后處理的英特爾64處理器的詳細信息。
通過功能寄存器(CAP_REG)中的“發布的中斷支持(PI)”字段查看對重映射硬件對中斷發布功能的支持。
10.4.2節介紹了中斷發布功能
5.2.1 Interrupt Remapping Table Support for Interrupt Posting
Interrupt Remapping Table Entry (IRTE)中的Mode (IM) 字段,描述IRTE 為interrupt-remapping 或者interrupt-posting.
- IM=0,IRTE 為 remappable格式
- IM=0,IRTE 為 posted 格式
POST格式的IRTE條目支持以下新字段:
•“POST中斷描述符”數據結構的地址, 用來post中斷。第5.2.2節描述了POST的中斷描述符。
•緊急(URG)資格,指示通過此IRTE處理的中斷請求是否需要實時處理。 5.2.3節描述了該字段的硬件操作。
•向量字段,指定POST中斷 通過IRTE處理時 使用的向量。與可重映射格式不同(在生成重映射的中斷請求時使用Vector字段),POST格式的IRTE Vector字段用於確定當中斷發布到IRTE引用的中斷描述符時, 要設置的bit位。
5.2.2 Posted Interrupt Descriptor
POST中斷描述符是內存中一個64字節對齊的結構,中斷投遞硬件用來投遞(記錄)要發布的中斷請求。第9.12節介紹了POST的中斷描述符格式。系統軟件必須在一致的(寫回)主存儲器中分配POST中斷描述符。
POST中斷描述符包含以下字段:
•發布中斷請求(PIR)字段: 用於存儲POST(記錄)中斷(每個向量1 bit,最多256個向量)。
•未清通知(ON)字段: 指示此已發布中斷描述符是否存在未處理的通知事件(沒有被處理器或軟件處理)。當此字段為0時,硬件將在生成通知事件時將其從0修改為1,接收通知事件的實體(處理器或軟件)會將其重置為POST中斷處理的一部分。
•“禁止通知”(SN)字段: 指示是否要針對非緊急中斷請求(通過URG = 0的IRTE處理的中斷)抑制(不生成)通知事件。
•通知向量(NV)字段: 指定通知事件(中斷)的向量。
•通知目標(NDST)字段: 指定通知事件的目標邏輯處理器的物理APIC-ID。
5.2.3 Interrupt-Posting Hardware Operation
可重映射格式的中斷請求由硬件處理,如第5.1.4節所述。
當此類處理遇到POST格式(IM = 1)的IRTE條目時,將通過POST處理中斷請求(而不是重新映射)。 以下內容提供了中斷POST硬件操作的功能概述:
•如果取到的IRTE設置了“模式”字段(IM = 1)
—硬件以POST格式解釋IRTE(如第9.11節所述)。如果檢測到POST格式IRTE的編程無效,則中斷請求將被阻止。
—如果以上檢查成功,則IRTE將提供指向已POST中斷描述符(PDA-L / PDA-H)的指針,投遞中斷向量值(Vector),以及是否將中斷請求視為緊急(URG)
•硬件對POST中斷描述符執行 一致的原子 讀取-修改-寫入 操作,如下所示:
—reporting 內存類型支持(ECAP_REG中的MTS = 1)的硬件實現, 必須使用回寫(WB)內存類型 並原子操作來更新POST中斷描述符。
—無論擴展功能寄存器(ECAP_REG)中的Pagewalk Coherency (C) 字段的值如何,此原子性的讀取,修改,寫入操作將始終監聽處理器緩存。
—讀取POST中斷描述符的內容,聲稱其托管cache-line的專有權。如果檢測到POST中斷描述符的無效編程(例如,非零保留字段),則釋放高速緩存行的所有權,並阻止中斷請求。
—如果以上檢查成功,則在中斷描述符中,獲取“POST中斷請求”(PIR位255:0),“未清通知”(ON),“禁止通知”(SN),“通知向量”(NV)和“通知目標”(NDST)等字段的當前值。
—原子地修改以下描述符字段值:
•將PIR中的位設置為與IRTE中的矢量字段值相對應
•計算X =(((ON == 0)&(URG |(SN == 0)))
•如果(X == 1),則設置ON字段。
—提升緩存行在全局范圍內可觀察,以便其他緩存代理可以看到修改。在此步驟之后,硬件可以隨時寫回高速緩存行。
—如果上一步(X == 1),則生成具有以下屬性的通知事件(中斷):
•NSDT字段:指定目標邏輯CPU的物理APIC-ID。關於xAPIC和x2APIC模式如何解釋該字段,請參見第9.12節。
•NV字段: 指定用於通知中斷的向量,以向目標CPU發出有關掛起的POST中斷的信號。
•通知中斷的傳遞模式字段: 被強制為固定(000b)
•通知中斷的重定向提示字段: 被強制清除(0b)
•通知中斷的“觸發模式”字段: 被強制為邊沿(0b)
•通知中斷的“觸發模式級別”字段: 被強制設置為“有效”(1b)。
•以上任何導致中斷請求被阻止的檢查均被視為中斷重映射故障條件,如第5.1.4.1節中所述。
5.2.4 Ordering Requirements for Interrupt Posting
本節總結了POST中斷的硬件要滿足的順序要求。
•中斷請求是POST事務,並遵循PCI Express POST的訂購規則。這樣可以確保在所有先前的入站POST請求(寫操作)提交到其目的地之前,軟件不會觀察到之后的中斷請求。
— 即使已投遞了該中斷請求,也需要保持此要求。也就是說,在將中斷投遞(記錄)到POST中斷描述符中並使其對軟件可見之前,必須先完成所有先前發布的請求。
•由於中斷請求是POST事務,因此 上游讀取完成時 必須推送先前的中斷請求。upstream read completions must push preceding interrupt requests.
— 即使一個或多個先前的中斷請求被投遞了,也需要保持此要求。即,上游讀取完成必須等待,直到所有先前的中斷(無論它們是重新映射還是POST)都已完成。如果POST了一個中斷,則“完成”意味着該POST中斷描述符的原子更新和相關的通知事件均已完成。
•在中斷POST操作中,硬件必須確保在POST該中斷描述符的通知事件之前,軟件可以觀察到對該中斷描述符的修改。
5.2.5 Using Interrupt Posting for Virtual Interrupt Delivery
本章主要介紹,VMM怎么使用post中斷硬件,有效的將來自設備的虛擬中斷傳遞給VM。
VMM軟件為虛擬機啟用中斷發布流程如下:
•對於虛擬機中的每個vCPU,VMM軟件分配POST中斷描述符。用於分發將要 傳遞到給vCPU的所有中斷。
— 軟件必須阻止設備訪問POST中斷描述符所在的內存。實現此目的一種方法是設置重映射表,以便重映射硬件阻止從設備到POST中斷描述符的訪問。
— 如果設備能夠寫入POST中斷描述符,則不能保證POST中斷操作的原子性。
•VMM軟件為通知事件分配了兩個物理中斷向量(平台中跨所有邏輯CPU)。
— “活動通知向量”(ANV),用於向投遞中斷時處於活動狀態(正在執行)的任何vCPU投遞中斷通知。
—“喚醒通知向量”(WNV),用於向POST中斷時被阻止(停止)的vCPU的中斷通知發布。
•對於設備到VM的每個中斷源,VMM軟件都可以攔截和虛擬化中斷資源(IOxAPIC條目和/或MSI / MSI-X寄存器)的客戶軟件編程。通過這種虛擬化,VMM軟件可以檢測目標vGPU和來賓軟件分配的虛擬矢量。
•對於每個此類中斷源,VMM軟件都會分配一個POST格式的IRTE。
— 每個此類IRTE中的向量字段均由VMM軟件編程,並由來賓軟件為中斷源分配了相應的虛擬向量值。
— 每個此類IRTE中的POST描述符地址字段均由VMM軟件編程,以引用guest軟件針對vCPU中斷源分配的POST描述符,。
— 如果將相應的中斷源指定為需要立即(非延遲)處理,則VMM軟件會設置IRTE中的緊急(URG)字段。
•VMM軟件配置處理器硬件,為vCPU啟用APIC虛擬化(包括“虛擬中斷delivery”和“進程投遞中斷”功能)。
— 虛擬處理器的“POST中斷通知向量”已配置有本節前面介紹的“活動通知向量”(ANV)值。
— 虛擬處理器的“POST中斷描述符”配置有分配給各個vCPU的POST中斷描述符的地址。
•VMM調度程序可以按以下方式管理虛擬處理器的調度狀態:
— 當選擇要執行的虛擬處理器時,在進入/恢復虛擬處理器之前,該虛擬處理器的狀態被指定為“活動”。通過使用ANV向量的value對其通知向量(NV)字段進行編程,可以在其POST中斷描述符中指定此狀態。這樣,該vCPU在活動(運行)期間收到的所有中斷都可以由處理器硬件處理,而無需將控制權轉移給VMM軟件。處理器硬件處理這些通知事件(具有ANV向量值), 是通過將“POST中斷描述符”中的所有POST中斷傳輸到vCPU的Virtual-APIC頁面,並將其直接傳遞到vCPU(無需VMM軟件干預)。有關英特爾64處理器對APIC虛擬化和POST中斷處理的支持的詳細信息,請參閱《“英特爾®64體系結構軟件開發人員手冊,第3卷:系統編程指南”》(‘Intel® 64 Architecture Software Developer's Manual, Volume 3: System Programming Guide’ )。
— vCPU被搶占時(例如,在量子過期時),vCPU狀態被指定為“准備運行”。可以通過設置制通知(SN)字段1,指定其POST中斷描述符中的該狀態。 這允許將該vCPU處於搶占狀態的所有非緊急中斷投遞到其“POST中斷描述符”中,而不會產生通知中斷(從而避免打斷當前運行的vCPU)。 如果存在符合目標為該vCPU的緊急條件的中斷源,則VMM軟件還可以將“POST中斷描述符”中的NV字段修改為WNV向量值。這使VMM軟件 可以在緊急中斷被投遞而vCPU未運行時 接收通知(帶有WNV向量值),從而允許采取適當的軟件操作(例如搶占當前正在運行的vCPU並立即調度該vCPU)。
— 當虛擬處理器停止運行時(例如,在執行HLT指令時),VMM軟件可能會獲得控制權,阻止進一步執行vCPU並將vCPU狀態指定為“已停止”。 通過使用WNV向量值對其通知向量(NV)字段進行編程,從而在POST中斷描述符中指定此狀態。這樣,當為該虛擬處理器發布任何中斷(緊急或非緊急)時,VMM軟件就可以接收通知(帶有WNV向量值),從而允許采取適當的軟件操作(例如調度虛擬處理器或立即激活)。
•進入/恢復虛擬處理器時,VMM軟件可以按以下方式處理其POST描述符中的所有未決的POST中斷:
— VMM首先通過將POST中斷描述符中的通知向量設置為ANV向量值,將虛擬CPU轉換為“活動”狀態。
— VMM可以檢查POST描述符中是否有待處理的中斷(例如,通過掃描PIR字段中的非零值)。
— 如果有待處理的POST中斷,則VMM可以通過本地xAPIC生成一個向量IPV(同一個邏輯CPU的處理器間中斷),其向量值為ANV。一旦在虛擬處理器進入/恢復路徑中啟用了中斷,處理器便會識別此中斷。由於vCPU配置由ANV向量值作為“POST中斷通知向量”, 因此處理器硬件將對其進行的處理,與虛擬處理器處於活動狀態時可能收到的任何通知事件相同。這種方法使VMM軟件可以將POST的中斷處理(例如通過Virtual-APIC將中斷傳遞到虛擬處理器)“卸載”到處理器硬件, 通過將硬件重新映射到“POST中斷描述符”來投遞中斷時,不不用關系vCPU的調度狀態如何。
•VMM軟件還可以應用處理器的“后期中斷處理”功能,以將VMM軟件生成的虛擬中斷注入到虛擬機(in addition to 從直接分配的設備到虛擬機的中斷)。這可以通過VMM軟件以原子方式“將”虛擬中斷“發布”到“POST中斷描述符”(使用強制執行高速緩存行更新原子性的atomic / LOCK指令)來完成。並生成一個通知事件(作為IPI)給在POST中斷描述符中標識為通知目標的邏輯處理器。
•VMM軟件可以通過原子地將POST中斷描述符中的通知目標(NDST)字段, 更新為虛擬處理器要遷移到的邏輯處理器的物理APIC-ID,來處理跨邏輯處理器的虛擬處理器遷移。這使得來自該虛擬處理器的POST描述符的所有新通知事件都可以路由到新邏輯處理器
5.2.6 Interrupt Posting for Level Triggered Interrupts
通過IOxAPIC重定向表條目生成的電平觸發中斷(如圖5-16所示)可以通過POST中斷的中斷重映射表條目(IRTE)進行處理(如第9.11節所示)。
但是,與中斷重新映射不同,由POST中斷處理硬件處理的所有中斷(包括級別中斷)都被視為邊沿觸發的中斷。
因此,啟用水平觸發的中斷投遞的VMM軟件必須格外小心,以正確虛擬化虛擬處理器的中斷結束(EOI)處理。
例如,VMM軟件可以設置vCPU執行控件,使guest軟件獲得對虛擬APIC控制器的EOI操作的控制權,並通過對產生水平觸發中斷的IOxAPIC執行DirectedEOI來虛擬化該操作。
軟件直接寫入IOxAPIC EOI寄存器來操作定向EOI。有關IOxAPIC EOI寄存器的詳細信息,請參見IOxAPIC規范。