[轉] intel 虛擬化 vt-d


 [轉自

VT-d簡介  https://blog.csdn.net/lindahui2008/article/details/83477179

DMA重定向 https://blog.csdn.net/lindahui2008/article/details/83715106

    iova概念 https://software.intel.com/en-us/articles/memory-in-dpdk-part-2-deep-dive-into-iova

中斷重映射 https://blog.csdn.net/lindahui2008/article/details/83954861

interrupt posting https://blog.csdn.net/lindahui2008/article/details/84162715

DMAR表組織結構 https://blog.csdn.net/lindahui2008/article/details/84443942]

 

VT-d 概述

   Intel VT-d的全稱是Intel Virtualization Technology for Direct I/O,它是Intel虛擬化技術的一部分,主要針對的是 I/O子系統,它的實現主要是通過在硬件上引入重定向單元,該硬件重定向單元用於對I/O子系統的DMA操作和中斷傳遞進行重定向,從而輔助VMM(Virtual Machine Monitor)實現I/O子系統的虛擬化。
一般情況下VMM支持I/O虛擬化可以通過以下四種方式實現:
  • 純軟件模擬。即VMM的軟件模擬一個現有的I/O設備,這種方式具有較好的兼容性,但是純軟件模擬在性能和功能上就表現得比較差了。
  •  還是純軟件模擬,但是引入新的I/O操作接口,這些接口針對I/O虛擬化進行一定的優化,這樣雖然能夠解決一定的性能問題,但是兼容性問題又出現了,因為需要使用新的操作接口。
  •  硬件分配,直接將I/O設備分配給某個VM(Virtual Machine),這樣只有指定的VM能夠使用該I/O設備,並且I/O設備的驅動位於VM中,並且VM能夠直接對I/O設備進行操作,這樣性能和兼容性都能達到最佳,但是一個I/O設備只能給一個VM使用。
  •  I/O設備分享,這是硬件分配方式的一種擴展,主要還是需要I/O設備本身需要支持一定的功能,如能夠同時提供多個功能接口,比如PCIe設備的SR-IOV功能,即PCIe設備本身能夠將一個物理PCIe設備,變成多個邏輯設備,這多個邏輯設備共享該PCIe設備上的物理資源,並且可以獨立地分配給不同的VM。
  以上I/O虛擬化的一個 通用要求就是要求VMM能夠將屬於不同VM的I/O設備安全地隔離起來,即需要滿足以下兩方面的要求:
  • 屬於一個VM的vCPU無法訪問到屬於另外一個VM的I/O設備,這可以通過VMX(Virtual Machine Extension)中的EPT(Extended Page Table)功能來實現,即VMM可以通過軟件配置,將虛擬機物理內存,即Guest Physcial Address映射到不同的主機內存區域,即Host Physical Address。
  •  屬於一個VM的I/O設備不能訪問到屬於其他VM的內存或者向屬於其他VM的中斷控制器發送中斷。如果是純軟件模擬的方式,則VMM也可以通過純軟件的方式來控制I/O設備訪問內存(如DMA)和發送中斷的行為。但是如果采用硬件分配的方式,則就需要在硬件上對I/O設備訪問內存和發送中斷的行為進行攔截,然后重定向到指定的VM中,這就是VT-d派上用場的時候了。
  VT-d是一個位於CPU、內存和I/O設備之間的硬件設備,通常位於PCI設備樹的根部,或者類似的位於I/O子系統的根部,當VT-d重定向硬件設備啟用的時候,它會 攔截位於它下面的所有I/O設備產生的中斷請求和通過DMA方式對虛擬機內存訪問的請求,然后通過查找中斷重定向表或者I/O頁表的方式(類似分頁機制)來重新定位中斷轉發的目標LAPIC或者是I/O設備訪問的目標主機物理內存地址。如下圖所示:
 
 
  VMM軟件負責 I/O設備的分配,即將指定I/O設備和相應的VM對應起來,並且負責 建立中斷重定向關系表I/O地址轉換頁表,並將這些轉換關系的 配置設置到VT-d硬件設備上,而I/O設備發起的中斷請求或者DMA內存訪問請求中帶有相應設備的ID,這樣VT-d硬件單元就可以通過硬件查找的方式將不同的I/O設備中斷和內存訪問請求重定向到相應的VM上,從而達到隔離不同VM的I/O設備的目的。
總的來說, VT-d的主要功能就是將I/O設備的DMA訪問請求和中斷請求重定向到VMM設定好的VM中
————————————————
版權聲明:本文為CSDN博主「河馬虛擬化」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lindahui2008/article/details/83477179
 
 

VT-d----DMA重定向

DMA重定向硬件一般位於Root Complex中,Root-Complex是PCIe系統中引入的概念,它將CPU、內存子系統和PCIe子系連接起來。如下圖所示:

 

 
  而Root Complex則經常被集成到CPU芯片上、MCH(Memory Controller Hub)上或者是IOH(I/O hub)上。
  DMA重定向硬件將來自於I/O子系統的內存訪問請求分為兩類:
  • 不帶地址空間ID的請求(Request without Process Address Space Identifier,即Request-without_PASID),相當於GPA(Guest Physical Address),這是一般Endpoint設備發出的內存訪問請求,這類請求通常會表明該請求的類型(讀、寫或原子操作),DMA目標的地址、大小和發起請求的源設備的ID。
  •  帶有地址空間ID的請求(Request with Process Address Space Identifier,即Request-with-PASID),相當於GVA(Guest Virtual Address),能夠發出這類請求的源PCI設備需要擁有virtual address capability,該請求帶有額外的信息用於定位目標地址空間和一些其他信息。
  不同虛擬機之間的隔離是通過防止分配到其他虛擬機的資源(CPU、I/O設備)訪問到本虛擬機的物理地址。 每個虛擬機都會有自己獨立的物理地址空間,即GPA(Guest Physical Address)空間,該空間不同於主機物理地址空間,即HPA(Host Physical Address)空間。
  DMA重定向硬件將從 I/O設備發過來的訪問請求中包含的地址看做是DMA地址,根據不同的使用配置,該DMA地址可能是 GPA;可能是跟PASID(Process Address Space ID)相關的 VA(application Virtual Address);也可能是 由軟件定義的I/O虛擬地址(IOVA)。不管怎樣,DMA重定向硬件將DMA地址最終轉化為HPA(Host Physical Address)實現最終主機物理地址的訪問。
  如下圖所示,系統中存在兩個Domain,1和2,也可以理解為存在兩個虛擬機,這兩個虛擬機發出的內存請求通過在CPU上的內存管理單元(MMU),在x86 CPU上可以理解為分頁機制和EPT(Extended Page Table)的組合,將發出的內存請求地址最終轉化為主機的物理內存地址,即HPA,對應到主機物理內存上。而Device 1和2,則可以理解為分別分配給Domain 1和2的I/O設備, 雖然它們發出訪問請求的地址數值一樣,但是由於它們所屬的Domain不一樣,導致DMA Memory Management將會使用不同的地址轉換頁表,將其分別轉換到不同Domain所對應的HPA。VMM/Hypervisor負責對DMA Memory Management所使用的I/O地址轉換頁表進行創建和維護,同時需要對DMA重定向和I/O設備進行配置,協商好使用什么類型的地址,GPA或者GVA。

 

 
  每個DMA重定向硬件的實現可以是一個硬件單元包含整個PCI Segment,也可以是多個硬件單元,每個硬件單元各自包含PCI Segment中的部分PCI設備。 系統的BIOS或者UEFI負責在系統啟動的時候對VT-d硬件進行檢測,並分配相應的地址空間,讓系統軟件能夠訪問到VT-d硬件及其配置寄存器。BIOS/ACPI以 ACPI表的子表(DMAR:DMA Remapping Reporting ACPT Table)的形式將VT-d硬件資源描述出來,這樣VMM值需要找到DMAR表,就可以對相應的VT-d硬件進行訪問或配置了。DMAR表的組織形式以后再詳細講。
  每個從I/O設備往上傳輸經過重定向硬件的 數據包都會包含source-id用於定位源I/O設備,不同的I/O設備其source-id的實現可能不一樣,對於PCI設備而言,其source-id是傳輸層頭部中包含的requester Identifier,由Bus、Device、Function組成,其格式如下所示:

 

  所謂的重定向就是對目標地址進行轉換或更改,DMA重定硬件向利用分層頁表結構對地址進行轉化。屬於不同Domain的I/O設備請求需要被分配到不同的轉換頁表中,該索引、分配過程以I/O設備請求的source-id為輸入源,
   1.對於PCI設備發出的Request-without-PASID而言,它將會使用請求包中包含的PCI Bus、Device和Function號作為索引值。在進行這樣的索引之前,VMM需要在內存中建立好一個4KB的 Root-table,該table包含256個entry,每個entry對應一個PCI Bus,每個Root-entry中包含一個指針,該指針指向一個4KB的Context-table,該Context-table中包含了256個entry,對應到該PCI Bus下的所有Device和Function。每個Context-entry都包含一個指向該PCI Function所對應的Domain的地址轉換頁表的指針。其結構如下圖所示:
 

 

  當找到相應的地址轉換頁表后,硬件才開始正常的地址分級頁表轉換,即所謂的page-walk,將請求中的GPA地址轉化為HPA,實現最終的物理內存訪問,該轉化過程即稱為 Second-Level-Translation。Root-table的地址需要VMM在啟動VT-d硬件的時候,將Root-table的地址寫到VT-d硬件相應的寄存器(Root Table Address Register)上,為VT-d硬件提供一個入口。
   2.對於Request-with-PASID而言,其請求中包含的地址轉換頁表入口索引,即(PCI、Bus、Device和Function值)是一樣的,但是其包含的請求地址類型不一樣,是GVA,而不是GPA,故需要現將GVA轉化為GPA(即為 First-Level-Translation),然后再將得到的GPA轉化為HPA,即 Second-Level-Translation,才能實現最終的物理內存訪問。
該方法需要有 兩次索引地址轉換頁表的入口地址,所以需要用到 Extended-root-table,該4KB的table每個Ext-root-entry中,包含兩部分,分別包含Upper-context-table的指針和Lower-contex-table的指針,Upper-context-table指針指向的是PASID-Table,PASID-Table則根據PASID來對該表進行索引,每個PASID-entry都包含一個指向分級頁表的入口,該分級頁表用於完成First-Level-Translation,即將請求中包含的GVA轉化為GPA。Sencond-Level-Translation分級頁表的所以和前面Request-without-PASID一樣。當Frist-Level-Translation完成后得到的GPA,將作為Second-Level-Translation作為輸入地址,最終得到HPA,完成主機物理內存的訪問。

 

  不管是first-level translation (requests-with-PASID)還是second-level translation (request-without-PASID)。 對於request-with-PASID而言,會先使用first-level translation table將DMA地址轉換為一個不帶PASID的地址,然后再將這個不帶PASID的地址作為second-level-translation table的輸入進行轉換得到最終的物理地址。查詢頁表完成地址轉換的方式就根普通的分頁機制完全一致。頁表的層數會根據具體使用的頁框大小而變化,頁框大小可以是4KB,2MB和1GB,下圖以4KB為例。

 

 
由此可見要完成一次DMA重定向訪問到真正的主機物理地址,中間會有很多的內存訪問,為了加快這些內存訪問,VT-d硬件中,會引入各種各樣的Cache加快這些物理地址的轉換,或者是主機物理內存的訪問。
————————————————
版權聲明:本文為CSDN博主「河馬虛擬化」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lindahui2008/article/details/83715106
 

 

 VT-d-------中斷重映射

  VT-d硬件中除了包含DMA重映射硬件外,也會包含中斷重映射硬件,該中斷重映射單元讓系統軟件能夠對 I/O設備產生的中斷(包括從I/O APIC發送過來的中斷,I/O設備產生的以MSI、MSI-X形式傳遞的中斷,不包含中斷重映射硬件本身產生的中斷)的傳輸進行控制,而不僅僅取決於硬件的連接
  對於VT-d硬件而言,中斷請求就是從外面發送進來對 物理地址范圍0xFEEX_XXXXh的寫請求。VT-d中,中斷重映射功能由 Extended Capability Register寄存器來決定,該寄存器的bit3表示Interrupt Remapping Support,如果為1,則表示支持中斷重映射,如果為0,則表示不支持中斷重映射。
 

 

  為了實現同一物理系統中,不同Domain之間的隔離,需要VT-d的中斷重映射硬件對接收到的 中斷請求提取其中斷的來源(一般是PCI設備的Bus、Device和Function號之類的信息),然后根據不同設備所屬的Domain,將該中斷請求轉發到相應的Domain中,實現不同Domain之間,中斷請求的隔離
  在Intel x86架構中,中斷請求的格式有兩種: 兼容格式可重映射格式。並且每個請求中都包含了訪問的地址和數據,格式的選擇由地址信息的bit 4(Interrupt Format)來決定。
  • 對於兼容格式而言,bit 4(Interrupt Format)為0,表示兼容格式,這種格式的中斷直接向上傳遞到CPU的LAPCI,不會被重新映射。
 
  • 對於可重映射格式而言,bit 4(Interrupt Format)為1,其具體格式如下所示:

 

  Address信息中,bit 19 ~ bit 5和bit 2共同組成了16bit的 Handle,並且在Address bit 3(SHV)為1的情況下,Data區域的bit 15 ~ bit 0包含了 Sub-Handle,這些值用於索引中斷重映射表,后面會講到。
  中斷重映射硬件利用一張位於內存的單層表,即 中斷重映射表,來確定中斷請求需要被如何重新生成並轉發。該表由VMM配置,並且該表的物理地址將會被寫到VT-d硬件中的 Interrupt Remap Table Address Register,用於告知硬件中斷重映射表的位置。並且低4 bit用於表示中斷重映射表中包含的entry個數,即2的(1+S)次方,最高達2的16次方,即64K。

 中斷重映射表中的每個表項大小為128 bit,即16 Byte,稱為Interrupt Remap Table Entry(IRET),其格式如下所示:

 

  主要包含了重映射目標的Destination ID、Vector和一些其他中斷傳輸相關的信息(對於兼容格式的中斷而言,其中斷的屬性都是在中斷請求中說明,而可重映射的中斷,其中斷屬性則在IRTE中說明)。另外bit 15必須為0,該bit表示IRTE Mode,如果為0,則表示為Remapped Interrupt,如果為1,則表示Posted Interrupt(下一篇文章講解)。中斷重映射硬件,將以前面提到的中斷請求中包含的Handle和Sub-Handle計算索引值,對中斷重映射表進行索引。其算法如下所示:

  •  從硬件的角度來看,整個中斷重映射的過程為:硬件檢測到向0xFEEX_XXXXh地址DWORD的寫請求,判定其為中斷請求,並將其攔截。如果中斷重映射的功能沒有打開(Global Status Register的IRES為0),則所有的中斷請求都以兼容格式的中斷來處理。如果中斷重映射功能被打開(Global Status Register的IRES為1),則查看中斷請求的格式,如果是兼容格式,則直接跳過中斷重映射硬件,繼續中斷請求的傳遞。如果是可重映射格式,則檢測中斷請求中的數據正確性,計算Interrupt_index,讀取相應的IRTE,檢測IRTE是否存在及其正確性,如果一切正常則中斷重映射硬件將會根據讀取的IRTE產生一個新的中斷請求,並向上傳遞。其基本流程如下所示:

 

  • 對於軟件而言,為了實現中斷重映射,則需要進行如下操作:
  如果中斷重映射表沒有被分配,則在 內存中分配一塊區域作為中斷重映射表,並將該表的位置告訴給中斷重映射硬件,即將該表的位置寫到Interrupt Remap Table Address Register。
   找到一個可用的IRTE(Interrupt Remapping Table Entry),然后設置需要重新轉發的中斷的一些屬性,如傳遞的目標、中斷模式,中斷向量等。
 對中斷源(一般是I/O設備或者是I/O APIC)進行設置,讓中斷源能夠產生可重映射格式的中斷,並且由其Handle、Sub-Handle、SHV等區域計算出來的interrupt_index正好匹配到之前設置好的IRTE。不同的I/O設備的設置方法會有區別。
  對於I/O xAPIC而言,系統軟件通過設置設置I/O xAPIC的Redirection Table Entries(RTEs)來設置I/O xAPIC產生的可重映射中斷。RTE的格式如下所示:

  將Interrupt Format設置為1表示產生的中斷為可重映射中斷,並且可以設置Interrupt_Index、Vector、Trigger Mode等信息。

  對於可以產生MSI(Message Signaled Interrupt)或者MSI-X的設備而言,對產生中斷的設置包括Address和Data寄存器,其格式如下所示:
 

 

  當Address的bit 4(Interrupt Format)為1的時候,則表示產生的中斷為可重映射中斷,並且可以設置Interrupt_Index和SHV等值。對於支持多個(必須是2的n次方)Vector中斷的MSI/MSI-X消息而言,其Data寄存器的低n位對應到具體的Vector數值,並且SHV(Sub-Handle Valid)為1,這時候IRTE的索引值就是Interrupt_index[15:0]的值加上Vector的值。
 
  總的來說, VT-d的中斷重映射就是指VT-d會攔截其下面掛載的I/O設備產生的中斷,然后根據接收到的中斷請求索引中斷重映射表,根據找到的中斷重映射表的表項產生新的中斷請求,上傳到CPU的LAPIC。VT-d就是通過這個重映射動作,實現了同一物理系統中不同Domain的I/O設備中斷請求的隔離。同時為了讓I/O設備能夠產生可重映射的中斷,並對中斷重映射表進行正確的索引,系統軟件還需要對I/O設備的中斷請求生成進行配置。
————————————————
版權聲明:本文為CSDN博主「河馬虛擬化」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lindahui2008/article/details/83954861

 

VT-d -----interrupt posting

 

  Interrupt-posting是VT-d中中斷重映射功能的一個擴展功能,該功能也是針對可重映射的中斷請求。Interrupt-posting功能 讓一個可重映射的中斷請求能夠被暫時以一定的數據形式post(記錄)到物理內存中,並且可選擇性地主動告知CPU物理內存中暫時記錄着pending的中斷請求
  在x86處理器的虛擬化中,Interrupt-posting再加上APIC Virtualization讓VMM能夠更加高效地處理分配各虛擬機的設備產生的中斷請求。VT-d重映射硬件是否支持Interrupt-posting功能可以通過查詢Capability Register的bit 59 Posted Interrupt Support(PI)知道硬件是否支持該功能。

 

   對於VT-d而言,所有可重定向的中斷都需要經過IRTE(Interrupt Remapping Table Entry)的處理,在進行處理之前會先通過IRTE的bit 15(IRTE Mode)判斷該IRTE的模式,如果為0,則VT-d硬件將會以Remapped Interrupt的形式來解析該IRTE(前一篇文章講的中斷重映射),如果為1,則VT-d硬件將會以Posted Interrupt的形式來解析該IRTE,如下圖所示:

 

  Posted Interrupt格式的IRTE的定義會有一些不同,主要是:
  • 多了一個Posted Descriptor Address Low/High,該區域保存一個指向內存的指針,該指針指向的位置就是保存中斷(Posted Interrupt)的結構體。
  • Urgent位,該位用於表示該中斷是否是緊急的,是否需要目標CPU的立即響應。
  •  Vector用於設置Posted Interrupt Descriptor數據結構中相應的位,而不是用於設置直接產生的中斷的vector值。
  • 每個Posted Interrupt Descriptor的大小為64 Byte,用於記錄VT-d硬件那邊post過來的中斷,即在內存中暫時記錄一些中斷請求,等待CPU的處理,而不是主動打斷CPU的運行,讓其跳轉過來處理,其格式如下所示:

 

  • Posted Interrupt Requests (PIR),一共256 bit,每個bit對應一個中斷向量(Vector),當VT-d硬件將中斷請求post過來的時候,中斷請求相應的vector對應的bit將會被置起來。
  • Outstanding Notification(ON),表示對於該Posted Interrupt Descriptor當前是否已經發出了一個Notification Event等待CPU的處理。當VT-d硬件將中斷請求記錄到PIR的時候,如果ON為0,並且允許立即發出一個Notification Event時,則將會將ON置起來,並且產生一個Notification Event;如果ON已經被置起來,則VT-d硬件不做其他動作。
  • Suppress Notification(SN),表示當PIR寄存器記錄到non-urgent的中斷時,是否不發出Notification Event,如果該位為1,則當PIR記錄到中斷的時候,則不發出Notification Event,並且不更改Outstanding Notification位的值。
  • Notification Vector(NV)表示如果發出Notification Event時,具體的Vector值。
  • Notification Destination(NDST),表示若產生Notification Event時,傳遞的目標邏輯CPU的LAPIC ID(系統中以邏輯CPU的LAPIC ID來表示具體的邏輯CPU,BIOS/UEFI其初始化系統的時候,會為每個邏輯CPU分配一個唯一的LAPIC ID)。
  1. 在硬件上整個Posted Interrupt的處理過程如下所示:

 

 

  當VT-d硬件接收到其旗下I/O設備傳遞過來的中斷請求時,會先查看自己的中斷重定向功能是否打開,如果沒有打開則,直接上傳給LAPIC。如果中斷重定向功能打開,則會查看中斷請求的格式,如果是不可重定向格式,則直接將中斷請求提交給LAPIC。如果是可重定向的格式,則會根據算法計算Interrupt_Index值,對中斷重定向表進行索引找到相應的IRTE。然后,查看IRTE中的Interrupt Mode,如果為0,則該IRTE的格式為Remapped Format,即立即根據IRTE的信息產生一個新的中斷請求,提交到LAPCI。如果Interrupt Mode為1,則表示該IRTE的格式為Posted Format,根據IRTE中提供的Posted Interrupt Descriptor的地址,在內存中找到相應Posted Interrupt Descriptor,並根據其ON、URG和SN的設置判斷是否需要立即產生一個Notification Event(Outstanding Notification為0,並且該中斷為Urgent(URG=1)或者不抑制該Notification(SN==0)),如果不需要,則只是將該中斷信息記錄到Posted Interrupt Descriptor的PIRR(Posted Interrupt Request Register)字段,等待CPU的主動處理。如果需要立即產生一個Notification Event,則根據Posted Interrupt Descriptor(會提供目標APIC ID、vector、傳輸模式和觸發模式等信息)產生一個Notification Event,並且將該中斷請求記錄到PIRR字段。
  硬件在對Posted Interrupt Descriptor進行修改的時候,要保證該修改是原子操作, 即對Posted Interrupt Descriptor的讀取、修改和寫入必須是原子操作,並且在寫入之后,要保證相應內存在各個cache agent之間的一致性,即所有的CPU應該立馬能夠看到該內存修改
  2. 從軟件的角度來看,VMM可能會對Interrupt Posting做如下設置和操作
  對於每個vCPU而言,VMM都會分配一個對應的Posted Interrupt Descriptor用於記錄和傳遞經過重定向,並且目的地為對應vCPU的所有中斷請求。
   VMM軟件為所有的Notification Event分配兩個物理中斷vector:
   第一個稱作 Active Notification Vector(ANV),該Vector對應到當中斷目標vCPU當前正在被邏輯CPU執行(即vCPU的狀態為active)時,Notification Event所使用的中斷vector。
    第二個稱作 Wake-up Notification Vector(WNV),該Vector對應到中斷目標vCPU當前不在邏輯CPU上被執行時,由於Urgent被置起來產生的Notification Event所使用的中斷Vector。
   對於從直接分配給VM的I/O設備產生的中斷而言,VMM會為每個這樣的中斷分配一個IRTE。並且VMM可能會為vCPU使能硬件上的APIC Virtualization, APIC Virtualization主要包括兩方面功能:virtual-interrupt deliveryprocess posted-interrupts,其主要工作形式表現在:
  •  當一個vCPU被VMM調度即將執行的時候,該vCPU的狀態為active,該狀態的一個表現形式是VMM會將Posted Interrupt Descriptor的Notification Vector字段設置為ANV(Active Notification Vector)。這樣就允許當這個vCPU在邏輯CPU上執行的時候,所有指向該vCPU的中斷都能夠直接被該vCPU處理,不需要經過VMM。vCPU通過將記錄在Posted Interrupt Descriptor中的中斷直接轉移到Virtual-APIC Page中,並直接將中斷信號傳遞給vCPU,讓vCPU直接獲取到該中斷信號的方式來處理Notification Event。
  •   當一個vCPU被搶占后,即vCPU的狀態為ready-to-run,該狀態的一個表現形式是VMM會將Posted Interrupt Descriptor的Notification Vector字段設置為WNV(Wake-up Notification Vector),並且SN(Suppress Notification)設置為1。只有當接收到的中斷請求為Urgent的時候,才會發出Notification Event,觸發VMM的執行,讓VMM調度目標vCPU處理該緊急中斷。
  •  當一個vCPU處於Halt狀態的時候,邏輯CPU執行VMM軟件,VMM將該vCPU標記為halted狀態。該狀態的一個表現形式就是將Posted Interrupt Descriptor的Notification Vector字段設置為WNV(Wake-up Notification Vector),並且SN(Suppress Notification)設置為0,即任何到達該Posted Interrupt Descriptor的中斷請求都會觸發Notification Event,讓VMM喚醒vCPU,讓vCPU處理中斷請求。
 
   當VMM調度並執行一個vCPU的時候,VMM會對被記錄到Posted Interrupt Descriptor的中斷請求進行處理:
  •  首先,VMM會通過將Posted Interrupt Descriptor的Notification Vector字段的值改為ANV將vCPU的狀態變為active。
  •  VMM檢測在Posted Interrupt Descriptor中是否有待處理的中斷請求:
    如果有待處理的中斷請求,則VMM會給當前CPU發送一個sefl-IPI中斷(即CPU自己給自己發送一個中斷),並且中斷向量值為ANV。當vCPU一使能中斷的時候,就能夠立馬識別到該中斷。該中斷的處理類似於vCPU處於active狀態時,接收到了Active Notification Vector的中斷請求,vCPU可以直接對其進行處理,不需要VMM的參與。
   同樣VMM可以可以利用Posted Interrupt的處理機制,通過設置Posted Interrupt Descriptor向vCPU注入中斷請求。
 
  總體上來說, Interrupt Posting的功能就是讓系統可以選擇性地將中斷請求暫存在內存中,讓CPU主動去獲取,而不是中斷請求一過來就讓CPU進行處理,這樣在虛擬化的環境中,就能夠防止外部中斷頻繁打斷vCPU的運行,從而提高系統的性能。

————————————————
版權聲明:本文為CSDN博主「河馬虛擬化」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lindahui2008/article/details/84162715、
 

VT-d-----DMAR表組織結構

  在系統上電的時候,BIOS/UEFI負責檢測並初始化重定向硬件(即VT-d硬件),為其分配相應的物理地址,並且以ACPI表中的DMAR(DMA Remapping Reporting)表的形式告知VT-d硬件的存在。
  DMAR的格式如下所示,先是標准的APCI表的表頭,然后是Host Address Width表示該系統中支持的物理地址寬度;標志字節Flag表示VT-d硬件支持的一些功能,最后是Remapping Structures,即一堆有組織的結構體用來描述VT-d硬件的功能。

 

Remapping Structures是一堆以Type和Length為開始的結構體,Type的類型可能有下面五種:

 

  BIOS/UEFI負責在初始化系統的時候將這些結構體以類型為順序有序地組織起來(同種類型的結構體可能有多個,也可能壓根就不存在)。第一個結構體必須是DRHD(DMA Remapping Hardware Unit Definition)結構體。

1. DRHD(DMA Remapping Hardware Unit Definition)表

一個DMAR結構體用於唯一定義系統中存在的一個VT-d重定向硬件。其結構體如下所示:

  主要包括兩方面的信息, 一是提供VT-d重定向硬件寄存器基地址,為系統軟件訪問VT-d硬件寄存器提供入口(各個偏移量所指向的具體寄存器在VT-d的spec中有詳細的約定,即VT-d硬件的具體實現); 另一個是該VT-d重定向硬件所管轄的硬件,由Segment Number和Device Scope兩個區域來定義。Device Scope結構體由Device Scope Entry組成,每個Device Scope Entry可以用來指明一個PCI endpoint device,一個PCI sub-hierarchy,或者其他設備,如I/O xAPIC或者HPET。
 

2. RMRR(Reserved Memory Region Reporting)表

  RMRR表用於表示BIOS或者UEFI為了DMA的使用而保留的一些系統物理內存,這些內存從操作系統的角度來看其屬性為Reserved Memory,因為有一些比較傳統的設備(比如USB、UMA顯卡等)可能會需要用到一些固定的,或者專用的系統內存,這時候就需要BIOS或UEFI為其保留。

 

  該表中,主要包括兩方面信息,即 保留的內存的范圍(Reserved Memory Region Base Address和Reserved Memory Region Limit Address)和 針對的物理設備(Segment Number和Device Scope)。
 

3. ATSR(Root Port ATS Capability Reporting)表

  ATS是Address Translation Services的意思,它是PCIe Capability的一種,用於表示PCIe設備是否支持經過PCIe Root Port翻譯過的地址。ATSR表只適用於那種PCIe設備支持Device-TLB的系統中,即PCIe設備帶有地址轉換加速功能。一個ATSR表表示一個支持ATS功能的PCIe Root-Port,其結構如下所示:

 

主要包括兩方面信息: Segment Number用於定位PCIe Root-PortDevice Scope用於定位位於該PCIe Root-Port下面的設備
 

4. RHSA(Remapping Hardware Status Affinity)表

  RHSR表適用於NUMA(Non-Uniform Memory)系統(即不同的CPU Socket都可能會單獨連接一些內存條,不同的CPU Socket對同一物理內存的訪問路徑可能是不同的),並且系統中的VT-d重定向硬件分布於不同的Node上。 該表用於表示VT-d重定向硬件從屬於哪個Domain。

 

5. ANDD(ACPI Name-space Device Declaration)表

一個ANDD表用於表示一個以ACPI name-space規則命名,並且可發出DMA請求的設備。ANDD可以和前面提到的Device Scope Entry結合一起時候。

 

 其中ACPI Device Number,相當於在該VT-d硬件管轄范圍內的以ACPI name-space規則命名的硬件ID號,前面Device Scope Entry值需要這個ID號,就可以找到該ANDD表,並從該表的ACPI Object Name區域找到具體的設備。


————————————————
版權聲明:本文為CSDN博主「河馬虛擬化」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lindahui2008/article/details/84443942

 


免責聲明!

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



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