天天看點

IA-64位微處理器及其程式設計

    ADM64架構概述

一、AMD64架構引入以下新的特征。

1)、寄存寄存器的擴充。

    。8個新的通用寄存器(GPR)

    。所有的16個GPR都是64位字寬

    。8個新的128位XMM寄存器

    。對于所有的GPR都用統一的位元組寄存器尋址

    。通路擴充寄存器的64位指令字首

2)、長模式

    。升到64位虛拟位址(最大支援)

    。64位指令指針(RIP)

    。新的“相對指針的尋址”模式。

    。線性位址空間

二、寄存器

    。通用寄存器16個,RAX、RBX、RCX、RDX、RBP、RBP、RSI、RDI、RSP、R8-R15.在這裡要多講一下,我想這16個寄存器的前8個,就是如同以前從16位更新到32位一樣,隻是把64位分成4等分,然後在按照工作模式進行組合進行使用,如組成32位的EAX、EBX等。其本質是在一個64位中。

    。128位MMX寄存器16個,XMM0-XMM15。這裡與32位的cpu基本上沒有什麼差別的,包括位數,有差別是加了8個而已。

    。64位MMX寄存器8個,MMX0-MMX7。

    。x87寄存器8個,FPR0-FPR7(也是棧寄存器ST(0)-ST(7),是FPRO和FPR7實體寄存器的邏輯映象。)

    。指令指針1介,RIP。

    。标志寄存器1個,RFLAGS。

AMD64架構的特點。

一、模式與模型

    1、AMD64架構支援純X86傳統模式。它有二種工作模式。一是傳統模式。這當然包括實模式、保護模式和虛拟8086模式。這當然不是AMD所希望得到,是以這種模式是在複位的情況下進行的。第二種模式呢?是AMD公司所希望得到的新的模式,也就是期望的。那就是長模式。說白了,就是我們所盼望的64位模式。注意的是,在長模式下,cpu不支援虛拟8086模式與實模式。

    2、保護檢查(這段是原書的原話,我想按原話最好,因為這不用我去解釋)

    在長模式中,AMD64架構對保護機制作了如下的改變:

     1)、長模式中,頁保護檢查機制擴充為包括U/S和R/W保護位,它們在存儲在PLML4入口和PDP入口。

     2)、傳統模式下合法的幾個段類型和門描述符類型在長模式(相容和64位模式)下是不合法的。在長模式下類型檢查無效。

     3)、對CS、DS、ES、FS、GS、和SS段界限檢查在64位模式下被禁用。但可以激活保留的LDT、GDT、和TSS系統段的段界檢查。相容模式下,執行所有的段界檢查。

     4)、64位模式下使用的代碼和資料是可讀寫。(我的了解是,在64位的環境下,上面所寫的段是不可用的,即使要用,是有條件的,也是個别的)

什麼是64位技術 ?

        什麼是64位技術,64位技術又能為你的電腦帶來什麼樣的提升?簡單點來說,随着硬體的更新及電腦計算速率的提升,原有的32位帶寬已經滿足不了硬體更新的需求,這時候特别需要有一條寬敞的帶寬為硬體提供更為寬敞的跑道,以此滿足硬體不斷更新的需求。

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

        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技術做一下簡單介紹。

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可以更有效的處理資料,可以在一個時鐘周期中傳輸更多的資訊。

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系列  

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作為一個基寄存器。規範位址形式的檢查将在特權檢查之後頁面和邊界檢查之前完成。

繼續閱讀