2011年11月29日 星期二

x64存儲管理機制初窺

x64存儲管理機制初窺
x64存儲管理機制,經proljmik指點,去找intel手冊和AMD手冊看,看完之後把我的理解寫下,
如有什麼理解偏差之處,還望各位不要笑話。
1.長模式(long mode
   AMD64架構的長模式中包括兩個子模式:64bit模式和compatibility模式。
   64bit模式:在此模式中虛擬位址空間使用平坦(flat)模式,段寄存器包括CS,DS,ES,SS全部清零(FS,GS除外,在線性位址計算時,提供額外base寄存器定址某些OS的系統資料結構),能為64bitOS和應用程式提供64位元定址支援。
   compatiblity模式:在此模式中使用與lagecy保護模式一樣的存儲管理模式,為的是平滑運行32bit16bit的應用程式,無需重新編譯,注意:在長模式中不支援真實模式和虛擬8086模式!!











由於在64bit模式下使用flat模式,所以無lagecy保護模式下的分段管理模式,所以虛擬位址直接對應線性位址。所以x64的分頁管理模式才是64bit下的重頭戲
  
   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)。
   PDEPTE的大小保持不變。所以我們可以看到PML4+PDP+PDE+PTE+page offset=48bit,高16bit保留(其實是用以符號擴展,下面將看到符號擴展的用途)。
   CR3指向了PML4的基底位址。
   需要注意的是在使用x64模式之前,必須使CR4.PAE=1PAE用來擴展PDEPTE64bit)。如果你在未使CR4.PAE=1之前,企圖開啟x64模式的話,會引發#GP異常。
   我們從上圖還可以看到頁大小的選擇完全取決於PDE.PS(但我並沒有在文檔中看到ps位,是直接在文檔中置10),無視CR4.PSE的存在。
   2.1x64分頁管理(4kb
   上圖再說




















sign extended--符號擴展位元
   PML4 entry--在線性位址3947bit用於索引PML4 entry,指向PDP
   PDP entry--在線性位址的3038bit用來索引PDP entry,指向PDE
   PDE entry--在線性位址的2129bit用來索引PDEentry,指向PTE
   PTE entry--在線性位址的1220bit用來索引PTE entry,指向page offset
   page offset--在線性位址的011bit提供在頁中的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個線性位址 0bitP位,即存在位,表示由項所指的頁面或頁表當前是否載入到了物理記憶體中,如不存在,可以通過引發#PF異常從磁片中載入到物理記憶體中
   1bitR/W,即讀寫位,為頁表指定讀寫特權,當置位時可讀可寫;清零是唯讀
   2bit:使用者/系統位元,即為頁表指定系統還是普通使用者特權
   3bit:頁面通寫,指定快取記憶體寫策略是回寫還是通寫
   4bit:快取記憶體禁止位,當置位元時禁止相關的頁面和頁表進行快取記憶體,反之,可以
   5bit:訪問位,當置位時表示已經被訪問,反之,沒有
   6bit(非PTEPDE2MB)):可用位
   6bitPTEPDE2MB)):D位,dirty,即髒位,置位元時表示頁面被寫過
   78bit(非PTEPDE2MB)):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的作用會將線性位址分成相同大小的兩段,從000007FFF`FFFFFFFF,以及從 FFFF8000`00000000FFFFFFFF`FFFFFFFF總計256TB的地址範圍,這非常符合作業系統的習慣。
   這種“古怪”的規則為日後擴展到真正的64位定址保留了一個重要的特性:很多的作業系統(包括但不限於Windows NT系列)將位址空間的高半部分(被稱作內核空間)留給自己,將低半部分(使用者空間)留給應用程式碼、用戶態棧、堆和其他數據區。這種設計保證了每一個符合AMD64的實現都擁有兩個記憶體片段:低半段從00000000`00000000開始,隨著更多的虛擬位址位元變得可用而“向上生長”;高半部分被“懸掛”在位址空間的頂部而“向下生長”。同樣,將未被使用的位址位元內容固定下來防止被作業系統用作標誌位元、特權級標號等其他用途,是為了避免當架構擴展至52,56, 60 64位的時候出現問題。















參考資料:
   1.http://zh.wikipedia.org/zh-cn/X86-64
   2.intel手冊
   3AMD手冊