- 論壇徽章:
- 0
|
前幾天,上這問(wèn)x64存儲(chǔ)管理機(jī)制,經(jīng)prolj和mik指點(diǎn),去找intel手冊(cè)和AMD手冊(cè)看,看完之后把我的理解寫下,
如有什么理解偏差之處,還望各位不要笑話,畢竟本人英語(yǔ)也是cai啊,
1.長(zhǎng)模式(long mode)
在AMD64架構(gòu)的長(zhǎng)模式中包括兩個(gè)子模式:64bit模式和compatibility模式。
● 64bit模式:在此模式中虛擬地址空間使用平坦(flat)模式,段寄存器包括CS,DS,ES,SS全部清零(FS,GS除外,在線性地址計(jì)算時(shí),提供額外
的base寄存器尋址某些OS的系統(tǒng)數(shù)據(jù)結(jié)構(gòu)),
能為64bit的OS和應(yīng)用程序提供64位尋址支持。
●compatiblity模式:在此模式中使用與lagecy保護(hù)模式一樣的存儲(chǔ)管理模式,為的是平滑運(yùn)行32bit
和16bit的應(yīng)用程序,無(wú)需重新編譯
注意:在長(zhǎng)模式中不支持實(shí)模式和虛擬8086模式。
圖
2009-12-3 10-37-40.jpg (44.13 KB, 下載次數(shù): 39)
下載附件
2009-12-03 15:14 上傳
由于在64bit模式下使用flat模式,所以無(wú)lagecy保護(hù)模式下的分段管理模式,所以虛擬地址直接對(duì)應(yīng)線性地址。所以x64的分頁(yè)
管理模式才是64bit下的重頭戲
2.x64分頁(yè)管理模式
如下圖,是x86-64下的所有頁(yè)大小和物理地址大小的匯總
圖
2009-12-3 9-49-41.jpg (41.68 KB, 下載次數(shù): 42)
下載附件
2009-12-03 15:14 上傳
在x64下,理論上可以通過(guò)使用PAE(物理地址擴(kuò)展)分頁(yè)結(jié)構(gòu)支持64bit的線性地址到52bit物理地址的映射的,但在對(duì)這一架構(gòu)的首次實(shí)現(xiàn)中,
只實(shí)現(xiàn)了48位的線性地址到40位物理地址的映射。現(xiàn)在你可以通過(guò)CPUID指令查看自己的cpu所支持的最大物理地址(MAXPHYDDR).
大家一定還記得在lagecy保護(hù)模式下通過(guò)PAE功能來(lái)訪問(wèn)超過(guò)32bit(36bit)的物理地址,但是在x64模式下的PAE與先前的PAE是不一樣的!
從線性地址到物理地址的轉(zhuǎn)換中用到了四級(jí)頁(yè)數(shù)據(jù)結(jié)構(gòu),一個(gè)新的頁(yè)表數(shù)據(jù)結(jié)構(gòu)---PML4被引入用來(lái)指向頁(yè)目錄指針表。PML4表
只能在x64模式下使用。而且頁(yè)目錄表指針從原來(lái)的4個(gè)項(xiàng)增加到了512個(gè),所以要從線性地址中分配9bit用來(lái)索引PDP表(原來(lái)是2bit)。
PDE和PTE的大小保持不變。所以我們可以看到PML4+PDP+PDE+PTE+page offset=48bit,高16bit保留(其實(shí)是用以符號(hào)擴(kuò)展,下面將看到
符號(hào)擴(kuò)展的用途)。
CR3指向了PML4的基地址。
需要注意的是在使用x64模式之前,必須使CR4.PAE=1(PAE用來(lái)擴(kuò)展PDE和PTE至64bit)。如果你在未使CR4.PAE=1之前,企圖開啟
x64模式的話,會(huì)引發(fā)#GP異常。
我們從上圖還可以看到頁(yè)大小的選擇完全取決于PDE.PS(但我并沒(méi)有在文檔中看到ps位,是直接在文檔中置1或0),無(wú)視CR4.PSE的存在。
2.1x64分頁(yè)管理(4kb)
上圖再說(shuō)
圖
2009-12-3 9-53-53.jpg (48.18 KB, 下載次數(shù): 39)
下載附件
2009-12-03 15:14 上傳
●sign extended--符號(hào)擴(kuò)展位
●PML4 entry--在線性地址39~47bit用于索引PML4 entry,指向PDP
●PDP entry--在線性地址的30~38bit用來(lái)索引PDP entry,指向PDE
●PDE entry--在線性地址的21~29bit用來(lái)索引PDEentry,指向PTE
●PTE entry--在線性地址的12~20bit用來(lái)索引PTE entry,指向page offset
●page offset--在線性地址的0~11bit提供在頁(yè)中的offset
2.2x64分頁(yè)管理(2mb)
圖
2009-12-3 9-55-24.jpg (44.94 KB, 下載次數(shù): 40)
下載附件
2009-12-03 15:14 上傳
我們可以看到與4kb的頁(yè)相比少了PTE,page offset從原來(lái)的12bit增加到了21bit
下面我們來(lái)看看各頁(yè)表項(xiàng)的內(nèi)部結(jié)構(gòu)
圖(4kb)
2009-12-3 9-56-46.jpg (71.62 KB, 下載次數(shù): 40)
下載附件
2009-12-03 15:50 上傳
上圖看到,用上述方法可以得到512×512×512×512=2^36個(gè)頁(yè)面,2^36*4kb=2^48個(gè)線性地址
圖(2MB)
2009-12-3 12-59-29.jpg (59.1 KB, 下載次數(shù): 35)
下載附件
2009-12-03 15:50 上傳
上圖看到,用上述方法可以得到512×512×512=2^27個(gè)頁(yè)面,2^27*2mb=2^48個(gè)線性地址
0bit:P位,即存在位,表示由項(xiàng)所指的頁(yè)面或頁(yè)表當(dāng)前是否加載到了物理存儲(chǔ)器中,如不存在,可以通過(guò)引發(fā)#PF異常從磁盤中
加載到物理存儲(chǔ)器中
1bit:R/W,即讀寫位,為頁(yè)表指定讀寫特權(quán),當(dāng)置位時(shí)可讀可寫;清零是只讀
2bit:用戶/系統(tǒng)位,即為頁(yè)表指定系統(tǒng)還是普通用戶特權(quán)
3bit:頁(yè)面通寫,指定高速緩存寫策略是回寫還是通寫
4bit:高速緩存禁止位,當(dāng)置位時(shí)禁止相關(guān)的頁(yè)面和頁(yè)表進(jìn)行高速緩存,反之,可以
5bit:訪問(wèn)位,當(dāng)置位時(shí)表示已經(jīng)被訪問(wèn),反之,沒(méi)有
6bit(非PTE或PDE(2MB)):可用位
6bit(PTE或PDE(2MB)):D位,dirty,即臟位,置位時(shí)表示頁(yè)面被寫過(guò)
7~8bit(非PTE或PDE(2MB)):0
avail:系統(tǒng)程序員可用
G:全局標(biāo)志
PAT:頁(yè)表屬性
各種base address是用來(lái)得到下一級(jí)表的基地址的,
最后的物理地址=page base address*2^12(2^21)+2^12(2^21),而page base address的大小取決于你的cpu的最大物理地址了。
3.最后,我來(lái)看一看sign extended會(huì)形成什么效果。
由于sign extended的作用會(huì)將線性地址分成相同大小的兩段,從0至00007FFF`FFFFFFFF,
以及從 FFFF8000`00000000至FFFFFFFF`FFFFFFFF總計(jì)256TB的地址范圍,這非常符合操作系統(tǒng)的習(xí)慣。
這種“古怪”的規(guī)則為日后擴(kuò)展到真正的64位尋址保留了一個(gè)重要的特性:很多的操作系統(tǒng)(包括但不限于Windows NT系列)
將地址空間的高半部分(被稱作內(nèi)核空間)留給自己,將低半部分(用戶空間)留給應(yīng)用程序代碼、用戶態(tài)棧、堆和其他數(shù)
據(jù)區(qū)。這種設(shè)計(jì)保證了每一個(gè)符合AMD64的實(shí)現(xiàn)都擁有兩個(gè)內(nèi)存片段:低半段從00000000`00000000開始,
隨著更多的虛擬地址位變得可用而“向上生長(zhǎng)”;高半部分被“懸掛”在地址空間的頂部而“向下生長(zhǎng)”。同樣,
將未被使用的地址位內(nèi)容固定下來(lái)防止被操作系統(tǒng)用作標(biāo)志位、特權(quán)級(jí)標(biāo)號(hào)等其他用途,是為了避免當(dāng)架構(gòu)擴(kuò)展至52,
56, 60 和64位的時(shí)候出現(xiàn)問(wèn)題。
圖
2009-12-3 10-05-18.jpg (57.25 KB, 下載次數(shù): 35)
下載附件
2009-12-03 15:50 上傳
參考資料:
1.http://zh.wikipedia.org/zh-cn/X86-64
2.intel手冊(cè)
3AMD手冊(cè)
[ 本帖最后由 child_z 于 2009-12-3 22:12 編輯 ] |
|