Intel 64架構(gòu)5級(jí)分頁和5級(jí)EPT白皮書

5-Level Paging and 5-Level EPT white paper原文

修訂版本1.1 2017年5月

注意:本文檔包含有關(guān)開發(fā)設(shè)計(jì)階段產(chǎn)品的信息。這里的信息如有更改,恕不另行通知。請勿使用此信息確定設(shè)計(jì)。

英特爾技術(shù)的功能和優(yōu)點(diǎn)取決于系統(tǒng)配置,可能需要啟用硬件,軟件或激活服務(wù)。在intel.com或OEM或零售商處了解更多信息。

1 介紹

本文檔描述了Intel 64架構(gòu)的計(jì)劃擴(kuò)展,以擴(kuò)展可通過處理器內(nèi)存轉(zhuǎn)換硬件轉(zhuǎn)換的地址大小。

現(xiàn)代操作系統(tǒng)使用稱為分頁的地址轉(zhuǎn)換支持。分頁將軟件使用的線性地址(也稱為虛擬地址)轉(zhuǎn)換為用于訪問存儲(chǔ)器(或存儲(chǔ)器映射的I/O)的物理地址。1.1節(jié)描述了Intel 64處理器上的64位分頁硬件?,F(xiàn)有處理器將線性地址限制為48位。第2章描述了將擴(kuò)展限制為57個(gè)線性地址位的分頁擴(kuò)展。

虛擬機(jī)監(jiān)視器(VMM)使用虛擬機(jī)擴(kuò)展(VMX)來支持在虛擬機(jī)中運(yùn)行的客戶機(jī)軟件。VMX交換是VMM和客戶軟件之間的控制流傳輸。VMX轉(zhuǎn)換涉及加載和存儲(chǔ)各種處理器寄存器。這些寄存器中的一些被定義為包含線性地址。因此,VMX轉(zhuǎn)換的操作部分取決于處理器支持的線性地址寬度。第1.2節(jié)描述了VMX轉(zhuǎn)換對線性地址寄存器的現(xiàn)有處理,而第3章描述了支持較大線性地址所需的更改。

VMM還可以使用稱為擴(kuò)展頁面表(extended page tables,EPT)的附加地址轉(zhuǎn)換支持。當(dāng)使用EPT時(shí),分頁產(chǎn)生客戶機(jī)物理地址,EPT將轉(zhuǎn)換為物理地址。1.3節(jié)描述了現(xiàn)有Intel 64處理器上的EPT硬件,將客戶物理地址限制為48位。第4章描述EPT擴(kuò)展以支持57個(gè)客戶機(jī)物理地址位。

1.1 IA-32e模式中的現(xiàn)有分頁

在支持Intel 64架構(gòu)的處理器上,軟件通常使用線性地址來引用內(nèi)存。大多數(shù)現(xiàn)代操作系統(tǒng)將處理器配置為使用分頁,將線性地址轉(zhuǎn)換為物理地址。處理器使用生成的物理地址來訪問內(nèi)存。

IA-32e模式是一種處理器執(zhí)行模式,可擴(kuò)展舊的32位操作,稱為傳統(tǒng)模式。軟件可以使用以下算法進(jìn)入IA-32e模式。

1。使用MOV CR指令設(shè)置CR4.PAE [位5]。(必須啟用物理地址擴(kuò)展才能進(jìn)入IA-32e模式)。
2。使用WRMSR指令設(shè)置IA32_EFER MSR(索引C0000080H)的位8(LME)。
3。使用MOV CR指令將CR3加載為PML4表的地址(見下文)。
4。使用MOV CR指令設(shè)置CR0.PG [位31]。

每當(dāng)CR0.PG = 1且IA32_EFER.LME = 1時(shí),邏輯處理器處于IA-32e模式。這個(gè)事實(shí)在IA32_EFER.LMA [位10]中報(bào)告。軟件無法直接設(shè)置該位;它始終是CR0.PG和IA32_EFER.LME的邏輯AND。

在IA-32e模式中,線性地址的大小為64位。但是,相應(yīng)的分頁模式(當(dāng)前稱為I A-32e分頁)不使用所有64個(gè)線性地址位。

IA-32e分頁不使用所有64個(gè)線性地址位,因?yàn)樘幚砥飨拗凭€性地址的大小。該限制由CPUID指令列舉。具體來說,CPUID.80000008H:EAX [位15:8]列舉處理器支持的線性地址位數(shù)(最大線性地址寬度)。現(xiàn)有的處理器將此值列舉為48。

注意:處理器還限制物理地址的大小,并使用CPUID列舉限制。CPUID.80000008H:EAX [位7:0]列舉處理器支持的物理地址位數(shù),最大物理地址寬度?,F(xiàn)有的處理器列舉了高達(dá)46的值。只有通過設(shè)置CR4.PAE(控制寄存器CR4的位5)啟用了物理地址擴(kuò)展,軟件才能使用超過32個(gè)物理地址位。

對線性地址寬度的列舉限制意味著分頁僅轉(zhuǎn)換每個(gè)64位線性地址的低48位。在生成線性地址但在轉(zhuǎn)換之前,處理器確認(rèn)地址僅使用處理器支持的48位。

對48個(gè)線性地址位的限制來自于IA-32e分頁的性質(zhì),如圖1-1所示。

圖1-1 使用I-32e分頁的線性地址轉(zhuǎn)換

注1:IA-32e模式包括兩種子模式:兼容模式和64位模式。在兼容模式下,軟件使用32位地址,處理器零擴(kuò)展到64位線性地址。在64位模式下,軟件直接使用64位地址。

處理器通過遍歷其根結(jié)構(gòu)位于控制寄存器CR3中的物理地址的分頁結(jié)構(gòu)的4級(jí)層次來執(zhí)行IA-32e分頁。每個(gè)分頁結(jié)構(gòu)的大小為4 KB,包含512個(gè)8字節(jié)的條目。處理器使用線性地址(位47:12)的高36位,一次9位,從層次結(jié)構(gòu)中選擇分頁結(jié)構(gòu)條目。

注意:圖1-1說明了將線性地址轉(zhuǎn)換為4 KB的頁面??梢耘渲梅猪撨^程,使得某些線性地址的轉(zhuǎn)換可以更早地停止一個(gè)或兩個(gè)級(jí)別,從而將其轉(zhuǎn)換為2 MB或1 GB的頁面。

通常,每個(gè)分頁結(jié)構(gòu)條目的位51:12包含一個(gè)4 KB對齊的物理地址。對于除最后一個(gè)以外的每個(gè)條目,該地址是下一個(gè)分頁結(jié)構(gòu)的地址;在最后一個(gè)條目中,它是4 KB的頁面框架的物理地址。通過將該頁面幀地址與原始線性地址的頁面偏移量位11:0組合來獲得最終物理地址。

因?yàn)樵诘刂忿D(zhuǎn)換中僅使用線性地址的47:0,所以處理器將保留位63:48用于將來的擴(kuò)展,這個(gè)概念被稱為規(guī)范性(canonicality)。如果地址的位63:47相同,則線性地址是規(guī)范的。(換句話說,線性地址只有當(dāng)位63:48是位47的符號(hào)擴(kuò)展時(shí)才是規(guī)范的,位47是線性地址轉(zhuǎn)換中使用的最高位)。

當(dāng)生成訪問存儲(chǔ)器的64位線性地址時(shí),處理器首先確認(rèn)地址是規(guī)范的。如果地址不是規(guī)范的,則內(nèi)存訪問會(huì)導(dǎo)致故障,處理器不會(huì)嘗試轉(zhuǎn)換地址(注1)。

Intel 64架構(gòu)包含許多定義為保持線性地址的寄存器。這些寄存器可以使用各種指令加載。在大多數(shù)情況下,如果嘗試使用不是規(guī)范的值加載其中一個(gè)寄存器,這些指令將導(dǎo)致一般保護(hù)異常(general-protection exception,#GP)。

分頁結(jié)構(gòu)中超出列舉物理地址寬度的物理地址位被保留。如果嘗試訪問其轉(zhuǎn)換,遇到設(shè)置任何這些位的分頁結(jié)構(gòu)條目的線性地址,則會(huì)導(dǎo)致頁錯(cuò)誤異常(page-fault exception,#PF)。

1.2 線性地址寬度和VMX轉(zhuǎn)換

VM Entry和VM Exit處理包含線性地址的許多處理器寄存器。轉(zhuǎn)換以基于規(guī)范性的方式尊重處理器的線性地址寬度。

VMCS中的某些字段對應(yīng)于包含線性地址的寄存器。

VM Entry確認(rèn)大多數(shù)這些字段包含規(guī)范的值。一些寄存器,如RIP和LDTR基地址,可以接受特殊處理。

VM Exit將某些寄存器的狀態(tài)保存到VMCS中,其中一些寄存器包含線性地址。因?yàn)樘幚砥魍ǔ4_保這些寄存器中的值是規(guī)范的(參見第1.1節(jié)),這些寄存器的VM Exit保存的值通常是規(guī)范的。

注1:一般來說,使用不是規(guī)范的線性地址訪問內(nèi)存的嘗試會(huì)導(dǎo)致通用保護(hù)異常(#GP)。如果使用SS段進(jìn)行存儲(chǔ)器訪問,則會(huì)發(fā)生堆棧故障異常 - #SS。

VM Exit還從VMCS加載某些寄存器,其中一些寄存器包含線性地址。每個(gè)VM Exit確保每個(gè)這些寄存器的值是規(guī)范的。具體來說,寄存器的位47:0從主機(jī)狀態(tài)區(qū)域中的字段加載;然后位47的值被符號(hào)擴(kuò)展到寄存器的位63:48。

1.3 現(xiàn)有擴(kuò)展頁表(EPT)

支持VMX的大多數(shù)Intel 64處理器還支持稱為擴(kuò)展頁表(EPT)的附加地址轉(zhuǎn)換層。

VM Entry可以配置為激活客戶軟件的EPT。當(dāng)EPT處于活動(dòng)狀態(tài)時(shí),由分頁使用和產(chǎn)生的地址(第1.1節(jié))不用作存儲(chǔ)器中引用的物理地址。相反,處理器將它們解釋為客戶機(jī)物理地址,并以由VMM確定的方式將其轉(zhuǎn)換為物理地址。 (這種從客戶機(jī)到物理的轉(zhuǎn)換不僅適用于分頁的輸出,還適用于處理器用于引用客戶機(jī)分頁結(jié)構(gòu)的地址)。

如果EPT轉(zhuǎn)換過程無法轉(zhuǎn)換客戶物理地址,則會(huì)導(dǎo)致EPT違規(guī)。(當(dāng)客戶物理地址的訪問違反由客戶物理地址的EPT建立的權(quán)限時(shí),也可能發(fā)生EPT違規(guī))。EPT違規(guī)是一個(gè)VMX特定的異常,通常導(dǎo)致VM Exit。

如第1.1節(jié)所述,現(xiàn)有的處理器將物理地址限制為46位。該限制也適用于客戶機(jī)物理地址。因此,EPT不會(huì)轉(zhuǎn)換超出此限制的客戶物理地址。 (例如,如果線性地址轉(zhuǎn)換遇到具有這種地址的分頁結(jié)構(gòu)條目,則會(huì)出現(xiàn)分頁錯(cuò)誤)。因此,現(xiàn)有的EPT僅限于轉(zhuǎn)換48個(gè)物理地址位。

現(xiàn)有的EPT轉(zhuǎn)換過程類似于前面圖1-1所示的分頁過程。像4級(jí)分頁一樣,處理器通過遍歷4-KByte EPT分頁結(jié)構(gòu)的4級(jí)層次來實(shí)現(xiàn)EPT。最后一個(gè)EPT分頁結(jié)構(gòu)條目包含最后物理地址的較高位,而最低位來自原始客戶機(jī)物理地址。

2 擴(kuò)展線性地址:5級(jí)分頁

2.1 5級(jí)分頁:簡介

5級(jí)分頁是一種新的分頁模式,將在IA-32e模式下可用。顧名思義,它將通過遍歷分頁結(jié)構(gòu)的5級(jí)層次結(jié)構(gòu)來轉(zhuǎn)換線性地址。因?yàn)樵撨^程是未修改的,所以5級(jí)分頁將處理器的線性地址寬度擴(kuò)展到57位。(附加的9位用于從層次結(jié)構(gòu)的第五級(jí)中選擇一個(gè)條目。)為了清楚起見,以前稱為IA-32e分頁的分頁模式現(xiàn)在將被稱為4級(jí)分頁。

本章的其余部分規(guī)定了5級(jí)分頁定義和所需的架構(gòu)更改。第2.2節(jié)規(guī)定了CPU如何列舉新功能以及如何通過軟件啟用。第2.3節(jié)描述了線性地址生成過程的變化,以及對規(guī)范概念的修訂。

第2.4節(jié)詳細(xì)介紹了5級(jí)分頁如何轉(zhuǎn)換線性地址。第2.5節(jié)闡明了處理器如何處理包含線性地址的寄存器的加載,而第2.6節(jié)到第2.8節(jié)考慮與各種其他功能的交互。(與虛擬機(jī)擴(kuò)展的交互在第3章中指定)。

2.2 列舉和啟用

本節(jié)介紹處理器如何列舉到5級(jí)分頁和相關(guān)功能的軟件支持,以及軟件如何使處理器能夠使用該支持。

2.2.1 CPUID的列舉

支持Intel 64架構(gòu)的處理器通常使用CPUID指令來列舉特定于軟件的處理器功能。那些支持5級(jí)分頁的處理器通過新功能標(biāo)志來列舉這一事實(shí),以及通過如何報(bào)告相關(guān)功能的變化:

  • CPUID.(EAX = 07H,ECX = 0):ECX [位16]是一個(gè)新的特征標(biāo)志,將列舉5級(jí)分頁的基本支持。所有較舊的處理器清除這一位。當(dāng)且僅當(dāng)它支持5級(jí)分頁時(shí),處理器將設(shè)置此位。

  • 如第1.1節(jié)所述,CPUID.80000008H:EAX [位15:8]列舉了處理器支持的最大線性地址寬度。所有支持Intel 64架構(gòu)的舊處理器都將這個(gè)值列為48。支持5級(jí)分頁的處理器將列舉此值為57。

  • 如第1.1節(jié)所述,CPUID.80000008H:EAX [位7:0]列舉了處理器支持的最大物理地址寬度。支持Intel 64架構(gòu)的處理器最多列舉了46個(gè)。支持5級(jí)分頁的處理器預(yù)計(jì)將列舉更高的值,最多52。

  • CPUID.(EAX = 07H,ECX = 0H):ECX.MAWAU [位21:17]是列舉用戶MPX地址寬度調(diào)整(MAWAU)的現(xiàn)有字段。該值指定當(dāng)CPL = 3時(shí),BNDLDX和BNDSTX指令在64位模式下工作的高于48的線性地址位數(shù)。

支持Intel MPX的較舊的處理器列舉該值為0。支持5級(jí)分頁的處理器可以列舉0或9,具體取決于系統(tǒng)軟件的配置。有關(guān)BNDLDX和BNDSTX如何使用MAWAU以及系統(tǒng)軟件如何確定其值的更多詳細(xì)信息,請參見第2.7節(jié)。

  • CPUID.(EAX = 12H,ECX = 0H):EDX [位15:8]是列舉指定64位enclave最大支持大小的信息的現(xiàn)有字段。如果列舉的值為n,則最大大小為2n。支持IntelSGX的較舊的處理器最多列舉了47個(gè)。支持5級(jí)分頁的處理器預(yù)計(jì)會(huì)將該值列舉為56。

2.2.2 由軟件啟用

第1.1節(jié)確定了軟件可以進(jìn)入IA-32e模式的算法。在不支持5級(jí)分頁的處理器上,該算法支持4級(jí)分頁。在支持5級(jí)分頁的處理器上,可以改為啟用5級(jí)分頁。

支持5級(jí)分頁的處理器允許軟件設(shè)置一個(gè)新的啟用位CR4.LA57 [bit 12]。 IA-32e模式下的邏輯處理器(IA32_EFER.LMA = 1)如果CR4.LA57 = 1,使用5級(jí)分頁。在IA-32e模式之外(IA32_EFER.LMA = 0),CR4.LA57的值不影響分頁操作。

以下項(xiàng)目詳細(xì)說明了邏輯處理器如何確定當(dāng)前的分頁模式。

  • 如果CR0.PG = 0,分頁被禁用。
  • 如果IA32_EFER.LMA = 0,則使用傳統(tǒng)32位分頁模式之一(取決于CR4中傳統(tǒng)分頁模式位的值).
  • 如果IA32_EFER.LMA = 1和CR4.LA57 = 0,使用4級(jí)分頁。
  • 如果IA32_EFER.LMA = 1和CR4.LA57 = 1,使用5級(jí)分頁。

因此,軟件可以使用以下算法進(jìn)入具有5級(jí)分頁的IA-32e模式。

1。使用MOV CR指令設(shè)置CR4.PAE和CR4.LA57。
2。使用WRMSR指令設(shè)置IA32_EFER.LME。
3。使用MOV CR指令將CR3加載到PML5表的地址(參見第2.4節(jié))。
4。使用MOV CR指令設(shè)置CR0.PG。

處理器允許軟件修改CR4.LA57只在IA-32e模式之外。在IA-32e模式下,嘗試使用MOV CR指令修改CR4.LA57會(huì)導(dǎo)致通用保護(hù)異常(#GP)。

2.3 線性地址生成和規(guī)范性

如第1.1節(jié)所述,線性地址寬度為48位的處理器將保留線性地址位63:48以供將來擴(kuò)展。僅使用位47:0的線性地址(因?yàn)槲?3:48是位47的符號(hào)擴(kuò)展名)被稱為規(guī)范的。

1。只有當(dāng)CPUID.(EAX = 07H,ECX = 0):ECX [位16]被列舉為1時(shí)軟件才可以設(shè)置CR4.LA57。
2?;叵胍幌拢琁A32_EFER.LMA是CR0.PG和IA32_EFER.LME的邏輯AND。

當(dāng)生成訪問存儲(chǔ)器的64位線性地址時(shí),處理器首先確認(rèn)地址是規(guī)范的。如果地址不是規(guī)范的,則內(nèi)存訪問會(huì)導(dǎo)致故障,并且地址未被轉(zhuǎn)換。

支持5級(jí)分頁的處理器可以在啟用5級(jí)分頁時(shí)轉(zhuǎn)換57位線性地址。但是,如果軟件僅啟用4級(jí)分頁,則這樣的處理器只能轉(zhuǎn)換48位線性地址。這個(gè)事實(shí)激發(fā)了兩種規(guī)范性的定義。

如果地址的位63:47相同,則線性地址是48位規(guī)范的。類似地,如果地址的位63:56相同,地址是57位規(guī)范的。任何48位規(guī)范的線性地址也是57位規(guī)范的。

當(dāng)生成訪問存儲(chǔ)器的64位線性地址時(shí),支持5級(jí)分頁的處理器基于當(dāng)前分頁模式檢查規(guī)范性:如果啟用了4級(jí)分頁,則該地址必須是48位規(guī)范的;如果啟用了5級(jí)分頁,則該地址只能是57位規(guī)范的。如果沒有觀察到適當(dāng)?shù)囊?guī)范性,則存儲(chǔ)器訪問會(huì)導(dǎo)致故障。

2.4 5級(jí)分頁:線性地址轉(zhuǎn)換

如2.2.2節(jié)所述,如果IA32_EFER.LMA = 1且CR4.LA57 = 1,則邏輯處理器使用5級(jí)分頁。

像4級(jí)分頁一樣,5級(jí)分頁使用內(nèi)存分頁結(jié)構(gòu)的層次結(jié)構(gòu)來轉(zhuǎn)換線性地址。因?yàn)?級(jí)分頁將線性地址寬度增加到57位(從4級(jí)分頁支持的48位),5級(jí)分頁允許在任何給定時(shí)間訪問多達(dá)128 PBytes的線性地址空間。

也像4級(jí)分頁一樣,5級(jí)分頁使用CR3來定位層次結(jié)構(gòu)中的第一個(gè)分頁結(jié)構(gòu)。(5級(jí)分頁時(shí)CR3具有與4級(jí)分頁相同的模式特定格式)。以下項(xiàng)目更詳細(xì)地描述了5級(jí)分頁對轉(zhuǎn)換過程的變化。

  • 轉(zhuǎn)換開始于識(shí)別4 KB自然對齊的PML5表。它位于CR3位51:12中指定的物理地址。PML5表包含512個(gè)64位條目(PML5E)。使用如下定義的物理地址選擇PML5E。
  • 位51:12來自CR3。
  • 位11:3是線性地址的位56:48。
  • 位2:0都為0。

因?yàn)槭褂镁€性地址的位56:48來識(shí)別PML5E,所以它控制對線性地址空間的256-TByte區(qū)域的訪問。表2-1給出了PML5E的格式。

表2-1。引用PML4表的PML5條目(PML5E)格式

比特位置 內(nèi)容
0(P) 存在;必須為1以引用PML4表。
1(R/W) 讀/寫;如果為0,則可能不允許寫入由此條目控制的256-TByte區(qū)域。
2(U/S) 用戶/特權(quán);如果為0,則不允許用戶模式訪問到由此條目控制的256-TByte區(qū)域。
3(PWT) 頁級(jí)寫通;間接確定用于訪問此條目引用的PML4表的內(nèi)存類型。
4(PCD) 頁級(jí)緩存禁用;間接確定用于訪問此條目引用的PML4表的內(nèi)存類型。
5(A) 已訪問;指示此條目是否已經(jīng)被用于線性地址轉(zhuǎn)換。
6 忽略。
7(PS) 保留(必須為0)。
11:8 忽略。
M-1:12 該條目引用的4 KB對齊的PML4表的物理地址。
51:M 保留(必須為0)。
62:52 忽略。
63 如果IA32_EFER.NXE = 1,則執(zhí)行禁用(如果為1,則不允許從此條目控制的256-TByte區(qū)域執(zhí)行指令讀取);否則保留(必須為0)。
  • 轉(zhuǎn)換過程的下一步確定一個(gè)4 KB的自然對齊的PML4表。它位于PML5E位51:12中指定的物理地址(見表2-1)。PML4表包括512個(gè)64位條目(PML4E)。使用如下定義的物理地址選擇PML4E。

  • 位51:12來自PML5E。

  • 位11:3是線性地址的位47:39。

  • 位2:0都為0。

通常在訪問分頁結(jié)構(gòu)條目時(shí),用于訪問PML4E的存儲(chǔ)器類型部分地基于PML5E中的PCD和PWT位。

因?yàn)槭褂镁€性地址的位56:39來識(shí)別PML4E,所以它控制對線性地址空間的512GB字節(jié)區(qū)域的訪問。

一旦識(shí)別了PML4E,線性地址的位38:0確定了轉(zhuǎn)換過程的剩余部分,與4級(jí)分頁完全一樣。如表2-1所示,PML5E的位1,位2和位63的值被正常使用(與其他分頁結(jié)構(gòu)條目中的相應(yīng)位組合使用)來確定訪問權(quán)限。PML5E中的已訪問標(biāo)志(位5)按照其他分頁結(jié)構(gòu)條目進(jìn)行更新。

5級(jí)分頁的操作如圖2-1所示。

圖2-1 使用5級(jí)分頁的線性地址轉(zhuǎn)換

2.5 線性地址寄存器和規(guī)范性

Intel 64架構(gòu)包含許多定義為保持線性地址的寄存器。這些寄存器可以使用各種指令加載。如第1.1節(jié)所述,如果試圖加載一個(gè)不是規(guī)范的值的線性地址寄存器,則這些指令中的每一條通常會(huì)導(dǎo)致通用保護(hù)異常(#GP)。

如第2.3節(jié)所述,支持5級(jí)分頁的處理器使用規(guī)范性的兩種定義:48位規(guī)范性和57位規(guī)范性。本節(jié)介紹這種處理器如何檢查正在加載到線性地址寄存器中的值的規(guī)范性。一種方法用于加載RIP(指令指針;參見第2.5.1節(jié))的操作,另一種用于加載其他寄存器的操作(參見第2.5.2節(jié))。

2.5.1 RIP加載的規(guī)范性檢查

RIP寄存器包含CS段內(nèi)當(dāng)前指令指針的偏移量。由于處理器在64位模式下將CS基址視為零,所以該模式下的RIP寄存器的值是指令指針的線性地址。

加載RIP(包括JMP等指令以及通過IDT進(jìn)行控制傳輸)的操作首先檢查要加載的值是否相對于當(dāng)前分頁模式是規(guī)范的。如果處理器確定地址不是規(guī)范的,則不會(huì)執(zhí)行RIP加載,并發(fā)生通用保護(hù)異常(#GP)。

注意:引起非規(guī)范地址故障的RIP加載指令,意味著故障處理程序的返回指令指針是故障指令的地址,而不是嘗試加載的非規(guī)范地址。

當(dāng)4級(jí)分頁活動(dòng)時(shí),由這些操作執(zhí)行的規(guī)范檢查使用48位規(guī)范。當(dāng)5級(jí)分頁活動(dòng)時(shí),檢查放寬,只需要57位規(guī)范。

SYSCALL和SYSENTER指令分別從IA32_LSTAR和IA32_SYSENTER_EIP MSRs加載RIP。在僅支持4級(jí)分頁的處理器上,這些指令不會(huì)檢查正在加載的值是否合法,因?yàn)閃RMSR指令可確保每個(gè)MSR都包含一個(gè)48位規(guī)范的值。在支持5級(jí)分頁的處理器上,WRMSR的檢查放寬到57位規(guī)范(見第2.5.2節(jié))。在這樣的處理器上,執(zhí)行具有4級(jí)分頁的SYSCALL或SYSENTER會(huì)檢查加載到RIP中的值是否為48位規(guī)范的。

指令指針正常前進(jìn)到下一個(gè)指令邊界可能導(dǎo)致RIP寄存器保持非規(guī)范地址。從非規(guī)范地址獲取下一條指令將導(dǎo)致一般保護(hù)異常,如第2.3節(jié)所示。在這種情況下,故障處理程序的返回指令指針將是非規(guī)范地址。

2.5.2 其他加載的規(guī)范性檢查

除了RIP之外,CPU還保留了許多其他保存線性地址的寄存器:

  • GDTR和IDTR(在它們的基地址部分)。
  • LDTR,TR,F(xiàn)S和GS(在其隱藏的描述符緩存的基址部分)。
  • 調(diào)試地址寄存器(DR0到DR3),它保存斷點(diǎn)的線性地址。
  • 以下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。

除了一些例外,處理器確保這些寄存器中的地址總是以以下方式規(guī)范化。

  • 嘗試使用非規(guī)范地址加載線性地址寄存器時(shí)的某些指令錯(cuò)誤。
  • 如果指令的存儲(chǔ)器操作數(shù)中指定的基址不是規(guī)范的,則LGDT或LIDT指令的執(zhí)行將導(dǎo)致通用保護(hù)異常(#GP)。
  • 如果從GDT加載基地址不是規(guī)范的,LLDT或LTR指令的執(zhí)行將導(dǎo)致#GP。
  • 如果將加載FS或GS的基地址是非規(guī)范地址,WRMSR,WRFSBASE或WRGSBASE的執(zhí)行會(huì)導(dǎo)致#GP。
  • 如果用非規(guī)范地址加載任何下面的MSR,WRMSR的執(zhí)行導(dǎo)致#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。補(bǔ)充SYSCALL和SYSENTER的SYSRET和SYSEXIT指令分別從RCX和RDX加載RIP。即使在5級(jí)分頁之前,這些指令檢查要加載到RIP的值的規(guī)范性。與其他加載RIP的指令一樣,此檢查將基于當(dāng)前的分頁模式。

注2。當(dāng)WRMSR指令用于加載一些保存線性地址的非架構(gòu)MSR(此處未列出)時(shí),也可以應(yīng)用這種規(guī)范檢查。

  • 如果使用非規(guī)范地址的加載以下任何MSR,XRSTORS的執(zhí)行會(huì)導(dǎo)致#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。

由于少數(shù)異常,這種執(zhí)行總是使用列舉的最大線性地址寬度,并且與當(dāng)前的分頁模式無關(guān)。

因此,支持5級(jí)分頁的處理器將允許上述指令以57位規(guī)范但不是48位規(guī)范的地址加載這些寄存器,即使4級(jí)分頁處于活動(dòng)狀態(tài)。(因此,存儲(chǔ)這些值的指令(SGDT,SIDT,SLDT,STR,RDFSBASE,RDGSBASE,RDMSR,XSAVE,XSAVEC,XSAVEOPT和XSAVES)可以保存57位規(guī)范但不是48位規(guī)范的地址,即使4級(jí)分頁處于活動(dòng)狀態(tài)。)

分別加載FS和GS基地址的WRFSBASE和WRGSBASE指令的運(yùn)行方式不同。這些指令中的任何一個(gè)的執(zhí)行將導(dǎo)致#GP,如果它將加載相對于當(dāng)前分頁模式的不是規(guī)范的地址的基址。因此,如果4級(jí)分頁活動(dòng),則這些指令不允許加載57位規(guī)范但不是48位規(guī)范的地址。

  • FXRSTOR,XRSTOR和XRSTORS指令忽略了使用非規(guī)范地址加載其中某些寄存器的嘗試:
  • FIP加載忽略存儲(chǔ)器映像中除列舉的最大線性地址寬度之外的任何位。處理器符號(hào)擴(kuò)展到最高有效位(例如,支持5級(jí)分頁的處理器上的位56),以確保FIP始終是規(guī)范的。
  • BNDCFGU的加載(由XRSTOR或XRSTORS)忽略存儲(chǔ)器映像中除列舉的最大線性地址寬度之外的任何位。處理器符號(hào)擴(kuò)展到最高有效位(例如,支持5級(jí)分頁的處理器上的位56),以確保BNDCFGU始終是規(guī)范的。
  • 每個(gè)非控制x87指令加載FIP。加載的值總是相對于當(dāng)前分頁模式是規(guī)范的:如果4級(jí)分頁處于活動(dòng)狀態(tài),則為48位規(guī)范,如果5級(jí)分頁處于活動(dòng)狀態(tài),則為57位規(guī)范。

DR0到DR3可以裝載MOV到DR指令。該指令允許這些寄存器加載非規(guī)范地址。即使地址不是規(guī)范,MOV從DR指令的MOV將返回上次裝載到MOV指令的值。斷點(diǎn)地址匹配僅適用于規(guī)范線性地址。

2.6 與TLB無效指令的交互

Intel 64架構(gòu)包括三個(gè)指令,可以使指令操作數(shù)的線性地址的TLB條目無效:INVLPG,INVPCID和INVVPID。以下項(xiàng)描述了它們?nèi)绾问芫€性地址寬度的影響。

  • INVLPG指令需要一個(gè)內(nèi)存操作數(shù)。它使邏輯處理器正在為當(dāng)前線性地址空間的該操作數(shù)的線性地址緩存的任何TLB條目無效。如果該地址相對于當(dāng)前分頁模式不是規(guī)范的,則該指令不會(huì)發(fā)生故障(例如,當(dāng)4級(jí)分頁處于活動(dòng)狀態(tài)時(shí),該指令不是48位規(guī)范的)。但是,由于處理器不緩存相對于當(dāng)前分頁模式不是規(guī)范的地址的TLB條目,因此不執(zhí)行無效。
  • INVPCID指令采用寄存器操作數(shù)(INVPCID類型)和存儲(chǔ)器操作數(shù)(INVPCID描述符)。如果INVPCID類型為0,則該指令使邏輯處理器對于INVPCID描述符中指定的線性地址和PCID緩存的任何TLB條目無效。如果線性地址與處理器支持的線性地址寬度相關(guān),則該指令將導(dǎo)致一般保護(hù)異常(#GP)。如果處理器支持5級(jí)分頁,則即使4級(jí)分頁處于活動(dòng)狀態(tài)且地址不是48位規(guī)范,該指令也不會(huì)對于57位規(guī)范的地址造成這樣的#GP,無論分頁模式如何。
  • INVVPID指令采用寄存器操作數(shù)(INVVPID類型)和存儲(chǔ)器操作數(shù)(INVVPID描述符)。如果INVPCID類型為0,則該指令使邏輯處理器正在為INVVPID描述符中指定的線性地址和VPID緩存的TLB條目無效。如果線性地址不符合處理器支持的線性地址寬度,那么指令將失敗.1如果處理器支持5級(jí)分頁,則對于57位規(guī)范的地址,無論分頁如何,該指令都不會(huì)失敗模式,即使4級(jí)分頁處于活動(dòng)狀態(tài),并且地址不是48位規(guī)范的。

2.7 與Intel MPX的交互

Intel內(nèi)存保護(hù)擴(kuò)展(Intel MPX)定義了一組4個(gè)綁定的寄存器,每個(gè)綁定的寄存器都可以與存儲(chǔ)器中的特定指針相關(guān)聯(lián)。英特爾MPX包含兩個(gè)指令——BNDLDX和BNDSTX,允許軟件從內(nèi)存中加載或存儲(chǔ)與內(nèi)存中特定指針相關(guān)聯(lián)的邊界。

BNDLDX和BNDSTX指令每個(gè)都采用綁定寄存器和存儲(chǔ)器操作數(shù)(相關(guān)聯(lián)的指針)。每個(gè)都解析存儲(chǔ)器操作數(shù)的線性地址以遍歷存儲(chǔ)器中的分層數(shù)據(jù)結(jié)構(gòu)。在64位模式下,這些指令不一定使用所提供的64位地址中的所有位。

使用的位數(shù)為48加一個(gè)稱為MPX地址寬度調(diào)整(MAWA)的值。

MAWA的價(jià)值取決于CPL;當(dāng)前分頁模式(4級(jí)分頁或5級(jí)分頁);并且,如果5級(jí)分頁處于活動(dòng)狀態(tài),則為新的MSR的值。支持Intel MPX和5級(jí)分頁的處理器支持IA32_MPX_LAX MSR(MSR index 1000H)。只定義MSR的位0。

如果CPL <3,則使用特權(quán)MAWA(MAWAS)。MAWAS的值由CR4.LA57的設(shè)置決定。如果CR4.LA57 = 0(4級(jí)分頁活動(dòng);調(diào)用MAWA僅在64位模式下相關(guān)),MAWAS的值為0。如果CR4.LA57 = 1(5級(jí)分頁有效),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的當(dāng)前值CPUID.(EAX = 07H,ECX = 0H):ECX.MAWAU [位21:17]。

以下項(xiàng)目指定64位模式下BNDLDX和BNDSTX指令的執(zhí)行方式如何解析線性地址以遍歷分層數(shù)據(jù)結(jié)構(gòu)。

1。INVVPID是一個(gè)VMX指令。為了響應(yīng)某些條件,VMX的執(zhí)行可能會(huì)失敗,這意味著它不能完成其正常的操作。當(dāng)VMX指令失敗時(shí),控制轉(zhuǎn)到下一條指令(而不是故障處理程序),并設(shè)置一個(gè)標(biāo)志來報(bào)告故障。

  • 綁定的目錄位于BNDCFGx.1位63:12中指定的4 KB對齊的線性地址。使用LAp(指向緩沖區(qū)的指針的線性地址)選擇BDE以構(gòu)造64位偏移,如下所示:
  • 位63:31 + MAWA為0;
  • 位30 + MAWA:3是LAp [位47 + MAWA:20];和
  • 位2:0為0。

BDE的地址是綁定目錄基址(從BNDCFGx)加上這個(gè)64位偏移量的總和。

如果BNDLDX或BNDSTX在一個(gè)enclave內(nèi)執(zhí)行,指令就像MAWAU = 0一樣操作(不管CR4的值如何)。LA57和IA32_MPX_LAX [位0])。

  • 處理器使用BDE的位63:3作為綁定表(BT)的8字節(jié)對齊地址。使用LAp(指向緩沖區(qū)的指針的線性地址)來選擇BTE來構(gòu)造64位偏移,如下所示:
  • 位63:22為0;
  • 位21:5是LAp [位19:3];和
  • 位4:0為0。

BTE的地址是綁定表基地址(從BDE)加上這個(gè)64位偏移量的和。

綁定目錄包括228 + MAWA 64位條目(BDE); 2因此,64位模式下綁定目錄的大小為21 + MAWA GBytes。綁定表包含217個(gè)32字節(jié)條目(BTE);因此,64位模式下的綁定表的大小為4 MBytes(與MAWA無關(guān))。

2.8 與Intel SGX的互動(dòng)

Intel軟件保護(hù)擴(kuò)展(Intel SGX))定義了新的處理器功能,這些功能在ENCLS(特權(quán))和ENCLU(用戶)指令中被實(shí)現(xiàn)為SGX leaf功能。

SGX leaf功能包括正常使用線性地址的存儲(chǔ)器訪問。當(dāng)以64位模式執(zhí)行時(shí),線性地址的寬度為64位,并且受到64位線性地址對存儲(chǔ)器訪問的正常處理(見第2.3節(jié))。另外,一些leaf功能應(yīng)用與線性地址寬度相關(guān)的特定架構(gòu)檢查。以下項(xiàng)目詳細(xì)介紹了這些檢查以及如何為支持5級(jí)分頁的處理器定義它們。

  • ENCLS的ECREATE leaf功能通過創(chuàng)建新的SGX enclave控制結(jié)構(gòu)(SECS)來創(chuàng)建新的enclave。對于64位的enclave,處理器檢查enclave線性基地址(SECS中指定的)是否是規(guī)范的,如果不是,則產(chǎn)生通用保護(hù)異常(#GP)。在支持5級(jí)分頁的處理器上,無論當(dāng)前的分頁模式如何,此檢查均為57位規(guī)范。

除了檢查enclave線性基地址的規(guī)范性外,ECREATE還確認(rèn)了在SECS中指定的enclave大小不大于處理器支持的最大尺寸(如果enclave大小太大,ECREATE將生成#GP )。如第2.2.1節(jié)所述,較舊的處理器支持大小為247字節(jié)的64位enclave;支持5級(jí)分頁的處理器預(yù)計(jì)將支持大小最多為256字節(jié)的enclave。

如果enclave的XSAVE特征請求掩碼(XFRM)的位4:3被設(shè)置(指示在執(zhí)行enclave期間將啟用Intel MPX),則如果enclave的大小大于248字節(jié),則ECREATE將生成#GP,即使處理器列舉了對較大enclave的支持。

注1。如果CPL < 3,則使用BNDCFGS;如果CPL = 3,則使用BNDCFGU。
注2。在64位enclave中使用的綁定目錄始終包含228個(gè)64位BDE,因此具有2 GBytes的大小。

  • ENCLU的EENTER和ERESUME leaf功能將控制流傳送到指定enclave內(nèi)的入口點(diǎn)。對于進(jìn)入64位enclave,處理器檢查某些線性地址是否是規(guī)范的,如果沒有,則產(chǎn)生一般保護(hù)異常(#GP)。以下項(xiàng)目詳細(xì)說明這些檢查。
    • 指定入口點(diǎn)的線性地址必須是規(guī)范的。如果4級(jí)分頁活動(dòng),則必須是48位規(guī)范;如果5級(jí)分頁處于活動(dòng)狀態(tài),則必須是57位規(guī)范。
    • 異步出口點(diǎn)的線性地址(AEP-處理器在異步enclave出口處傳輸控制的地址)必須是規(guī)范的。如果4級(jí)分頁活動(dòng),則必須是48位規(guī)范;如果5級(jí)分頁處于活動(dòng)狀態(tài),則必須是57位規(guī)范。
    • FS和GS段的基址的enclave數(shù)值必須是規(guī)范的。在支持5級(jí)分頁的處理器上,無論當(dāng)前的分頁模式如何,這些檢查均為57位規(guī)范。
    • EEXIT leaf功能退出當(dāng)前執(zhí)行的enclave并分支到指定的地址。對于從64位enclave出口,處理器檢查該目標(biāo)線性地址是否是規(guī)范的,如果不是,則生成通用保護(hù)異常(#GP)。如果4級(jí)分頁活動(dòng),則必須是48位規(guī)范;如果5級(jí)分頁活動(dòng),則只需要57位規(guī)范。

如第2.7節(jié)所述,64位enclave中BNDLDX和BNDSTX的執(zhí)行總是像MAWAU = 0一樣運(yùn)行。

3 線性地址擴(kuò)展和VMX轉(zhuǎn)換

如第1.2節(jié)所述,VM Entry和VM Exit會(huì)操作包含線性地址的許多處理器寄存器。轉(zhuǎn)換以基于規(guī)范性的方式尊重處理器的線性地址寬度。

如第2章所述,支持5級(jí)分頁的處理器將線性地址寬度從48位擴(kuò)展到57位。該擴(kuò)展更改了VMX轉(zhuǎn)換的操作。VM Entry的更改在第3.1節(jié)中詳細(xì)介紹,而VM Exit的更改在3.2節(jié)中給出。

3.1 線性地址擴(kuò)展和VM Entry

VMCS中的某些字段對應(yīng)于包含線性地址的寄存器。

VM Entry確認(rèn)這些字段包含規(guī)范的值。該檢查基于處理器支持的線性地址寬度(例如,如果處理器支持5級(jí)分頁,則基于57位規(guī)范)。以下是適用于此的字段。

  • 在主機(jī)區(qū)域:
    • IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSR的字段。
    • FS,GS,TR,GDTR和IDTR的基地址字段。
  • 在客戶機(jī)區(qū)域:
    • IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSR的字段。
    • FS,GS,TR,GDTR和IDTR的基地址字段。
    • LDTR的基地址字段(如果LDTR可用)。
    • IA32_BNDCFGS MSR的字段(如果VM Entry正在加載該MSR)。

到64位模式的虛擬機(jī)進(jìn)入還對當(dāng)前VMCS的客戶狀態(tài)區(qū)域中的RIP字段進(jìn)行檢查。如果VM Entry將導(dǎo)致4級(jí)分頁,則會(huì)檢查Guest RIP字段的位63:48是否相同;如果這將導(dǎo)致5級(jí)分頁,該檢查位63:57.1

3.2 線性地址擴(kuò)展和虛擬機(jī)退出

VM Exit將某些寄存器的狀態(tài)保存到VMCS的客戶狀態(tài)區(qū)域。這些寄存器中的一些包含線性地址。如第1.1節(jié)所述,CPU通常確保這些寄存器中的值與CPU的線性地址寬度相關(guān)。因此,這些寄存器的VM Exit保存的值也將一樣。

注1。請注意,這些檢查不會(huì)確認(rèn)客戶機(jī)RIP字段是否相對于輸入的分頁模式是規(guī)范的。例如,位63:47在48位規(guī)范地址中是相同的。然而,
VM Entry4級(jí)分頁可能會(huì)加載一個(gè)值,比特47與位63:48的值不同。

LDTR基地址有一個(gè)特殊情況。如果在退出VM時(shí)LDTR不可用,則保存為基地址的值未定義。但是,在不支持5級(jí)分頁的處理器上,這個(gè)未定義的值總是為48位,在支持5級(jí)分頁的處理器上始終為57位規(guī)范。

VM Exit從VMCS的主機(jī)狀態(tài)區(qū)域加載某些寄存器的狀態(tài)。這些寄存器中的一些包含線性地址。每個(gè)VM Exit確保以下每個(gè)寄存器的值是規(guī)范的:IA32_SYSENTER_EIP和IA32_SYSENTER_ESP MSRs;以及FS,GS,TR,GDTR和IDTR的基址。這樣做取決于處理器是否支持5級(jí)分頁。

  • 如果處理器不支持5級(jí)分頁,則寄存器中的位47:0將從主機(jī)狀態(tài)區(qū)域中的字段加載;位47的值然后被符號(hào)擴(kuò)展到寄存器的位63:48。
  • 如果處理器支持5級(jí)分頁,則寄存器的位56:0將從主機(jī)狀態(tài)區(qū)域中的字段加載;然后,位56的值被符號(hào)擴(kuò)展到寄存器的位63:57。

再次,LDTR有一個(gè)特殊情況。在VM Exit后,LDTR始終不可用。它的基地址可以加載一個(gè)未定義的值。在不支持5級(jí)分頁的處理器上,這個(gè)未定義的值始終是48位規(guī)范的,并且在支持5級(jí)分頁的處理器上始終是57位規(guī)范的。

4 5級(jí)EPT

5級(jí)EPT是EPT的新模式。顧名思義,它將通過遍歷EPT分頁結(jié)構(gòu)的5級(jí)層次結(jié)構(gòu)來轉(zhuǎn)換客戶機(jī)物理地址。由于該過程是未經(jīng)修改的,5級(jí)分頁將處理器的客戶物理地址寬度擴(kuò)展到57位。(附加的9位用于從層次結(jié)構(gòu)的第五級(jí)中選擇一個(gè)條目。)為了清楚起見,原來的EPT模式現(xiàn)在稱為4級(jí)EPT。

本章的其余部分規(guī)定了4級(jí)EPT的架構(gòu)更改以及5級(jí)EPT所定義和引入的架構(gòu)。第4.1節(jié)描述了客戶物理地址寬度的擴(kuò)展如何影響4級(jí)EPT。第4.2節(jié)規(guī)定了CPU如何列舉5級(jí)EPT以及軟件如何啟用該功能。

第4.3節(jié)詳細(xì)介紹了5級(jí)EPT如何轉(zhuǎn)換客戶機(jī)物理地址。

4.1 4級(jí)EPT:客戶機(jī)地址

如1.3節(jié)所述,4級(jí)EPT僅限于轉(zhuǎn)換48位客戶機(jī)物理地址。

這在現(xiàn)有的處理器上不是問題,因?yàn)樗鼈儗⑽锢淼刂穼挾认拗茷?6位(見第1.1節(jié))。處理器的物理地址寬度也限制客戶機(jī)物理地址。這意味著,在現(xiàn)有的處理器上,任何嘗試使用設(shè)置低于低48位的客戶機(jī) - 物理地址將導(dǎo)致頁錯(cuò)誤異常(#PF)。

支持5級(jí)分頁的處理器預(yù)計(jì)將支持52個(gè)物理地址位。這樣的處理器允許使用設(shè)置在51:48范圍內(nèi)的位的客戶機(jī)物理地址;不生成#PF。

設(shè)置51:48范圍內(nèi)的位的客戶機(jī)物理地址無法通過4級(jí)EPT進(jìn)行轉(zhuǎn)換。當(dāng)4級(jí)EPT處于活動(dòng)狀態(tài)時(shí)嘗試訪問此地址會(huì)導(dǎo)致EPT違規(guī)(參見第1.3節(jié))。

EPT違規(guī)在稱為退出資格的值中生成關(guān)于異常的信息。一般來說,嘗試訪問太寬的客戶物理地址導(dǎo)致的EPT違規(guī)建立了目前為其他EPT違規(guī)執(zhí)行的退出限定條件。退出限定的位6:3作出異常,它報(bào)告客戶機(jī)物理地址的訪問權(quán)限。新的EPT違規(guī)總是清除這些位。

4.2 5級(jí)EPT:啟用和啟用

本節(jié)介紹處理器如何列舉到5級(jí)EPT的軟件支持以及軟件如何使處理器能夠使用該支持。

4.2.1 列舉

支持EPT的處理器列舉了IA32_VMX_EPT_VPID_CAP MSR(索引48CH)中與EPT相關(guān)的詳細(xì)信息。目前,IA32_VMX_EPT_VPID_CAP [bit 6]列舉了4級(jí)EPT的支持。也支持5級(jí)EPT的處理器將通過設(shè)置IA32_VMX_EPT_VPID_CAP [bit 7]來列舉該事實(shí)。

處理器支持的客戶機(jī)物理地址寬度未使用IA32_VMX_EPT_VPID_CAP MSR列舉。這是因?yàn)閷挾瓤偸桥cCPUID.80000008H列舉的處理器的最大物理地址寬度相同:EAX [位7:0]。

4.2.2 由軟件啟用

通過在使用VMCS進(jìn)行VM輸入之前,通過在當(dāng)前VMCS中設(shè)置 “啟用EPT” VM執(zhí)行控制,VMM啟用EPT。

EPT操作的具體細(xì)節(jié)由VMCS中的擴(kuò)展頁表指針字段(EPTP)確定。特別地,EPTP [位5:3]包含比EPT使用的級(jí)別小1的值。在現(xiàn)有的處理器上,此值必須為3,表示4級(jí)EPT。 (如果使用不同的值,VM Entry將失敗。)也支持5級(jí)EPT的處理器也將允許值4(表示5級(jí)EPT)。

總之,在支持5級(jí)檢查EPTP的處理器上的VM Entry[位5:3]。如果值為3,VM Entry激活4級(jí)EPT。如果值為4,VM Entry激活5級(jí)EPT。使用任何其他值,VM Entry失敗。

4.3 5級(jí)EPT:客戶機(jī)物理地址轉(zhuǎn)換

像4級(jí)EPT一樣,5級(jí)EPT使用內(nèi)存分頁結(jié)構(gòu)的層次結(jié)構(gòu)來轉(zhuǎn)換客戶機(jī)物理地址。因?yàn)?級(jí)EPT將客戶機(jī)物理地址寬度增加到57位(從4級(jí)EPT支持的48位),5級(jí)EPT允許訪問物理地址空間最多128 PBy給定時(shí)間

以下項(xiàng)目更詳細(xì)地描述了5級(jí)EPT對轉(zhuǎn)換過程的變化。

  • 轉(zhuǎn)換開始于識(shí)別4 KB自然對齊的EPT PML5表。它位于EPTP位51:12中指定的物理地址。 EPT PML5表包括512個(gè)64位條目(EPT PML5E)。使用如下定義的物理地址選擇EPT PML5E。
  • 位63:52都是0。
  • 位51:12來自EPTP。
  • 位11:3是客戶機(jī)物理地址的位56:48。
  • 位2:0都為0。

因?yàn)槭褂每蛻魴C(jī)物理地址的位56:48來識(shí)別EPT PML5E,所以它控制對線性地址空間的256-TByte區(qū)域的訪問。EPT PML5E的格式如表4-1所示。

表4-1。EPT PML5條目(EPT PML5E)

比特位置 內(nèi)容
0 讀取權(quán)限指示是否允許從此條目控制的256-TByte區(qū)域讀取。
1 寫入訪問;指示是否允許從此條目控制的256-TByte區(qū)域?qū)懭搿?/td>
2 如果 “執(zhí)行EPT的基于模式的執(zhí)行控制” VM執(zhí)行控制為0,則執(zhí)行訪問;指示是否允許從此條目控制的256 TByte區(qū)域執(zhí)行指令讀取。如果該控制為1,則執(zhí)行監(jiān)督模式線性地址的訪問;指示是否允許從該條目控制的256-TByte區(qū)域中的監(jiān)督模式線性地址進(jìn)行指令讀取。
7:3 保留(必須為0)。
8 如果EPTP的第6位為1,則EPT的訪問標(biāo)志;指示軟件是否訪問了由此條目控制的256-TByte區(qū)域。如果EPTP的第6位為0,則忽略。
9 忽略。
10 執(zhí)行用戶模式線性地址的訪問。如果 “基于模式的EPT執(zhí)行控制” VM執(zhí)行控制為1,則指示是否允許從該條目控制的256-TByte區(qū)域中的用戶模式線性地址進(jìn)行指令讀取。如果該控件為0,則忽略該位。
11 忽略。
M-1:12 本條引用的4 KB對齊EPT PML4表的物理地址。
51:M 保留(必須為0)。
63:52 忽略。
  • 轉(zhuǎn)換過程的下一步確定一個(gè)4 KB自然對齊的EPT PML4表。它位于EPT PML5E的位51:12中指定的物理地址(見表4-1)。EPT PML4表包括512個(gè)64位條目(EPT PML4E)。使用如下定義的物理地址選擇EPT PML4E。
  • 位51:12來自EPT PML5E。
  • 位11:3是客戶機(jī)物理地址的位47:39。
  • 位2:0都為0。

因?yàn)槭褂每蛻魴C(jī)物理地址的位56:39來識(shí)別EPT PML4E,所以它控制訪問物理地址空間的512 GB字節(jié)區(qū)域的訪問。

一旦識(shí)別了EPT PML4E,客戶機(jī)物理地址的位38:0確定了與4級(jí)EPT完全相同的轉(zhuǎn)換過程的剩余部分。如表4-1所示,EPT PML5E的位2:0和位10的值正常使用(與其他EPT分頁結(jié)構(gòu)條目中的相應(yīng)位組合使用)來確定是否發(fā)生EPT違規(guī)。EPT PML5E中的訪問標(biāo)志(位8)如對其他EPT分頁結(jié)構(gòu)條目所做的那樣進(jìn)行更新。

4.4 5級(jí)EPT和EPTP切換

可以通過調(diào)用在VMX非root操作中的VM功能0來修改EPTP的值
(EPTP切換)。這通過執(zhí)行在EAX寄存器中值為0的VMFUNC指令來完成。VM功能的調(diào)用0使用從內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)中選擇的值加載EPTP。

在以這種方式加載EPTP之前,處理器首先確認(rèn)要加載的值是有效的。有效EPTP值的定義取決于處理器是否支持5級(jí)EPT。

  • 如果處理器不支持5級(jí)EPT,如果不會(huì)導(dǎo)致VM Entry失敗(例如,它不設(shè)置任何保留位),則內(nèi)存中的EPTP值被認(rèn)為是有效的。
  • 如果處理器支持5級(jí)EPT,則只有在不會(huì)導(dǎo)致VM Entry失敗(如上),以及其5:3(控制EPT級(jí)別數(shù)量)的值與EPTP的當(dāng)前值相同時(shí),內(nèi)存中的EPTP值才被視為有效。

這意味著VM功能0的調(diào)用不能改變4級(jí)EPT和5級(jí)EPT之間的EPT模式。

5 Intel虛擬化

Intel用于定向I/O的虛擬化技術(shù)包括稱為DMA重映射(DMA remapping)的功能。

DMA重映射為隔離設(shè)備訪問內(nèi)存提供了硬件支持。當(dāng)設(shè)備嘗試訪問系統(tǒng)內(nèi)存時(shí),DMA重映射硬件??攔截訪問并利用分頁結(jié)構(gòu)來確定訪問是否被允許;它還決定了訪問的實(shí)際位置。

DMA重映射硬件??可能支持兩級(jí)地址轉(zhuǎn)換。一個(gè)級(jí)別可以將線性地址轉(zhuǎn)換為客戶機(jī)物理地址,而第二級(jí)可以將客戶機(jī)物理地址重映射到物理地址。

第一級(jí)轉(zhuǎn)換使用與普通分頁相同格式的分頁結(jié)構(gòu)。第二級(jí)轉(zhuǎn)換使用與EPT所用格式相同格式的分頁結(jié)構(gòu)。

預(yù)計(jì)在支持更寬的線性和客戶機(jī)物理地址(分別使用5級(jí)分頁和5級(jí)EPT)的平臺(tái)上,DMA重新映射硬件將被類似地增強(qiáng),以具有5級(jí)轉(zhuǎn)換過程來支持那些更寬的地址。

這種對DMA重映射的增強(qiáng)支持將在未來對用于定向I/O架構(gòu)規(guī)范的Intel虛擬化技術(shù)的修訂版本中進(jìn)行詳細(xì)說明。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容