對于x86_64來說,邏輯地址由16位選擇子和64位偏移量組成(而32位時,邏輯地址由16位段選擇符和32位偏移量組成),段寄存器僅僅存放選擇子。CPU的分段單元(SU)執(zhí)行以下操作:
[1] 先檢查選擇子的TI字段,以決定描述子對應(yīng)的描述子保存在哪一個描述符表中。TI字段指明描述子是在GDT中(在這種情況下,分段單元從gdtr寄存器中得到GDT的線性基地址)還是在激活的LDT中(在這種情況下,分段單元從ldtr寄存器中得到LDT的線性基地址)。
[2] 從選擇子的13位index字段計算描述子的地址,index字段的值乘以8(一個描述子的大小,其實就是屏蔽掉末尾那三位指示特權(quán)級的CPL和指示TI的字段),這個結(jié)果與gdtr或ldtr寄存器中的內(nèi)容相加。
[3] 將對應(yīng)的段描述子從內(nèi)存拷貝到CPU的影子Cache中,這樣,只有在選擇子改變的情況下才會修改影子Cache中的內(nèi)容。
[4] 把虛擬地址的偏移量與隱Cache中描述符Base字段的值相加就得到了線性地址。

雖然邏輯地址擴展到了64位,但是,現(xiàn)有的設(shè)計并沒有完全用到這64位的空間(2^64=16EB),因為使用到如此大的空間,勢必造成很大的 系統(tǒng)開銷。AMD64在設(shè)計的時候就決定在x86_64的第一階段,只用這64位中的低48位來做頁式地址轉(zhuǎn)換,高16位(48-64位)將填充第47位相同的內(nèi)容(這種方式類似于符號擴展)。 如果邏輯地址不符合此規(guī)定,系統(tǒng)將產(chǎn)生異常。符合此規(guī)定的地址稱為canonical form,地址的范圍分為兩段:0 到 00007FFF-FFFFFFFF,以及FFFF8 000-0000 0000到FFFFFFFF-FFFFFFFF,總共為256TB。 這種虛擬地址的分層結(jié)構(gòu),也為操作系統(tǒng)的設(shè)計帶來了一定便利:可以取地址的上半段保留做為操作系統(tǒng)的邏輯地址空間,而低地址部分做為裝載應(yīng)用程序的空間, 而canonical form不允許的地址空間則做為操作系統(tǒng)的標志、以及特權(quán)級的標識等。當然,這樣的設(shè)計在未來地址進一步擴展的時候?qū)⒊蔀橐粋€新的問題。

可以想象,用到48位的x86-64虛擬地址的分配機制為:   

- 0-11(12)位:頁內(nèi)偏移;   

- 12-20(9)位:由PML4來映射;   

- 21-29(9)位:高一級頁目錄來映射(如果PS=1,則該頁表項指向一個2MB的頁);   

- 30-38(9)位:再高一級的頁目錄來映射(如果PS=2,則該頁表項指向一個1GB的頁);   

- 39-47(9)位:頁目錄指針表來映射。   

其虛擬地址空間布局如下:

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機開發(fā)培訓(xùn),手機維修培訓(xùn),手機軟件培訓(xùn)

0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
 hole caused by [48:63] sign extension
 ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
 ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
 ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole
 ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space
 ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole
&nbs