x64存儲管理機制初窺
x64存儲管理機制,經prolj和mik指點,去找intel手冊和AMD手冊看,看完之後把我的理解寫下,
如有什麼理解偏差之處,還望各位不要笑話。
如有什麼理解偏差之處,還望各位不要笑話。
1.長模式(long mode)
在AMD64架構的長模式中包括兩個子模式:64bit模式和compatibility模式。
● 64bit模式:在此模式中虛擬位址空間使用平坦(flat)模式,段寄存器包括CS,DS,ES,SS全部清零(FS,GS除外,在線性位址計算時,提供額外的base寄存器定址某些OS的系統資料結構),能為64bit的OS和應用程式提供64位元定址支援。
●compatiblity模式:在此模式中使用與lagecy保護模式一樣的存儲管理模式,為的是平滑運行32bit和16bit的應用程式,無需重新編譯,注意:在長模式中不支援真實模式和虛擬8086模式!!
在AMD64架構的長模式中包括兩個子模式:64bit模式和compatibility模式。
● 64bit模式:在此模式中虛擬位址空間使用平坦(flat)模式,段寄存器包括CS,DS,ES,SS全部清零(FS,GS除外,在線性位址計算時,提供額外的base寄存器定址某些OS的系統資料結構),能為64bit的OS和應用程式提供64位元定址支援。
●compatiblity模式:在此模式中使用與lagecy保護模式一樣的存儲管理模式,為的是平滑運行32bit和16bit的應用程式,無需重新編譯,注意:在長模式中不支援真實模式和虛擬8086模式!!
由於在64bit模式下使用flat模式,所以無lagecy保護模式下的分段管理模式,所以虛擬位址直接對應線性位址。所以x64的分頁管理模式才是64bit下的重頭戲
2.x64分頁管理模式
如下圖,是x86-64下的所有頁大小和物理位址大小的匯總.
2.x64分頁管理模式
如下圖,是x86-64下的所有頁大小和物理位址大小的匯總.
在x64下,理論上可以通過使用PAE(實體位址擴充)分頁結構支援64bit的線性位址到52bit物理位址的映射的,但在對這一架構的首次實現中,只實現了48位元的線性位址到40位元物理位址的映射。現在你可以通過CPUID指令查看自己的cpu所支援的最大物理位址(MAXPHYDDR).
大家一定還記得在lagecy保護模式下通過PAE功能來訪問超過32bit(36bit)的物理位址,但是在x64模式下的PAE與先前的PAE是不一樣的!!
從線性位址到物理位址的轉換中用到了四級頁資料結構,一個新的頁表資料結構---PML4被引入用來指向頁目錄指標表。PML4表只能在x64模式下使用。而且頁目錄表指標從原來的4個項增加到了512個,所以要從線性位址中分配9bit用來索引PDP表(原來是2bit)。
PDE和PTE的大小保持不變。所以我們可以看到PML4+PDP+PDE+PTE+page offset=48bit,高16bit保留(其實是用以符號擴展,下面將看到符號擴展的用途)。
CR3指向了PML4的基底位址。
需要注意的是在使用x64模式之前,必須使CR4.PAE=1(PAE用來擴展PDE和PTE至64bit)。如果你在未使CR4.PAE=1之前,企圖開啟x64模式的話,會引發#GP異常。
我們從上圖還可以看到頁大小的選擇完全取決於PDE.PS(但我並沒有在文檔中看到ps位,是直接在文檔中置1或0),無視CR4.PSE的存在。
2.1x64分頁管理(4kb)
上圖再說
大家一定還記得在lagecy保護模式下通過PAE功能來訪問超過32bit(36bit)的物理位址,但是在x64模式下的PAE與先前的PAE是不一樣的!!
從線性位址到物理位址的轉換中用到了四級頁資料結構,一個新的頁表資料結構---PML4被引入用來指向頁目錄指標表。PML4表只能在x64模式下使用。而且頁目錄表指標從原來的4個項增加到了512個,所以要從線性位址中分配9bit用來索引PDP表(原來是2bit)。
PDE和PTE的大小保持不變。所以我們可以看到PML4+PDP+PDE+PTE+page offset=48bit,高16bit保留(其實是用以符號擴展,下面將看到符號擴展的用途)。
CR3指向了PML4的基底位址。
需要注意的是在使用x64模式之前,必須使CR4.PAE=1(PAE用來擴展PDE和PTE至64bit)。如果你在未使CR4.PAE=1之前,企圖開啟x64模式的話,會引發#GP異常。
我們從上圖還可以看到頁大小的選擇完全取決於PDE.PS(但我並沒有在文檔中看到ps位,是直接在文檔中置1或0),無視CR4.PSE的存在。
2.1x64分頁管理(4kb)
上圖再說
●sign extended--符號擴展位元
●PML4 entry--在線性位址39~47bit用於索引PML4 entry,指向PDP
●PDP entry--在線性位址的30~38bit用來索引PDP entry,指向PDE
●PDE entry--在線性位址的21~29bit用來索引PDEentry,指向PTE
●PTE entry--在線性位址的12~20bit用來索引PTE entry,指向page offset
●page offset--在線性位址的0~11bit提供在頁中的offset
2.2x64分頁管理(2mb)
●PDP entry--在線性位址的30~38bit用來索引PDP entry,指向PDE
●PDE entry--在線性位址的21~29bit用來索引PDEentry,指向PTE
●PTE entry--在線性位址的12~20bit用來索引PTE entry,指向page offset
●page offset--在線性位址的0~11bit提供在頁中的offset
2.2x64分頁管理(2mb)
我們可以看到與4kb的頁相比少了PTE,page offset從原來的12bit增加到了21bit下面我們來看看各分頁表項目的內部結構.
(4kB)上圖看到,用上述方法可以得到512×512×512×512=2^36個頁面,2^36*4kb=2^48個線性位址.
上圖看到,用上述方法可以得到512×512×512=2^27個頁面,2^27*2mb=2^48個線性位址 0bit:P位,即存在位,表示由項所指的頁面或頁表當前是否載入到了物理記憶體中,如不存在,可以通過引發#PF異常從磁片中載入到物理記憶體中
1bit:R/W,即讀寫位,為頁表指定讀寫特權,當置位時可讀可寫;清零是唯讀
2bit:使用者/系統位元,即為頁表指定系統還是普通使用者特權
3bit:頁面通寫,指定快取記憶體寫策略是回寫還是通寫
4bit:快取記憶體禁止位,當置位元時禁止相關的頁面和頁表進行快取記憶體,反之,可以
5bit:訪問位,當置位時表示已經被訪問,反之,沒有
6bit(非PTE或PDE(2MB)):可用位
6bit(PTE或PDE(2MB)):D位,dirty,即髒位,置位元時表示頁面被寫過
7~8bit(非PTE或PDE(2MB)):0
avail:系統程式師可用
G:全域標誌
PAT:頁表屬性
各種base address是用來得到下一級表的基底位址的,最後的物理位址=page base address*2^12(2^21)+2^12(2^21),而page base address的大小取決於你的cpu的最大物理位址了。
3.最後,我來看一看sign extended會形成什麼效果。
由於sign extended的作用會將線性位址分成相同大小的兩段,從0至00007FFF`FFFFFFFF,以及從 FFFF8000`00000000至FFFFFFFF`FFFFFFFF總計256TB的地址範圍,這非常符合作業系統的習慣。
這種“古怪”的規則為日後擴展到真正的64位定址保留了一個重要的特性:很多的作業系統(包括但不限於Windows NT系列)將位址空間的高半部分(被稱作內核空間)留給自己,將低半部分(使用者空間)留給應用程式碼、用戶態棧、堆和其他數據區。這種設計保證了每一個符合AMD64的實現都擁有兩個記憶體片段:低半段從00000000`00000000開始,隨著更多的虛擬位址位元變得可用而“向上生長”;高半部分被“懸掛”在位址空間的頂部而“向下生長”。同樣,將未被使用的位址位元內容固定下來防止被作業系統用作標誌位元、特權級標號等其他用途,是為了避免當架構擴展至52,56, 60 和64位的時候出現問題。
2bit:使用者/系統位元,即為頁表指定系統還是普通使用者特權
3bit:頁面通寫,指定快取記憶體寫策略是回寫還是通寫
4bit:快取記憶體禁止位,當置位元時禁止相關的頁面和頁表進行快取記憶體,反之,可以
5bit:訪問位,當置位時表示已經被訪問,反之,沒有
6bit(非PTE或PDE(2MB)):可用位
6bit(PTE或PDE(2MB)):D位,dirty,即髒位,置位元時表示頁面被寫過
7~8bit(非PTE或PDE(2MB)):0
avail:系統程式師可用
G:全域標誌
PAT:頁表屬性
各種base address是用來得到下一級表的基底位址的,最後的物理位址=page base address*2^12(2^21)+2^12(2^21),而page base address的大小取決於你的cpu的最大物理位址了。
3.最後,我來看一看sign extended會形成什麼效果。
由於sign extended的作用會將線性位址分成相同大小的兩段,從0至00007FFF`FFFFFFFF,以及從 FFFF8000`00000000至FFFFFFFF`FFFFFFFF總計256TB的地址範圍,這非常符合作業系統的習慣。
這種“古怪”的規則為日後擴展到真正的64位定址保留了一個重要的特性:很多的作業系統(包括但不限於Windows NT系列)將位址空間的高半部分(被稱作內核空間)留給自己,將低半部分(使用者空間)留給應用程式碼、用戶態棧、堆和其他數據區。這種設計保證了每一個符合AMD64的實現都擁有兩個記憶體片段:低半段從00000000`00000000開始,隨著更多的虛擬位址位元變得可用而“向上生長”;高半部分被“懸掛”在位址空間的頂部而“向下生長”。同樣,將未被使用的位址位元內容固定下來防止被作業系統用作標誌位元、特權級標號等其他用途,是為了避免當架構擴展至52,56, 60 和64位的時候出現問題。
參考資料:
AVX指令集:
回覆刪除http://baike.baidu.com/view/3257334.htm
Intel公司将为Sandy Bridge带来全新的指令扩展集Intel Advanced Vector Extensions (Intel AVX)。AVX是在之前的128bit扩展到和256bit的SIMD(Single Instruction, Multiple Data)。而Sandy Bridge的SIMD演算单元扩展到256bits的同时数据传输也获得了提升,所以从理论上看CPU内核浮点运算性能提升到了2倍。.....