64位擴展技術

標籤: 暫無標籤

101

更新時間: 2013-10-07

廣告

64位技術是相對於32位而言的,這個位數指的是CPU GPRs(General-Purpose Registers,通用寄存器)的數據寬度為64位,64位指令集就是運行64位數據的指令,也就是說處理器一次可以運行64bit數據。64bit處理器並非現在才有的,在高端的RISC(Reduced Instruction Set Computing,精簡指令集計算機)很早就有64bit處理器了,比如SUN公司的UltraSparc Ⅲ、IBM公司的POWER5、HP公司的Alpha等。

廣告

1 64位擴展技術 -概念

  什麼是64位技術,64位技術又能為你的電腦帶來什麼樣的提升?簡單點來說,隨著硬體的升級及電腦計算速率的提升,原有的32位帶寬已經滿足不了硬體升級的需求,這時候特別需要有一條寬敞的帶寬為硬體提供更為寬敞的跑道,以此滿足硬體不斷升級的需求。
  64bit計算主要有兩大優點:可以進行更大範圍的整數運算;可以支持更大的內存。不能因為數字上的變化,而簡單的認為64bit處理器的性能是32bit處理器性能的兩倍。實際上在32bit應用下,32bit處理器的性能甚至會更強,即使是64bit處理器,目前情況下也是在32bit應用下性能更強。所以要認清64bit處理器的優勢,但不可迷信64bit。
  目前主流CPU使用的64位技術主要有AMD公司的AMD64位技術、Intel公司的EM64T技術、和Intel公司的IA-64技術。其中IA-64是Intel獨立開發,不兼容現在的傳統的32位計算機,僅用於Itanium(安騰)以及後續產品Itanium 2,一般用戶不會涉及到,因此這裡僅對AMD64位技術和Intel的EM64T技術做一下簡單介紹。

2 64位擴展技術 -AMD64位技術

  AMD64的位技術是在原始32位X86指令集的基礎上加入了X86-64擴展64位X86指令集,使這款晶元在硬體上兼容原來的32位X86軟體,並同時支持X86-64的擴展64位計算,使得這款晶元成為真正的64位X86晶元。這是一個真正的64位的標準,X86-64具有64位的定址能力。
  X86-64新增的幾組CPU寄存器將提供更快的執行效率。寄存器是CPU內部用來創建和儲存CPU運算結果和其它運算結果的地方。標準的32-bit x86架構包括8個通用寄存器(GPR),AMD在X86-64中又增加了8組(R8-R9),將寄存器的數目提高到了16組。X86-64寄存器默認位64-bit。還增加了8組128-bit XMM寄存器(也叫SSE寄存器,XMM8-XMM15),將能給單指令多數據流技術(SIMD)運算提供更多的空間,這些128位的寄存器將提供在矢量和標量計算模式下進行128位雙精度處理,為3D建模、矢量分析和虛擬現實的實現提供了硬體基礎。通過提供了更多的寄存器,按照X86-64標準生產的CPU可以更有效的處理數據,可以在一個時鐘周期中傳輸更多的信息。

廣告

3 64位擴展技術 -EM64T技術

  Intel官方是給EM64T這樣定義的:EM64T全稱Extended Memory 64 Technology,即擴展64bit內存技術。EM64T是Intel IA-32架構的擴展,即IA-32e(Intel Architectur-32 extension)。IA-32處理器通過附加EM64T技術,便可在兼容IA-32軟體的情況下,允許軟體利用更多的內存地址空間,並且允許軟體進行32 bit線性地址寫入。EM64T特彆強調的是對32 bit和64 bit的兼容性。Intel為新核心增加了8個64 bit GPRs(R8-R15),並且把原有GRPs全部擴展為64 bit,如前文所述這樣可以提高整數運算能力。增加8個128bit SSE寄存器(XMM8-XMM15),是為了增強多媒體性能,包括對SSE、SSE2和SSE3的支持。
  Intel為支持EM64T技術的處理器設計了兩大模式:傳統IA-32模式(legacy IA-32 mode)和IA-32e擴展模式(IA-32e mode)。在支持EM64T技術的處理器內有一個稱之為擴展功能激活寄存器(extended feature enable register,IA32_EFER)的部件,其中的Bit10控制著EM64T是否激活。Bit10被稱作IA-32e模式有效(IA-32e mode active)或長模式有效(long mode active,LMA)。當LMA=0時,處理器便作為一顆標準的32 bit(IA32)處理器運行在傳統IA-32模式;當LMA=1時,EM64T便被激活,處理器會運行在IA-32e擴展模式下。
  目前AMD方面支持64位技術的CPU有Athlon 64系列、Athlon FX系列和Opteron系列。Intel方面支持64位技術的CPU有使用Nocona核心的Xeon系列、使用Prescott 2M核心的Pentium 4 6系列和使用Prescott 2M核心的P4 EE系列

廣告

4 64位擴展技術 -Intel的64位擴展技術

簡介

  Intel公司在IDF2004上展示了他們的IA-32e架構新的處理器,這是一個利用兼容IA-32架構的64位擴展技術開發的64位微處理器,為了讓大家儘早了解該項技術,本人特根據Intel公司提供的64-Bit Extension Technology Software Developer's Guide的部分內容翻譯編輯了本文。

操作模式

  具有64位擴展技術的處理器能運行在傳統IA-32模式或IA-32e模式。傳統的IA-32模式允許處理器運行在保護模式、實地址模式或虛擬8086模式。
  IA-32E模式是處理器在運行64位操作系統的時候使用的一種模式。帶有64位擴展技術的處理器將初始進入傳統的、頁式地址、保護模式,然後,當IA32-EFER寄存器中的某位被設置並且PAE(Physical Address Extensions,物理地址擴展)模式被使能。下表顯示了64位擴展技術所支持的操作模式和他們之間的區別。
  1.IA-32e模式
  IA-32e模式有兩個子模式:64位模式和兼容模式。IA-32e模式只能在裝載64位操作系統的情況下進入。
  2.64位模式
  64位模式用於運行在64位操作系統中的64位應用程序它支持以下的特性:
  支持64位線性地址結構;然而支持64位擴展技術的IA-32處理器將用少於64位地址來實現
  寄存器擴展后,可以使用新的操作碼前綴來訪問(REX)
  現有的通用寄存器被加寬到64位(RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP)
  8個新的通用寄存器(R8–R15)
  8個新的128位流SIMD擴展(SSE)寄存器(XMM8–XMM15)
  一個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.傳統模式
  為什麼Intel現在做這件事情?
  傳統模式包括保護模式,實地址模式和虛擬8086模式。現有的為這些模式中的任何一種模式而編寫的軟體都完全能兼容地運行在具有64為擴展技術的IA-32處理器中。
  5.系統管理模式
  系統管理模式(SMM)提供與傳統IA-32架構中的系統管理中斷(SMI)處理程序相同的執行環境。SMM支持從一個模式到另一個操作模式(包括IA-32e和傳統模式)的轉換。一個SMI處理程序能夠通過PSE機制處理任何的物理存儲頁。然而由於不支持PAE,SMM環境不支持64位線性地址。提交給SMI的事務,處理器將轉換到SMM,並根據SMM存儲映射(save map)將存儲器的狀態存儲到SM RAM中。因此,一個SMI處理程序將執行在和傳統IA-32架構中一樣的環境中。

寄存器組的改變

  下表比較了運行在64位模式的應用程序和運行在傳統的IA-32環境的應用程序中寄存器數據結構的不同。傳統環境包括那些存在於現有IA-32處理器、支持64位擴展技術的處理器中的傳統模式以及IA-32e兼容模式中的環境。兼容模式應用程序不能在64位模式或64位操作系統中運行,因此應用程序需要運行在傳統IA-32保護模式環境中。
  1.通用寄存器(General-Purpose Registers,GPRs)
  IA-32結構運行在傳統或兼容模式時,有8個通用寄存器。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可用,R8-R15是8個新的GPRs。所有的這些寄存器能夠具有位元組、字、雙字和四字四個級別。這些級別的劃分主要是看REX前綴。
  在64位模式,將限制指令存取位元組寄存器,指令不能同時使用傳統的高位元組(比如AH, BH. CH, DH)和新的位元組寄存器(比如RAX寄存器的低位元組)。然而指令將可同時用傳統低位元組(比如AL,BL,CL或DL)和新的位元組寄存器(比如R8寄存器或RBP)。這種結構將強迫大家遵守以上的限制,並將任何代REX前綴的指令對高位元組(AH, BH, CH, DH)的使用轉換到低位元組(BPL, SPL, DIL, SIL; 這些是RBP,R SP, RDI 和 RSI的低8位) 的使用。
  在64位模式下,操作數的大小決定了目標GPR的有效位數:
  64位操作數產生一個64位的結果到目標通用寄存器
  32位操作數產生32位的結果,採用0-擴充的方法將64位結果寫到目標通用寄存器
  8位和16位操作數產生一個8位或者16位的結果。目標通用寄存器的高56位或48位在操作中不會被修改。如果一個8位或16位操作數的結果被用作64位地址計算,則會對其進行符號擴展,擴展到64位。
  因為64位通用寄存器的高32位在32位模式中沒有定義,所以當從64位模式轉換到任何一種32位模式(比如傳統模式或兼容模式)時,高32位的數據將不被保留。同樣,在64位轉換到32位模式之後,軟體也不必要用這些沒有定義的高位元組位來存放數據。這些值回從一個硬體實現轉換到下一個,或從一個周期轉換到下一個。
  2.流SIMD擴展(SSE)寄存器
  在兼容和傳統模式下,SSE寄存器組由8個128位的傳統寄存器XMM0-XMM7組成。在64位模式,有了8個附加的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)控制寄存器
  控制機存器CR0-CR4在64位擴展模式下被擴展到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位全部填0,讀調試寄存器的時候只返回低32位。在64位模式下,DR6和DR7的高32位保留並必須是0,對高32位的任何一位寫1都會引發#GP(0)異常。
  DR0-DR3的所有64位都是軟體能寫的。然而MOV DRn指令不檢查寫到DR0-DR3的地址在線性地址的限制內。只在處理器產生有效地址的時候支持地址匹配。

指令集變化

  1.地址寬度和操作數寬度前綴  
 64位模式中,預設的地址寬度是64位,預設的操作數寬度是32位。地址寬度和操作數寬度前綴允許32位和64位數據和地址在指令序列中混用。下表(1-7)顯示了在IA-32e模式下需要指令前綴地址寬度。注意,在64位模式下不支持16位地址。在敬愛內容和傳統模式下,地址寬度函數的功能和在IA-32傳動架構中一樣。
  在64位模式下, 預設的操作數寬度是32位,REX前綴包括4位域來指定16個不同的值。REX前綴的W位域指定為REX.W。REX.W=1時前綴表明操作數位64為操作數。注意,軟體依然能使用操作數寬度66H前綴來切換到16位操作寬度。然而如果同時用REX.W和66H前綴,REX.W的優先權要高。
  在SSE/SSE2/SSE3 SIMD指令的情況下,66H, F2H和F3H前綴作為操作碼擴展,並被認為是指令的一部分。在這些情況下,有效的REX.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位模式下被引入。
  SWAPGS 指令
  SYSCALL and SYSRET 指令
  CDQE 指令
  CMPSQ 指令
  CMPXCHG16B 指令
  LODSQ 指令
  MOVSQ 指令
  MOVZX(64-bits) 指令
  STOSQ 指令
  5.堆棧指針
  在64位模式,堆棧指針為64位。堆棧大小不是像兼容模式或傳統模式中那樣靠SS段描述符中的某位來控制,也不通過指令前綴來指示。
  對隱式堆棧引用將忽略地址大小的指示。除遠分支以外,所有隱式引用RSP的指令在64位模式下預設為64位操作數。影響到的指令包括:PUSH, POP, PUSHF, POPF, ENTER, 和LEAVE。使用這些指令在64位模式下將不可能產生32位堆棧值的壓棧和退棧。如果使用66H操作數前綴,將支持16位的壓棧和退棧。
  當寄存器RAX-RSP被用作操作數的時候,64位模式預設的操作尺寸無需REX前綴作為這些指令的先導。如果式R8-R15作為操作數,則REX依然是需要的。這是因為前綴在訪問新擴展寄存器中是需要的。
  6.分支轉移
  64位擴展技術擴充2個分支機制來適應64位線性地址空間的分支。他們是:
  64位模式下近分支轉移被重新定義
  在64位模式和兼容模式下,64位調用門描述符定義成遠調用
  64位模式下,所有近分支轉移(CALL, RET, JCC, JCXZ, JMP 和 LOOP)被強迫為64位。這些指令被更新為提供64位的RIP值而無需REX前綴。下面的近轉移被有效的操作數寬度所控制:
  指令指針的寬度的截斷
  由於CALL或RET引起的退棧壓棧或退棧的大小
  由於CALL或RET而引起的堆棧指針增加或減少的大小
  間接轉移操作數大小
  在64位模式下,以上的所有操作都被強製為64位而不管操作數前綴(操作數大小的前綴被忽略)。然而相對轉移的位移區域依然受到32位的限制;近轉移的地址大小沒有被強製為64位。
  地址大小影響到JCXZ和LOOP中RCX的大小;他們也影響到內存間接轉移的地址計算。這樣的地址預設是64位,但是他們可以通過地址寬度前綴轉換到32位寬度。
  軟體會用遠轉移來改變優先順序。傳統IA-32結構提供調用門機制來允許軟體去從一個優先順序轉到另一個優先順序,儘管調用門也可以不改變優先順序而只是做轉移。當調用門使用的時候,直接或間接的選擇器指針會指向一個門描述符(指令重的便宜被忽略)目的代碼段的偏移可以從調用門描述符中獲得。IA-32e模式重新定義了32位調用門描述符的類型值,使其成為64位調用門描述符,並擴展64位描述符使其能夠容納64位的偏移。64位模式調用門描述符允許遠轉移訪問有效的線性地址空間的任何地方。這些調用門也控制代碼段選擇器(CS),允許轉換到特權級和預設尺寸並作為門轉換的結果。
  因為通常情況下是指定32位的,唯一在64位模式下指定完全64位絕對RIP的是間接分支轉移,由於這個原因,直接遠分支轉移被從64位模式的指令集中刪除了。
  IA-32e模式擴充了SYSENTER和SYSEXIT指令的語義,以便他們操作在64位存儲空間。IA-32e也引入了兩個新的指令:SYSCALL和SYSRET,他們只在64位模式有效。

存儲組織

  1.64位模式下的地址計算
  在64位模式(如果沒有地址大小的轉變),有效地址計算的大小是64位的。一個有效地址計算使用一個64位的基和索引寄存器以及符號擴展變換成64位。
  對於64位模式下平面地址空間,線性地址等同於有效地址。在使用FS和GS段的非0為基的事務中,這個規則不被使用。在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)。隱式堆棧引用指令包括PUSH/POP指令和使用RSP/RBP寄存器來作為預設堆棧段寄存器的指令。在這些情況下,一個規範錯誤式#SF,如果一個指令使用RSP/RBP作為基寄存器並且有段超越給出一個非SS段,將引起一個一般保護錯誤(#GP)的規範錯誤。隱式堆棧引用包括所有PUSH/POP類型指令和任何使用RSP或RBP作為一個基寄存器。規範地址形式的檢查將在特權檢查之後頁面和邊界檢查之前完成。

廣告