IA-32E模式是處理器在運行64位操作系統時使用的壹種模式。采用64位擴展技術的處理器最初將進入傳統的頁面地址和保護模式,然後,當IA32-EFER寄存器中的某個位被置位並且PAE(物理地址擴展)模式被啟用時。下表顯示了64位擴展技術支持的操作模式及其差異。
1.IA-32e模式
IA-32e模式有兩個子模式:64位模式和兼容模式。只有在加載了64位操作系統時,才能進入IA-32e模式。
2.64位模式
64位模式用於在64位操作系統中運行的64位應用程序。它支持以下功能:
支持64位線性地址結構;但是,支持64位擴展技術的IA-32處理器將使用少於64位的地址來實現。
寄存器擴展後,可以用新的操作碼前綴對其進行訪問(REX)。
現有的通用寄存器擴展到64位(RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP)。
八個新的通用寄存器(R8–r 15)
八個新的128位流SIMD擴展(SSE)寄存器(XM M8–xmm 15)
64位指令指針(RIP)
壹種新的RIP相關數據尋址模式
平面地址空間可用於單壹代碼、數據和堆棧空間。
擴展指令和新指令
支持大於64GB的物理地址;但是,支持64位擴展技術的IA-32處理器的實際物理地址需要特殊實現。
新的中斷優先級控制機制
64位模式可以在基於代碼段的操作系統中使用。它的默認地址大小是64位;它的默認操作寬度大小是32位。請註意,這些默認設置可以在使用新REX操作碼前綴的指令對中被覆蓋。在64位模式下操作時,REX前綴允許您指定64位操作數。使用這種機制,許多現有的指令被修改或重新定義,以允許使用64位寄存器和64位地址。
3.兼容模式
兼容模式允許傳統的16位和32位應用程序在64位操作系統下運行,無需重新編譯(但是,在虛擬8086模式下運行或使用硬件任務管理的傳統應用程序將不起作用)。就像64位模式壹樣,操作系統在壹個特殊的代碼段中啟用兼容模式。這意味著64位應用程序可以在處理器中運行(64位模式),而32位應用程序(沒有為64位重新編譯)可以在重新兼容模式下運行。
兼容模式就像傳統的保護模式。應用程序只能訪問線性地址空間中的前4GB,並處理標準IA-32指令前綴和寄存器。兼容模式下不提供REX前綴。(REX前綴編碼已經處理成傳統的IA-32指令)兼容模式也必須使用16位和32位的地址和操作數。與傳統保護模式壹樣,兼容模式也允許應用程序使用PAE(物理地址擴展)處理64GB的物理存儲。
兼容模式不支持傳統保護模式中的以下項目。
虛擬8086模式、任務切換和堆棧參數復制功能在兼容模式下不可用。
從操作系統的角度,用64位計算機系統代替32位機制來處理系統數據結構、地址翻譯、中斷和異常處理等結構和事務。
4.傳統模式
英特爾現在為什麽要這麽做?
傳統模式包括保護模式、真實地址模式和虛擬8086模式。為這些模式編寫的現有軟件可以在采用64位擴展技術的IA-32處理器上兼容運行。
5.系統管理模式
系統管理模式(SMM)提供了與傳統IA-32架構中的系統管理中斷(SMI)處理程序相同的執行環境。SMM支持從壹種模式到另壹種模式的轉換(包括IA-32e和傳統模式)。SMI處理程序可以通過PSE機制處理任何物理存儲頁面。但是,由於不支持PAE,SMM環境不支持64位線性地址。對於提交給SMI的事務,處理器將切換到SMM,並根據SMM保存映射將存儲器的狀態存儲在SM RAM中。因此,SMI處理程序將在與傳統IA-32架構相同的環境中執行。下表比較了在64位模式下運行的應用程序與在傳統IA-32環境下運行的應用程序之間寄存器數據結構的差異。傳統環境包括現有IA-32處理器、支持64位擴展技術的處理器以及IA-32e兼容模式的處理器。兼容模式應用無法在64位模式或64位操作系統下運行,因此應用需要在傳統的IA-32保護模式環境下運行。
1.通用寄存器(GPRS)
IA-32架構在傳統或兼容模式下運行時有八個通用寄存器。Ax、bx、CX、dx、di、si、BP和sp對16位操作數有效,而EAX、EBX、ECX、EDX、EDI、ESI、EBP和ESP對32位操作數有效。
在64位模式下,默認操作數是32位,但GPRs可用於32位和64位操作數。如果32位操作數EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP、R8d-R15d可用,如果64位操作數RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8-R15可用。所有這些寄存器可以有四個級別:字節、字、雙字和四字。這些級別的劃分主要看REX前綴。
在64位模式下,指令將被限制訪問字節寄存器,指令不能同時使用傳統的高字節(如AH,BH。CH,DH)和新字節寄存器(如RAX寄存器的低字節)。然而,指令既可以使用傳統的低位字節(如al、BL、CL或DL),也可以使用新的字節寄存器(如R8寄存器或RBP)。這個結構會強制所有人遵守上述限制,將高字節(AH,BH,CH,DH)的使用轉換為低字節(BPL,SPL,DIL,SIL這些是RBP、R SP、RDI和RSI的低8位)。
在64位模式下,操作數大小決定目標GPR的有效數字:
64位操作數向目標通用寄存器生成64位結果。
32位操作數產生32位結果,64位結果通過0擴展方法寫入目標通用寄存器。
8位和16位操作數產生8位或16位結果。目標通用寄存器的高56或48位在操作期間不會被修改。如果8位或16位操作數的結果用於64位地址計算,它將被符號擴展到64位。
由於64位通用寄存器的高32位在32位模式中沒有定義,所以當從64位模式切換到任何32位模式(如遺留模式或兼容模式)時,高32位的數據都不會被保留。同樣,在64位轉換為32位模式後,軟件不需要用這些未定義的高字節位存儲數據。這些值從壹個硬件實現轉換到下壹個硬件實現或者從壹個周期轉換到下壹個周期。
2.流式SIMD擴展(SSE)寄存器
在兼容和傳統模式下,SSE寄存器組由8個傳統寄存器XMM0-XMM7組成,具有128位。在64位模式下,有八個額外的128位SSE寄存器,即XMM8-XMM15。通過使用REX指令前綴來訪問這些存儲器。XMM寄存器可以在任何模式下用於SSE、SSE2、SSE3指令。
3.系統寄存器
64位新寄存器的引入也改變了現有的系統寄存器。它們是:
MSRs。擴展功能允許MSR(IA-32_EFER)包含那些控制、啟用和禁用64位擴展技術功能的位。
控制寄存器。所有控制寄存器都擴展到64位,並增加了壹個新的控制寄存器(任務優先級寄存器CR8或TPR)。
描述符表寄存器。全局描述符表寄存器(GDTR)和中斷描述符表寄存器(IDTR)被擴展到10字節,因此它們可以包含所有64位地址。本地描述符表寄存器(LDTR)和任務寄存器也被擴展為包括64位地址。
調試寄存器。調試寄存器擴展到64位。
1)擴展功能允許寄存器(IA-32_EFER)
LMA(IA-32e模式激活,位10):該位是只讀狀態位,對該位的任何寫操作都將被忽略。當允許IA-32e模式和頁面管理時,處理器會將該位設置為1,表示處理器運行在兼容模式或64位模式,具體模式取決於代碼段描述符的L位和D位的值。當LMA=0時,處理器運行在傳統模式。在這種模式下,處理器的行為類似於標準的32位IA-32處理器。
LME(允許IA-32e模式,位8):將該位設置為1可以將處理器的功能切換到IA-32e模式,但IA-32e模式並未真正激活,只有當軟件啟用PAE模式進行頁面管理時才會激活。當PAE頁面管理被允許並且LME被設置為1時,處理器將LMA位設置為1,這表示IA-32e模式不僅被允許,而且被激活。IA32_EFER的所有其他保留位必須是位0。
SCE(允許Syscall/Sysret,位0):將該位設置為1將支持Syscall/Sysret。Syscall/Sysret僅在64模式下受支持。操作系統負責啟用它進行64位操作。
2)控制寄存器
在64位擴展模式中,控制存儲器CR0-CR4被擴展到64位。在64位模式下,MOV CRn指令讀取或寫入這些寄存器的所有64位。操作數寬度前綴被忽略。與傳統模式兼容,控制寄存器的高32位全部用0填充,讀控制寄存器只返回低32位。
在64位模式下,CR0和CR4的高32位是保留位,必須寫入0。寫入任何高32位的結果是壹個通用保護異常,#GP(0)。CR2的所有64位都可以通過軟件寫入。CR3的位[51:40]是保留位,必須為0。然而,MOV CRn指令不檢查寫入CR2或CR3的地址是否在線性地址或物理地址的實現邊界內。
64為擴展結構引入了壹個新的控制寄存器—CR8,它被定義為任務優先級寄存器(TPR)。操作系統可以使用TPR來控制是否允許外部中斷根據中斷的優先級來中斷處理器。
3)描述符表寄存器
四個系統描述符表寄存器(GDTR、IDTR、LDTR和TR)被擴展以容納64位基址。這允許在IA-32e模式下運行的操作系統在可用的線性地址空間中的任何地方定位描述符表。下表顯示了這四個寄存器。在所有情況下,基址必須符合標準格式。線性和物理地址位數可以通過執行CPUID並由EAX設置80000008H來確定。
4)調試寄存器
在64位模式下,調試寄存器DR0-DR7是64位的。MOV DRn指令讀取或寫入所有64個寄存器位。操作數寬度前綴被忽略。
在IA-32e平臺上,寫調試寄存器時16位模式或32位模式(傳統模式或兼容模式)的所有高32位都用零填充,讀調試寄存器時只返回低32位。在64位模式下,DR6和DR7的高32位是保留位,必須為0。將1寫入高32位中的任何壹位都會導致#GP(0)異常。
DR0-DR3的所有64位都是軟件可寫的。然而,MOV DRn指令不檢查寫入DR0-DR3的地址是否在線性地址的限制內。僅當處理器生成有效地址時,才支持地址匹配。地址寬度和操作數寬度前綴。
在64位模式下,默認地址寬度為64位,默認操作數寬度為32位。地址寬度和操作數寬度前綴允許在指令序列中混合32位和64位數據和地址。下表(1-7)顯示了IA-32e模式所需的指令前綴的地址寬度。請註意,64位模式不支持16位地址。在心愛的內容和傳統模式下,地址寬度功能的作用與IA-32傳輸架構中的相同。
在64位模式下,默認操作數寬度為32位,REX前綴包括4個字段,用於指定16個不同的值。REX前綴的w位字段被指定為REX。當雷克斯。W=1,前綴表示操作數64是壹個操作數。註意,通過使用操作數寬度66H的前綴,軟件仍然可以切換到16位操作寬度。但是,如果前綴REX。w和66H同時使用,REX的優先級。w更高。
在SSE/SSE2/SSE3 SIMD指令的情況下,66H、F2H和F3H前綴被用作操作碼擴展,並被視為指令的壹部分。在這些情況下,有效的雷克斯之間沒有關聯。w前綴和66H代碼擴展前綴。
2.REX前綴
REX前綴是64位模式中引入的新指令前綴字節。它執行以下工作:
指定新的GPRs和SSE寄存器
指定64位代碼寬度
指定擴展控制寄存器(僅用於系統軟件)
並非所有指令都需要REX前綴。只有當指令引用擴展寄存器或使用64位操作數時,才需要此前綴。如果前綴放在不必要的地方,它將被忽略。
壹條指令只能有壹個REX前綴。壹旦使用,這個前綴必須直接放在操作碼字節或雙字節操作碼擴展前綴之前。其他位置的REX前綴將被忽略。
包含REX前綴的指令仍然必須遵循15字節的傳統指令寬度限制。下圖描述了REX前綴如何符合指令的字節順序。
3.控制和調試寄存器的新編碼
在64位模式下,有額外的代碼指定用於控制機器存儲器和調試寄存器。當ModRM寄存器的域編碼壹個控制或調試寄存器時,REX。r位用於修改這些字段。這些代碼允許處理器訪問CR8-CR15和DR8-DR15。
在64位模式下增加了壹個控制寄存器(CR8)。CR8成為任務優先級寄存器(TPR)。IA-32e技術剛實現的時候,CR9-CR15和DR8-DR15都沒有實現,訪問它們會導致無效代碼異常(#UD)。
4.新指令
以下新指令是在具有64位擴展的64位模式中引入的。
交換指令
Sycalland sysret指令
CDQE指令
CMPSQ指令
CMPXCHG16B指令
LODSQ指令
MOVSQ指令
MOVZX(64位)指令
STOSQ指令
5.棧指示器
在64位模式下,堆棧指針是64位的。與兼容模式或傳統模式不同,堆棧大小不由SS段描述符中的位控制,也不由指令前綴指示。
隱式堆棧引用將忽略地址大小的指示。除了遠分支,在64位模式下,所有隱式引用RSP的指令都默認為64位操作數。受影響的指令包括:push PUSH、POP、PUSHF、POPF、ENTER和LEAVE。在64位模式下使用這些指令,將無法推拉32位堆棧值的堆棧。如果使用66H操作數前綴,將支持16位的堆棧推進和堆棧展開。
當寄存器RAX-RSP用作操作數時,64位模式的默認運算大小不需要REX前綴作為這些指令的先導。如果使用R8-R15作為操作數,仍然需要REX。這是因為在訪問新的擴展寄存器時需要前綴。
6.分支轉移
64位擴展技術擴展了兩種分支機制,以適應64位線性地址空間的分支。它們是:
64位模式中的近分支分支被重新定義。
在64位模式和兼容模式下,64位調用門描述符被定義為遠程調用。
在64位模式下,所有近分支分支(調用、RET、JCC、JCXZ、JMP和循環)都強制為64位。這些指令被更新以提供不帶REX前綴的64位RIP值。以下近似轉換由有效的操作數寬度控制:
指令指針寬度的截斷
調用或RET引起的棧撤銷或棧收回的大小。
堆棧指針的大小因調用或RET而增加或減少。
間接傳輸操作數大小
在64位模式下,無論操作數前綴如何(操作數大小的前綴被忽略),上述所有操作都強制為64位。但相對轉移的位移區域仍受限於32位;近分支的地址大小不強制為64位。
地址大小影響JCXZ和環路中RCX的大小;它們還會影響間接內存傳輸的地址計算。此類地址默認為64位,但可以通過地址寬度前綴轉換為32位寬度。
軟件將使用遠程傳輸來更改優先級。傳統的IA-32架構提供了壹種調用門機制,允許軟件從壹個優先級切換到另壹個優先級,盡管調用門也可以在不改變優先級的情況下進行切換。使用調用門時,直接或間接選擇器指針會指向壹個門描述符(指令開銷太大,不能忽略),目標代碼段的偏移量可以從調用門描述符中獲取。IA-32e模式重新定義32位調用門描述符的類型值,使其成為64位調用門描述符,並擴展64位描述符以適應64位偏移量。64位模式調用門描述符允許遠程訪問有效線性地址空間中的任何位置。這些調用門還控制代碼段選擇器(CS),允許作為門轉換的結果轉換到特權級別和默認大小。
因為通常指定32位,所以在64位模式下唯壹指定完整的64位絕對RIP的是間接分支branch。因此,在64位模式下,直接遠分支分支從指令集中刪除。
IA-32e模式擴展了SYSENTER和SYSEXIT指令的語義,使它們可以在64位內存空間中運行。IA-32e還引入了兩個新指令:SYSCALL和SYSRET,它們只在64位模式下有效。1.64位模式下的地址計算
在64位模式下(如果沒有地址大小轉換),有效地址計算的大小為64位。有效的地址計算使用64位基址和變址寄存器以及到64位的符號擴展變換。
對於64位模式的平面地址空間,線性地址相當於有效地址。此規則不適用於使用FS和GS段的非零基交易。在64位模式下,添加有效地址部分,並且在添加64位基址之前縮短有效地址。當地址映射模式為64位模式時,基址不會縮短。
在IA-32e模式下,指令指針擴展到64位,以支持64位代碼偏移。64位指令指針在調用中為RIP賦值。下表描述了RIP、EIP和IP之間的區別。
壹般在64位模式下,替換和不會直接擴展到64位。在有效地址計算中,它們仍然被限制為32位和符號擴展。但是,在64位模式中,提供了MOV指令的64位替換和直接格式支持。
IA-32e模式下的所有16位和32位地址計算都用0擴展以形成64位地址。地址計算搜索是縮短當前模式的有效地址寬度,就像地址寬度前綴的指定壹樣。結果是擴展了0的完整64位地址寬度。因此,16位和32位應用程序在兼容模式下運行時,只能訪問64位模式下有效地址的低位4GB。同樣,在64位模式下生成32位地址只能訪問64位模式下有效地址的低位4GB。
2.規範尋址
規範地址具有地址位63,直到更有效的實現位,並且宏結構將其設置為全1或全0。
IA-32e模式定義了64位線性地址,但實現時支持的位數更少。首款采用64位擴展技術的IA-32e處理器將支持48位線性地址。這意味著規範地址中的所有63到48位必須用0或1填充。填0還是1取決於第47位是0還是1。
盡管實現並不首先使用地址的所有64位,但它們需要檢查第63位以了解更多有效的實現位,從而查看地址是否為規範形式。如果線性存儲引用不是標準形式,實現將生成壹個異常。在許多情況下,會生成壹般保護異常(#GP)。但是,在顯式或隱式戰鬥應用程序的情況下,會出現堆棧錯誤(#SS)。隱式堆棧參考指令包括推入/彈出指令和使用RSP/RBP寄存器作為默認堆棧段寄存器的指令。在這些情況下,如果指令使用RSP/RBP作為基址寄存器,並且針對段溢出給出了非SS段,則規範錯誤#SF將導致壹般保護錯誤(#GP)的規範錯誤。隱式堆棧引用包括所有推入/彈出類型的指令,以及任何使用RSP或RBP作為基址寄存器的指令。規範地址形式的檢查將在權限檢查之後、頁面和邊界檢查之前完成。