5-Level Paging and 5-Level EPT white paper原文
修訂版本1.1 2017年5月
注意:本文檔包含有關開發設計階段產品的信息。這里的信息如有更改,恕不另行通知。請勿使用此信息確定設計。
英特爾技術的功能和優點取決于系統配置,可能需要啟用硬件,軟件或激活服務。在intel.com或OEM或零售商處了解更多信息。
1 介紹
本文檔描述了Intel 64架構的計劃擴展,以擴展可通過處理器內存轉換硬件轉換的地址大小。
現代操作系統使用稱為分頁的地址轉換支持。分頁將軟件使用的線性地址(也稱為虛擬地址)轉換為用于訪問存儲器(或存儲器映射的I/O)的物理地址。1.1節描述了Intel 64處理器上的64位分頁硬件?,F有處理器將線性地址限制為48位。第2章描述了將擴展限制為57個線性地址位的分頁擴展。
虛擬機監視器(VMM)使用虛擬機擴展(VMX)來支持在虛擬機中運行的客戶機軟件。VMX交換是VMM和客戶軟件之間的控制流傳輸。VMX轉換涉及加載和存儲各種處理器寄存器。這些寄存器中的一些被定義為包含線性地址。因此,VMX轉換的操作部分取決于處理器支持的線性地址寬度。第1.2節描述了VMX轉換對線性地址寄存器的現有處理,而第3章描述了支持較大線性地址所需的更改。
VMM還可以使用稱為擴展頁面表(extended page tables,EPT)的附加地址轉換支持。當使用EPT時,分頁產生客戶機物理地址,EPT將轉換為物理地址。1.3節描述了現有Intel 64處理器上的EPT硬件,將客戶物理地址限制為48位。第4章描述EPT擴展以支持57個客戶機物理地址位。
1.1 IA-32e模式中的現有分頁
在支持Intel 64架構的處理器上,軟件通常使用線性地址來引用內存。大多數現代操作系統將處理器配置為使用分頁,將線性地址轉換為物理地址。處理器使用生成的物理地址來訪問內存。
IA-32e模式是一種處理器執行模式,可擴展舊的32位操作,稱為傳統模式。軟件可以使用以下算法進入IA-32e模式。
1。使用MOV CR指令設置CR4.PAE [位5]。(必須啟用物理地址擴展才能進入IA-32e模式)。
2。使用WRMSR指令設置IA32_EFER MSR(索引C0000080H)的位8(LME)。
3。使用MOV CR指令將CR3加載為PML4表的地址(見下文)。
4。使用MOV CR指令設置CR0.PG [位31]。
每當CR0.PG = 1且IA32_EFER.LME = 1時,邏輯處理器處于IA-32e模式。這個事實在IA32_EFER.LMA [位10]中報告。軟件無法直接設置該位;它始終是CR0.PG和IA32_EFER.LME的邏輯AND。
在IA-32e模式中,線性地址的大小為64位。但是,相應的分頁模式(當前稱為I A-32e分頁)不使用所有64個線性地址位。
IA-32e分頁不使用所有64個線性地址位,因為處理器限制線性地址的大小。該限制由CPUID指令列舉。具體來說,CPUID.80000008H:EAX [位15:8]列舉處理器支持的線性地址位數(最大線性地址寬度)。現有的處理器將此值列舉為48。
注意:處理器還限制物理地址的大小,并使用CPUID列舉限制。CPUID.80000008H:EAX [位7:0]列舉處理器支持的物理地址位數,最大物理地址寬度。現有的處理器列舉了高達46的值。只有通過設置CR4.PAE(控制寄存器CR4的位5)啟用了物理地址擴展,軟件才能使用超過32個物理地址位。
對線性地址寬度的列舉限制意味著分頁僅轉換每個64位線性地址的低48位。在生成線性地址但在轉換之前,處理器確認地址僅使用處理器支持的48位。
對48個線性地址位的限制來自于IA-32e分頁的性質,如圖1-1所示。
注1:IA-32e模式包括兩種子模式:兼容模式和64位模式。在兼容模式下,軟件使用32位地址,處理器零擴展到64位線性地址。在64位模式下,軟件直接使用64位地址。
處理器通過遍歷其根結構位于控制寄存器CR3中的物理地址的分頁結構的4級層次來執行IA-32e分頁。每個分頁結構的大小為4 KB,包含512個8字節的條目。處理器使用線性地址(位47:12)的高36位,一次9位,從層次結構中選擇分頁結構條目。
注意:圖1-1說明了將線性地址轉換為4 KB的頁面??梢耘渲梅猪撨^程,使得某些線性地址的轉換可以更早地停止一個或兩個級別,從而將其轉換為2 MB或1 GB的頁面。
通常,每個分頁結構條目的位51:12包含一個4 KB對齊的物理地址。對于除最后一個以外的每個條目,該地址是下一個分頁結構的地址;在最后一個條目中,它是4 KB的頁面框架的物理地址。通過將該頁面幀地址與原始線性地址的頁面偏移量位11:0組合來獲得最終物理地址。
因為在地址轉換中僅使用線性地址的47:0,所以處理器將保留位63:48用于將來的擴展,這個概念被稱為規范性(canonicality)。如果地址的位63:47相同,則線性地址是規范的。(換句話說,線性地址只有當位63:48是位47的符號擴展時才是規范的,位47是線性地址轉換中使用的最高位)。
當生成訪問存儲器的64位線性地址時,處理器首先確認地址是規范的。如果地址不是規范的,則內存訪問會導致故障,處理器不會嘗試轉換地址(注1)。
Intel 64架構包含許多定義為保持線性地址的寄存器。這些寄存器可以使用各種指令加載。在大多數情況下,如果嘗試使用不是規范的值加載其中一個寄存器,這些指令將導致一般保護異常(general-protection exception,#GP)。
分頁結構中超出列舉物理地址寬度的物理地址位被保留。如果嘗試訪問其轉換,遇到設置任何這些位的分頁結構條目的線性地址,則會導致頁錯誤異常(page-fault exception,#PF)。
1.2 線性地址寬度和VMX轉換
VM Entry和VM Exit處理包含線性地址的許多處理器寄存器。轉換以基于規范性的方式尊重處理器的線性地址寬度。
VMCS中的某些字段對應于包含線性地址的寄存器。
VM Entry確認大多數這些字段包含規范的值。一些寄存器,如RIP和LDTR基地址,可以接受特殊處理。
VM Exit將某些寄存器的狀態保存到VMCS中,其中一些寄存器包含線性地址。因為處理器通常確保這些寄存器中的值是規范的(參見第1.1節),這些寄存器的VM Exit保存的值通常是規范的。
注1:一般來說,使用不是規范的線性地址訪問內存的嘗試會導致通用保護異常(#GP)。如果使用SS段進行存儲器訪問,則會發生堆棧故障異常 - #SS。
VM Exit還從VMCS加載某些寄存器,其中一些寄存器包含線性地址。每個VM Exit確保每個這些寄存器的值是規范的。具體來說,寄存器的位47:0從主機狀態區域中的字段加載;然后位47的值被符號擴展到寄存器的位63:48。
1.3 現有擴展頁表(EPT)
支持VMX的大多數Intel 64處理器還支持稱為擴展頁表(EPT)的附加地址轉換層。
VM Entry可以配置為激活客戶軟件的EPT。當EPT處于活動狀態時,由分頁使用和產生的地址(第1.1節)不用作存儲器中引用的物理地址。相反,處理器將它們解釋為客戶機物理地址,并以由VMM確定的方式將其轉換為物理地址。 (這種從客戶機到物理的轉換不僅適用于分頁的輸出,還適用于處理器用于引用客戶機分頁結構的地址)。
如果EPT轉換過程無法轉換客戶物理地址,則會導致EPT違規。(當客戶物理地址的訪問違反由客戶物理地址的EPT建立的權限時,也可能發生EPT違規)。EPT違規是一個VMX特定的異常,通常導致VM Exit。
如第1.1節所述,現有的處理器將物理地址限制為46位。該限制也適用于客戶機物理地址。因此,EPT不會轉換超出此限制的客戶物理地址。 (例如,如果線性地址轉換遇到具有這種地址的分頁結構條目,則會出現分頁錯誤)。因此,現有的EPT僅限于轉換48個物理地址位。
現有的EPT轉換過程類似于前面圖1-1所示的分頁過程。像4級分頁一樣,處理器通過遍歷4-KByte EPT分頁結構的4級層次來實現EPT。最后一個EPT分頁結構條目包含最后物理地址的較高位,而最低位來自原始客戶機物理地址。
2 擴展線性地址:5級分頁
2.1 5級分頁:簡介
5級分頁是一種新的分頁模式,將在IA-32e模式下可用。顧名思義,它將通過遍歷分頁結構的5級層次結構來轉換線性地址。因為該過程是未修改的,所以5級分頁將處理器的線性地址寬度擴展到57位。(附加的9位用于從層次結構的第五級中選擇一個條目。)為了清楚起見,以前稱為IA-32e分頁的分頁模式現在將被稱為4級分頁。
本章的其余部分規定了5級分頁定義和所需的架構更改。第2.2節規定了CPU如何列舉新功能以及如何通過軟件啟用。第2.3節描述了線性地址生成過程的變化,以及對規范概念的修訂。
第2.4節詳細介紹了5級分頁如何轉換線性地址。第2.5節闡明了處理器如何處理包含線性地址的寄存器的加載,而第2.6節到第2.8節考慮與各種其他功能的交互。(與虛擬機擴展的交互在第3章中指定)。
2.2 列舉和啟用
本節介紹處理器如何列舉到5級分頁和相關功能的軟件支持,以及軟件如何使處理器能夠使用該支持。
2.2.1 CPUID的列舉
支持Intel 64架構的處理器通常使用CPUID指令來列舉特定于軟件的處理器功能。那些支持5級分頁的處理器通過新功能標志來列舉這一事實,以及通過如何報告相關功能的變化:
CPUID.(EAX = 07H,ECX = 0):ECX [位16]是一個新的特征標志,將列舉5級分頁的基本支持。所有較舊的處理器清除這一位。當且僅當它支持5級分頁時,處理器將設置此位。
如第1.1節所述,CPUID.80000008H:EAX [位15:8]列舉了處理器支持的最大線性地址寬度。所有支持Intel 64架構的舊處理器都將這個值列為48。支持5級分頁的處理器將列舉此值為57。
如第1.1節所述,CPUID.80000008H:EAX [位7:0]列舉了處理器支持的最大物理地址寬度。支持Intel 64架構的處理器最多列舉了46個。支持5級分頁的處理器預計將列舉更高的值,最多52。
CPUID.(EAX = 07H,ECX = 0H):ECX.MAWAU [位21:17]是列舉用戶MPX地址寬度調整(MAWAU)的現有字段。該值指定當CPL = 3時,BNDLDX和BNDSTX指令在64位模式下工作的高于48的線性地址位數。
支持Intel MPX的較舊的處理器列舉該值為0。支持5級分頁的處理器可以列舉0或9,具體取決于系統軟件的配置。有關BNDLDX和BNDSTX如何使用MAWAU以及系統軟件如何確定其值的更多詳細信息,請參見第2.7節。
- CPUID.(EAX = 12H,ECX = 0H):EDX [位15:8]是列舉指定64位enclave最大支持大小的信息的現有字段。如果列舉的值為n,則最大大小為2n。支持IntelSGX的較舊的處理器最多列舉了47個。支持5級分頁的處理器預計會將該值列舉為56。
2.2.2 由軟件啟用
第1.1節確定了軟件可以進入IA-32e模式的算法。在不支持5級分頁的處理器上,該算法支持4級分頁。在支持5級分頁的處理器上,可以改為啟用5級分頁。
支持5級分頁的處理器允許軟件設置一個新的啟用位CR4.LA57 [bit 12]。 IA-32e模式下的邏輯處理器(IA32_EFER.LMA = 1)如果CR4.LA57 = 1,使用5級分頁。在IA-32e模式之外(IA32_EFER.LMA = 0),CR4.LA57的值不影響分頁操作。
以下項目詳細說明了邏輯處理器如何確定當前的分頁模式。
- 如果CR0.PG = 0,分頁被禁用。
- 如果IA32_EFER.LMA = 0,則使用傳統32位分頁模式之一(取決于CR4中傳統分頁模式位的值).
- 如果IA32_EFER.LMA = 1和CR4.LA57 = 0,使用4級分頁。
- 如果IA32_EFER.LMA = 1和CR4.LA57 = 1,使用5級分頁。
因此,軟件可以使用以下算法進入具有5級分頁的IA-32e模式。
1。使用MOV CR指令設置CR4.PAE和CR4.LA57。
2。使用WRMSR指令設置IA32_EFER.LME。
3。使用MOV CR指令將CR3加載到PML5表的地址(參見第2.4節)。
4。使用MOV CR指令設置CR0.PG。
處理器允許軟件修改CR4.LA57只在IA-32e模式之外。在IA-32e模式下,嘗試使用MOV CR指令修改CR4.LA57會導致通用保護異常(#GP)。
2.3 線性地址生成和規范性
如第1.1節所述,線性地址寬度為48位的處理器將保留線性地址位63:48以供將來擴展。僅使用位47:0的線性地址(因為位63:48是位47的符號擴展名)被稱為規范的。
1。只有當CPUID.(EAX = 07H,ECX = 0):ECX [位16]被列舉為1時軟件才可以設置CR4.LA57。
2。回想一下,IA32_EFER.LMA是CR0.PG和IA32_EFER.LME的邏輯AND。
當生成訪問存儲器的64位線性地址時,處理器首先確認地址是規范的。如果地址不是規范的,則內存訪問會導致故障,并且地址未被轉換。
支持5級分頁的處理器可以在啟用5級分頁時轉換57位線性地址。但是,如果軟件僅啟用4級分頁,則這樣的處理器只能轉換48位線性地址。這個事實激發了兩種規范性的定義。
如果地址的位63:47相同,則線性地址是48位規范的。類似地,如果地址的位63:56相同,地址是57位規范的。任何48位規范的線性地址也是57位規范的。
當生成訪問存儲器的64位線性地址時,支持5級分頁的處理器基于當前分頁模式檢查規范性:如果啟用了4級分頁,則該地址必須是48位規范的;如果啟用了5級分頁,則該地址只能是57位規范的。如果沒有觀察到適當的規范性,則存儲器訪問會導致故障。
2.4 5級分頁:線性地址轉換
如2.2.2節所述,如果IA32_EFER.LMA = 1且CR4.LA57 = 1,則邏輯處理器使用5級分頁。
像4級分頁一樣,5級分頁使用內存分頁結構的層次結構來轉換線性地址。因為5級分頁將線性地址寬度增加到57位(從4級分頁支持的48位),5級分頁允許在任何給定時間訪問多達128 PBytes的線性地址空間。
也像4級分頁一樣,5級分頁使用CR3來定位層次結構中的第一個分頁結構。(5級分頁時CR3具有與4級分頁相同的模式特定格式)。以下項目更詳細地描述了5級分頁對轉換過程的變化。
- 轉換開始于識別4 KB自然對齊的PML5表。它位于CR3位51:12中指定的物理地址。PML5表包含512個64位條目(PML5E)。使用如下定義的物理地址選擇PML5E。
- 位51:12來自CR3。
- 位11:3是線性地址的位56:48。
- 位2:0都為0。
因為使用線性地址的位56:48來識別PML5E,所以它控制對線性地址空間的256-TByte區域的訪問。表2-1給出了PML5E的格式。
表2-1。引用PML4表的PML5條目(PML5E)格式
比特位置 | 內容 |
---|---|
0(P) | 存在;必須為1以引用PML4表。 |
1(R/W) | 讀/寫;如果為0,則可能不允許寫入由此條目控制的256-TByte區域。 |
2(U/S) | 用戶/特權;如果為0,則不允許用戶模式訪問到由此條目控制的256-TByte區域。 |
3(PWT) | 頁級寫通;間接確定用于訪問此條目引用的PML4表的內存類型。 |
4(PCD) | 頁級緩存禁用;間接確定用于訪問此條目引用的PML4表的內存類型。 |
5(A) | 已訪問;指示此條目是否已經被用于線性地址轉換。 |
6 | 忽略。 |
7(PS) | 保留(必須為0)。 |
11:8 | 忽略。 |
M-1:12 | 該條目引用的4 KB對齊的PML4表的物理地址。 |
51:M | 保留(必須為0)。 |
62:52 | 忽略。 |
63 | 如果IA32_EFER.NXE = 1,則執行禁用(如果為1,則不允許從此條目控制的256-TByte區域執行指令讀取);否則保留(必須為0)。 |
轉換過程的下一步確定一個4 KB的自然對齊的PML4表。它位于PML5E位51:12中指定的物理地址(見表2-1)。PML4表包括512個64位條目(PML4E)。使用如下定義的物理地址選擇PML4E。
位51:12來自PML5E。
位11:3是線性地址的位47:39。
位2:0都為0。
通常在訪問分頁結構條目時,用于訪問PML4E的存儲器類型部分地基于PML5E中的PCD和PWT位。
因為使用線性地址的位56:39來識別PML4E,所以它控制對線性地址空間的512GB字節區域的訪問。
一旦識別了PML4E,線性地址的位38:0確定了轉換過程的剩余部分,與4級分頁完全一樣。如表2-1所示,PML5E的位1,位2和位63的值被正常使用(與其他分頁結構條目中的相應位組合使用)來確定訪問權限。PML5E中的已訪問標志(位5)按照其他分頁結構條目進行更新。
5級分頁的操作如圖2-1所示。
2.5 線性地址寄存器和規范性
Intel 64架構包含許多定義為保持線性地址的寄存器。這些寄存器可以使用各種指令加載。如第1.1節所述,如果試圖加載一個不是規范的值的線性地址寄存器,則這些指令中的每一條通常會導致通用保護異常(#GP)。
如第2.3節所述,支持5級分頁的處理器使用規范性的兩種定義:48位規范性和57位規范性。本節介紹這種處理器如何檢查正在加載到線性地址寄存器中的值的規范性。一種方法用于加載RIP(指令指針;參見第2.5.1節)的操作,另一種用于加載其他寄存器的操作(參見第2.5.2節)。
2.5.1 RIP加載的規范性檢查
RIP寄存器包含CS段內當前指令指針的偏移量。由于處理器在64位模式下將CS基址視為零,所以該模式下的RIP寄存器的值是指令指針的線性地址。
加載RIP(包括JMP等指令以及通過IDT進行控制傳輸)的操作首先檢查要加載的值是否相對于當前分頁模式是規范的。如果處理器確定地址不是規范的,則不會執行RIP加載,并發生通用保護異常(#GP)。
注意:引起非規范地址故障的RIP加載指令,意味著故障處理程序的返回指令指針是故障指令的地址,而不是嘗試加載的非規范地址。
當4級分頁活動時,由這些操作執行的規范檢查使用48位規范。當5級分頁活動時,檢查放寬,只需要57位規范。
SYSCALL和SYSENTER指令分別從IA32_LSTAR和IA32_SYSENTER_EIP MSRs加載RIP。在僅支持4級分頁的處理器上,這些指令不會檢查正在加載的值是否合法,因為WRMSR指令可確保每個MSR都包含一個48位規范的值。在支持5級分頁的處理器上,WRMSR的檢查放寬到57位規范(見第2.5.2節)。在這樣的處理器上,執行具有4級分頁的SYSCALL或SYSENTER會檢查加載到RIP中的值是否為48位規范的。
指令指針正常前進到下一個指令邊界可能導致RIP寄存器保持非規范地址。從非規范地址獲取下一條指令將導致一般保護異常,如第2.3節所示。在這種情況下,故障處理程序的返回指令指針將是非規范地址。
2.5.2 其他加載的規范性檢查
除了RIP之外,CPU還保留了許多其他保存線性地址的寄存器:
- GDTR和IDTR(在它們的基地址部分)。
- LDTR,TR,FS和GS(在其隱藏的描述符緩存的基址部分)。
- 調試地址寄存器(DR0到DR3),它保存斷點的線性地址。
- 以下MSR:IA32_BNDCFGS,IA32_DS_AREA,IA32_KERNEL_GS_BASE,IA32_LSTAR,IA32_RTIT_ADDR0_A,IA32_RTIT_ADDR0_B,IA32_RTIT_ADDR1_A,IA32_RTIT_ADDR1_B,IA32_RTIT_ADDR2_A,IA32_RTIT_ADDR2_B,IA32_RTIT_ADDR3_A,IA32_RTIT_ADDR3_B,IA32_SYSENTER_EIP和IA32_SYSENTER_ESP。
- x87 FPU指令指針(FIP)。
- 由Intel MPX使用的用戶模式配置寄存器BNDCFGU。
除了一些例外,處理器確保這些寄存器中的地址總是以以下方式規范化。
- 嘗試使用非規范地址加載線性地址寄存器時的某些指令錯誤。
- 如果指令的存儲器操作數中指定的基址不是規范的,則LGDT或LIDT指令的執行將導致通用保護異常(#GP)。
- 如果從GDT加載基地址不是規范的,LLDT或LTR指令的執行將導致#GP。
- 如果將加載FS或GS的基地址是非規范地址,WRMSR,WRFSBASE或WRGSBASE的執行會導致#GP。
- 如果用非規范地址加載任何下面的MSR,WRMSR的執行導致#GP:IA32_BNDCFGS,IA32_DS_AREA,IA32_FS_BASE,IA32_GS_BASE,IA32_KERNEL_GS_BASE,IA32_LSTAR,IA32_RTIT_ADDR0_A,IA32_RTIT_ADDR0_B,IA32_RTIT_ADDR1_A,IA32_RTIT_ADDR1_B,IA32_RTIT_ADDR2_A,IA32_RTIT_ADDR2_B,IA32_RTIT_ADDR3_A ,IA32_RTIT_ADDR3_B,IA32_SYSENTER_EIP或
IA32_SYSENTER_ESP(注2)。
注1。補充SYSCALL和SYSENTER的SYSRET和SYSEXIT指令分別從RCX和RDX加載RIP。即使在5級分頁之前,這些指令檢查要加載到RIP的值的規范性。與其他加載RIP的指令一樣,此檢查將基于當前的分頁模式。
注2。當WRMSR指令用于加載一些保存線性地址的非架構MSR(此處未列出)時,也可以應用這種規范檢查。
- 如果使用非規范地址的加載以下任何MSR,XRSTORS的執行會導致#GP:IA32_RTIT_ADDR0_A,IA32_RTIT_ADDR0_B,IA32_RTIT_ADDR1_A,IA32_RTIT_ADDR1_B,IA32_RTIT_ADDR2_A,IA32_RTIT_ADDR2_B,IA32_RTIT_ADDR3_A和IA32_RTIT_ADDR3_B。
由于少數異常,這種執行總是使用列舉的最大線性地址寬度,并且與當前的分頁模式無關。
因此,支持5級分頁的處理器將允許上述指令以57位規范但不是48位規范的地址加載這些寄存器,即使4級分頁處于活動狀態。(因此,存儲這些值的指令(SGDT,SIDT,SLDT,STR,RDFSBASE,RDGSBASE,RDMSR,XSAVE,XSAVEC,XSAVEOPT和XSAVES)可以保存57位規范但不是48位規范的地址,即使4級分頁處于活動狀態。)
分別加載FS和GS基地址的WRFSBASE和WRGSBASE指令的運行方式不同。這些指令中的任何一個的執行將導致#GP,如果它將加載相對于當前分頁模式的不是規范的地址的基址。因此,如果4級分頁活動,則這些指令不允許加載57位規范但不是48位規范的地址。
- FXRSTOR,XRSTOR和XRSTORS指令忽略了使用非規范地址加載其中某些寄存器的嘗試:
- FIP加載忽略存儲器映像中除列舉的最大線性地址寬度之外的任何位。處理器符號擴展到最高有效位(例如,支持5級分頁的處理器上的位56),以確保FIP始終是規范的。
- BNDCFGU的加載(由XRSTOR或XRSTORS)忽略存儲器映像中除列舉的最大線性地址寬度之外的任何位。處理器符號擴展到最高有效位(例如,支持5級分頁的處理器上的位56),以確保BNDCFGU始終是規范的。
- 每個非控制x87指令加載FIP。加載的值總是相對于當前分頁模式是規范的:如果4級分頁處于活動狀態,則為48位規范,如果5級分頁處于活動狀態,則為57位規范。
DR0到DR3可以裝載MOV到DR指令。該指令允許這些寄存器加載非規范地址。即使地址不是規范,MOV從DR指令的MOV將返回上次裝載到MOV指令的值。斷點地址匹配僅適用于規范線性地址。
2.6 與TLB無效指令的交互
Intel 64架構包括三個指令,可以使指令操作數的線性地址的TLB條目無效:INVLPG,INVPCID和INVVPID。以下項描述了它們如何受線性地址寬度的影響。
- INVLPG指令需要一個內存操作數。它使邏輯處理器正在為當前線性地址空間的該操作數的線性地址緩存的任何TLB條目無效。如果該地址相對于當前分頁模式不是規范的,則該指令不會發生故障(例如,當4級分頁處于活動狀態時,該指令不是48位規范的)。但是,由于處理器不緩存相對于當前分頁模式不是規范的地址的TLB條目,因此不執行無效。
- INVPCID指令采用寄存器操作數(INVPCID類型)和存儲器操作數(INVPCID描述符)。如果INVPCID類型為0,則該指令使邏輯處理器對于INVPCID描述符中指定的線性地址和PCID緩存的任何TLB條目無效。如果線性地址與處理器支持的線性地址寬度相關,則該指令將導致一般保護異常(#GP)。如果處理器支持5級分頁,則即使4級分頁處于活動狀態且地址不是48位規范,該指令也不會對于57位規范的地址造成這樣的#GP,無論分頁模式如何。
- INVVPID指令采用寄存器操作數(INVVPID類型)和存儲器操作數(INVVPID描述符)。如果INVPCID類型為0,則該指令使邏輯處理器正在為INVVPID描述符中指定的線性地址和VPID緩存的TLB條目無效。如果線性地址不符合處理器支持的線性地址寬度,那么指令將失敗.1如果處理器支持5級分頁,則對于57位規范的地址,無論分頁如何,該指令都不會失敗模式,即使4級分頁處于活動狀態,并且地址不是48位規范的。
2.7 與Intel MPX的交互
Intel內存保護擴展(Intel MPX)定義了一組4個綁定的寄存器,每個綁定的寄存器都可以與存儲器中的特定指針相關聯。英特爾MPX包含兩個指令——BNDLDX和BNDSTX,允許軟件從內存中加載或存儲與內存中特定指針相關聯的邊界。
BNDLDX和BNDSTX指令每個都采用綁定寄存器和存儲器操作數(相關聯的指針)。每個都解析存儲器操作數的線性地址以遍歷存儲器中的分層數據結構。在64位模式下,這些指令不一定使用所提供的64位地址中的所有位。
使用的位數為48加一個稱為MPX地址寬度調整(MAWA)的值。
MAWA的價值取決于CPL;當前分頁模式(4級分頁或5級分頁);并且,如果5級分頁處于活動狀態,則為新的MSR的值。支持Intel MPX和5級分頁的處理器支持IA32_MPX_LAX MSR(MSR index 1000H)。只定義MSR的位0。
如果CPL <3,則使用特權MAWA(MAWAS)。MAWAS的值由CR4.LA57的設置決定。如果CR4.LA57 = 0(4級分頁活動;調用MAWA僅在64位模式下相關),MAWAS的值為0。如果CR4.LA57 = 1(5級分頁有效),MAWAS的值為9。CPUID指令未列舉MAWAS的值。
如果CPL = 3,則使用用戶MAWA(MAWAU)。MAWAU的值如下確定。如果CR4.LA57 = 0或IA32_MPX_LAX [位0] = 0,MAWAU的值為0。如果CR4.LA57 = 1,IA32_MPX_LAX [位0] = 1,MAWAU的值為9。列出了MAWAU的當前值CPUID.(EAX = 07H,ECX = 0H):ECX.MAWAU [位21:17]。
以下項目指定64位模式下BNDLDX和BNDSTX指令的執行方式如何解析線性地址以遍歷分層數據結構。
1。INVVPID是一個VMX指令。為了響應某些條件,VMX的執行可能會失敗,這意味著它不能完成其正常的操作。當VMX指令失敗時,控制轉到下一條指令(而不是故障處理程序),并設置一個標志來報告故障。
- 綁定的目錄位于BNDCFGx.1位63:12中指定的4 KB對齊的線性地址。使用LAp(指向緩沖區的指針的線性地址)選擇BDE以構造64位偏移,如下所示:
- 位63:31 + MAWA為0;
- 位30 + MAWA:3是LAp [位47 + MAWA:20];和
- 位2:0為0。
BDE的地址是綁定目錄基址(從BNDCFGx)加上這個64位偏移量的總和。
如果BNDLDX或BNDSTX在一個enclave內執行,指令就像MAWAU = 0一樣操作(不管CR4的值如何)。LA57和IA32_MPX_LAX [位0])。
- 處理器使用BDE的位63:3作為綁定表(BT)的8字節對齊地址。使用LAp(指向緩沖區的指針的線性地址)來選擇BTE來構造64位偏移,如下所示:
- 位63:22為0;
- 位21:5是LAp [位19:3];和
- 位4:0為0。
BTE的地址是綁定表基地址(從BDE)加上這個64位偏移量的和。
綁定目錄包括228 + MAWA 64位條目(BDE); 2因此,64位模式下綁定目錄的大小為21 + MAWA GBytes。綁定表包含217個32字節條目(BTE);因此,64位模式下的綁定表的大小為4 MBytes(與MAWA無關)。
2.8 與Intel SGX的互動
Intel軟件保護擴展(Intel SGX))定義了新的處理器功能,這些功能在ENCLS(特權)和ENCLU(用戶)指令中被實現為SGX leaf功能。
SGX leaf功能包括正常使用線性地址的存儲器訪問。當以64位模式執行時,線性地址的寬度為64位,并且受到64位線性地址對存儲器訪問的正常處理(見第2.3節)。另外,一些leaf功能應用與線性地址寬度相關的特定架構檢查。以下項目詳細介紹了這些檢查以及如何為支持5級分頁的處理器定義它們。
- ENCLS的ECREATE leaf功能通過創建新的SGX enclave控制結構(SECS)來創建新的enclave。對于64位的enclave,處理器檢查enclave線性基地址(SECS中指定的)是否是規范的,如果不是,則產生通用保護異常(#GP)。在支持5級分頁的處理器上,無論當前的分頁模式如何,此檢查均為57位規范。
除了檢查enclave線性基地址的規范性外,ECREATE還確認了在SECS中指定的enclave大小不大于處理器支持的最大尺寸(如果enclave大小太大,ECREATE將生成#GP )。如第2.2.1節所述,較舊的處理器支持大小為247字節的64位enclave;支持5級分頁的處理器預計將支持大小最多為256字節的enclave。
如果enclave的XSAVE特征請求掩碼(XFRM)的位4:3被設置(指示在執行enclave期間將啟用Intel MPX),則如果enclave的大小大于248字節,則ECREATE將生成#GP,即使處理器列舉了對較大enclave的支持。
注1。如果CPL < 3,則使用BNDCFGS;如果CPL = 3,則使用BNDCFGU。
注2。在64位enclave中使用的綁定目錄始終包含228個64位BDE,因此具有2 GBytes的大小。
- ENCLU的EENTER和ERESUME leaf功能將控制流傳送到指定enclave內的入口點。對于進入64位enclave,處理器檢查某些線性地址是否是規范的,如果沒有,則產生一般保護異常(#GP)。以下項目詳細說明這些檢查。
- 指定入口點的線性地址必須是規范的。如果4級分頁活動,則必須是48位規范;如果5級分頁處于活動狀態,則必須是57位規范。
- 異步出口點的線性地址(AEP-處理器在異步enclave出口處傳輸控制的地址)必須是規范的。如果4級分頁活動,則必須是48位規范;如果5級分頁處于活動狀態,則必須是57位規范。
- FS和GS段的基址的enclave數值必須是規范的。在支持5級分頁的處理器上,無論當前的分頁模式如何,這些檢查均為57位規范。
- EEXIT leaf功能退出當前執行的enclave并分支到指定的地址。對于從64位enclave出口,處理器檢查該目標線性地址是否是規范的,如果不是,則生成通用保護異常(#GP)。如果4級分頁活動,則必須是48位規范;如果5級分頁活動,則只需要57位規范。
如第2.7節所述,64位enclave中BNDLDX和BNDSTX的執行總是像MAWAU = 0一樣運行。
3 線性地址擴展和VMX轉換
如第1.2節所述,VM Entry和VM Exit會操作包含線性地址的許多處理器寄存器。轉換以基于規范性的方式尊重處理器的線性地址寬度。
如第2章所述,支持5級分頁的處理器將線性地址寬度從48位擴展到57位。該擴展更改了VMX轉換的操作。VM Entry的更改在第3.1節中詳細介紹,而VM Exit的更改在3.2節中給出。
3.1 線性地址擴展和VM Entry
VMCS中的某些字段對應于包含線性地址的寄存器。
VM Entry確認這些字段包含規范的值。該檢查基于處理器支持的線性地址寬度(例如,如果處理器支持5級分頁,則基于57位規范)。以下是適用于此的字段。
- 在主機區域:
- IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSR的字段。
- FS,GS,TR,GDTR和IDTR的基地址字段。
- 在客戶機區域:
- IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSR的字段。
- FS,GS,TR,GDTR和IDTR的基地址字段。
- LDTR的基地址字段(如果LDTR可用)。
- IA32_BNDCFGS MSR的字段(如果VM Entry正在加載該MSR)。
到64位模式的虛擬機進入還對當前VMCS的客戶狀態區域中的RIP字段進行檢查。如果VM Entry將導致4級分頁,則會檢查Guest RIP字段的位63:48是否相同;如果這將導致5級分頁,該檢查位63:57.1
3.2 線性地址擴展和虛擬機退出
VM Exit將某些寄存器的狀態保存到VMCS的客戶狀態區域。這些寄存器中的一些包含線性地址。如第1.1節所述,CPU通常確保這些寄存器中的值與CPU的線性地址寬度相關。因此,這些寄存器的VM Exit保存的值也將一樣。
注1。請注意,這些檢查不會確認客戶機RIP字段是否相對于輸入的分頁模式是規范的。例如,位63:47在48位規范地址中是相同的。然而,
VM Entry4級分頁可能會加載一個值,比特47與位63:48的值不同。
LDTR基地址有一個特殊情況。如果在退出VM時LDTR不可用,則保存為基地址的值未定義。但是,在不支持5級分頁的處理器上,這個未定義的值總是為48位,在支持5級分頁的處理器上始終為57位規范。
VM Exit從VMCS的主機狀態區域加載某些寄存器的狀態。這些寄存器中的一些包含線性地址。每個VM Exit確保以下每個寄存器的值是規范的:IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSRs;以及FS,GS,TR,GDTR和IDTR的基址。這樣做取決于處理器是否支持5級分頁。
- 如果處理器不支持5級分頁,則寄存器中的位47:0將從主機狀態區域中的字段加載;位47的值然后被符號擴展到寄存器的位63:48。
- 如果處理器支持5級分頁,則寄存器的位56:0將從主機狀態區域中的字段加載;然后,位56的值被符號擴展到寄存器的位63:57。
再次,LDTR有一個特殊情況。在VM Exit后,LDTR始終不可用。它的基地址可以加載一個未定義的值。在不支持5級分頁的處理器上,這個未定義的值始終是48位規范的,并且在支持5級分頁的處理器上始終是57位規范的。
4 5級EPT
5級EPT是EPT的新模式。顧名思義,它將通過遍歷EPT分頁結構的5級層次結構來轉換客戶機物理地址。由于該過程是未經修改的,5級分頁將處理器的客戶物理地址寬度擴展到57位。(附加的9位用于從層次結構的第五級中選擇一個條目。)為了清楚起見,原來的EPT模式現在稱為4級EPT。
本章的其余部分規定了4級EPT的架構更改以及5級EPT所定義和引入的架構。第4.1節描述了客戶物理地址寬度的擴展如何影響4級EPT。第4.2節規定了CPU如何列舉5級EPT以及軟件如何啟用該功能。
第4.3節詳細介紹了5級EPT如何轉換客戶機物理地址。
4.1 4級EPT:客戶機地址
如1.3節所述,4級EPT僅限于轉換48位客戶機物理地址。
這在現有的處理器上不是問題,因為它們將物理地址寬度限制為46位(見第1.1節)。處理器的物理地址寬度也限制客戶機物理地址。這意味著,在現有的處理器上,任何嘗試使用設置低于低48位的客戶機 - 物理地址將導致頁錯誤異常(#PF)。
支持5級分頁的處理器預計將支持52個物理地址位。這樣的處理器允許使用設置在51:48范圍內的位的客戶機物理地址;不生成#PF。
設置51:48范圍內的位的客戶機物理地址無法通過4級EPT進行轉換。當4級EPT處于活動狀態時嘗試訪問此地址會導致EPT違規(參見第1.3節)。
EPT違規在稱為退出資格的值中生成關于異常的信息。一般來說,嘗試訪問太寬的客戶物理地址導致的EPT違規建立了目前為其他EPT違規執行的退出限定條件。退出限定的位6:3作出異常,它報告客戶機物理地址的訪問權限。新的EPT違規總是清除這些位。
4.2 5級EPT:啟用和啟用
本節介紹處理器如何列舉到5級EPT的軟件支持以及軟件如何使處理器能夠使用該支持。
4.2.1 列舉
支持EPT的處理器列舉了IA32_VMX_EPT_VPID_CAP MSR(索引48CH)中與EPT相關的詳細信息。目前,IA32_VMX_EPT_VPID_CAP [bit 6]列舉了4級EPT的支持。也支持5級EPT的處理器將通過設置IA32_VMX_EPT_VPID_CAP [bit 7]來列舉該事實。
處理器支持的客戶機物理地址寬度未使用IA32_VMX_EPT_VPID_CAP MSR列舉。這是因為寬度總是與CPUID.80000008H列舉的處理器的最大物理地址寬度相同:EAX [位7:0]。
4.2.2 由軟件啟用
通過在使用VMCS進行VM輸入之前,通過在當前VMCS中設置 “啟用EPT” VM執行控制,VMM啟用EPT。
EPT操作的具體細節由VMCS中的擴展頁表指針字段(EPTP)確定。特別地,EPTP [位5:3]包含比EPT使用的級別小1的值。在現有的處理器上,此值必須為3,表示4級EPT。 (如果使用不同的值,VM Entry將失敗。)也支持5級EPT的處理器也將允許值4(表示5級EPT)。
總之,在支持5級檢查EPTP的處理器上的VM Entry[位5:3]。如果值為3,VM Entry激活4級EPT。如果值為4,VM Entry激活5級EPT。使用任何其他值,VM Entry失敗。
4.3 5級EPT:客戶機物理地址轉換
像4級EPT一樣,5級EPT使用內存分頁結構的層次結構來轉換客戶機物理地址。因為5級EPT將客戶機物理地址寬度增加到57位(從4級EPT支持的48位),5級EPT允許訪問物理地址空間最多128 PBy給定時間
以下項目更詳細地描述了5級EPT對轉換過程的變化。
- 轉換開始于識別4 KB自然對齊的EPT PML5表。它位于EPTP位51:12中指定的物理地址。 EPT PML5表包括512個64位條目(EPT PML5E)。使用如下定義的物理地址選擇EPT PML5E。
- 位63:52都是0。
- 位51:12來自EPTP。
- 位11:3是客戶機物理地址的位56:48。
- 位2:0都為0。
因為使用客戶機物理地址的位56:48來識別EPT PML5E,所以它控制對線性地址空間的256-TByte區域的訪問。EPT PML5E的格式如表4-1所示。
表4-1。EPT PML5條目(EPT PML5E)
比特位置 | 內容 |
---|---|
0 | 讀取權限指示是否允許從此條目控制的256-TByte區域讀取。 |
1 | 寫入訪問;指示是否允許從此條目控制的256-TByte區域寫入。 |
2 | 如果 “執行EPT的基于模式的執行控制” VM執行控制為0,則執行訪問;指示是否允許從此條目控制的256 TByte區域執行指令讀取。如果該控制為1,則執行監督模式線性地址的訪問;指示是否允許從該條目控制的256-TByte區域中的監督模式線性地址進行指令讀取。 |
7:3 | 保留(必須為0)。 |
8 | 如果EPTP的第6位為1,則EPT的訪問標志;指示軟件是否訪問了由此條目控制的256-TByte區域。如果EPTP的第6位為0,則忽略。 |
9 | 忽略。 |
10 | 執行用戶模式線性地址的訪問。如果 “基于模式的EPT執行控制” VM執行控制為1,則指示是否允許從該條目控制的256-TByte區域中的用戶模式線性地址進行指令讀取。如果該控件為0,則忽略該位。 |
11 | 忽略。 |
M-1:12 | 本條引用的4 KB對齊EPT PML4表的物理地址。 |
51:M | 保留(必須為0)。 |
63:52 | 忽略。 |
- 轉換過程的下一步確定一個4 KB自然對齊的EPT PML4表。它位于EPT PML5E的位51:12中指定的物理地址(見表4-1)。EPT PML4表包括512個64位條目(EPT PML4E)。使用如下定義的物理地址選擇EPT PML4E。
- 位51:12來自EPT PML5E。
- 位11:3是客戶機物理地址的位47:39。
- 位2:0都為0。
因為使用客戶機物理地址的位56:39來識別EPT PML4E,所以它控制訪問物理地址空間的512 GB字節區域的訪問。
一旦識別了EPT PML4E,客戶機物理地址的位38:0確定了與4級EPT完全相同的轉換過程的剩余部分。如表4-1所示,EPT PML5E的位2:0和位10的值正常使用(與其他EPT分頁結構條目中的相應位組合使用)來確定是否發生EPT違規。EPT PML5E中的訪問標志(位8)如對其他EPT分頁結構條目所做的那樣進行更新。
4.4 5級EPT和EPTP切換
可以通過調用在VMX非root操作中的VM功能0來修改EPTP的值
(EPTP切換)。這通過執行在EAX寄存器中值為0的VMFUNC指令來完成。VM功能的調用0使用從內存中的數據結構中選擇的值加載EPTP。
在以這種方式加載EPTP之前,處理器首先確認要加載的值是有效的。有效EPTP值的定義取決于處理器是否支持5級EPT。
- 如果處理器不支持5級EPT,如果不會導致VM Entry失敗(例如,它不設置任何保留位),則內存中的EPTP值被認為是有效的。
- 如果處理器支持5級EPT,則只有在不會導致VM Entry失敗(如上),以及其5:3(控制EPT級別數量)的值與EPTP的當前值相同時,內存中的EPTP值才被視為有效。
這意味著VM功能0的調用不能改變4級EPT和5級EPT之間的EPT模式。
5 Intel虛擬化
Intel用于定向I/O的虛擬化技術包括稱為DMA重映射(DMA remapping)的功能。
DMA重映射為隔離設備訪問內存提供了硬件支持。當設備嘗試訪問系統內存時,DMA重映射硬件??攔截訪問并利用分頁結構來確定訪問是否被允許;它還決定了訪問的實際位置。
DMA重映射硬件??可能支持兩級地址轉換。一個級別可以將線性地址轉換為客戶機物理地址,而第二級可以將客戶機物理地址重映射到物理地址。
第一級轉換使用與普通分頁相同格式的分頁結構。第二級轉換使用與EPT所用格式相同格式的分頁結構。
預計在支持更寬的線性和客戶機物理地址(分別使用5級分頁和5級EPT)的平臺上,DMA重新映射硬件將被類似地增強,以具有5級轉換過程來支持那些更寬的地址。
這種對DMA重映射的增強支持將在未來對用于定向I/O架構規范的Intel虛擬化技術的修訂版本中進行詳細說明。