日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

1 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 五 )


4KB 和 4MB 分頁模型各有優(yōu)缺點 。幸運的是,操作系統(tǒng)的設(shè)計人員不必非要在二者之中選擇一個,可以混合使用這兩種模型 。例如, Windows 2000 在內(nèi)存范圍 0x80000000 --- 0x9FFFFFFF 使用 4MB 大小的頁,內(nèi)核模塊 hal.dll 和 ntoskrnl.exe 均被加載到該地址范圍內(nèi) 。剩余的線性地址采用 4KB 頁來管理 。Intel 大力推薦采用這種混合設(shè)計,以改進系統(tǒng)性能,這也因為 4KB 和 4MB 的頁項( Page Entry )都會被高速緩存到不同的轉(zhuǎn)換后備緩沖區(qū)( Translation Lookaside Buffers , TLBs )中,該 TLB 位于 i386 CPU 內(nèi)部( Intel 1999c , pp.3-22f ) 。操作系統(tǒng)的內(nèi)核通常比較大,而且需要常駐內(nèi)存,因此,如果將它們保存在多個 4KB 頁中將會永久性的耗盡寶貴的 TLB 空間 。
圖 4-4. 一層間接模型(采用 4MB 頁)
注意,地址轉(zhuǎn)換的所有步驟都在物理內(nèi)存中進行 。PDBR 和所有的 PDE 、 PTE 包含的都是物理地址指針 。在 圖 4-3 和 圖 4-4 中可找到的線性地址位于左下角,該線性地址將轉(zhuǎn)化為物理頁中的偏移量 。另一方面,應(yīng)用程序卻必須使用線性地址,它們對物理地址一無所知 。不過,通過將頁目錄和其下屬的所有頁表映射到線性地址空間可以填補這一不足 。在 Windows 2000 和 Windows NT 4.0 中,在線性地址范圍 0xC0000000----0xC03FFFFF 可訪問所有的 PDE 和 PTE ,這是一個采用 4MB 頁的線性內(nèi)存區(qū)域 ??梢院唵蔚耐ㄟ^線性地址的高 20 位來查找與其相關(guān)聯(lián)的 PTE ,這個高 20 位作為 32 位 PTE 數(shù)組的索引, PTE 數(shù)組起始于 0xC0000000。例如,地址 0x00000000 表示的 PTE 位于 0xC0000000。假定有一線性地址 0x80000000 ,通過將該地址右移 12 位,可得到 0x80000 (即該地址的高 20 位),因為每個 PTE 占用 4 個字節(jié),所以目標(biāo) PTE 的地址為: 0xC0000000( 4*0x80000 ) =0xC0200000。這樣的結(jié)果看起來很有趣,線性地址將 4GB 地址空間劃分為相等的兩部分,又映射為一個 PTE 的地址,從而將 PTE 數(shù)組也劃分為了相等的兩部分 。
現(xiàn)在,讓我們更進一步,通過 PTE 自身來計算數(shù)據(jù)項在 PTE 數(shù)組中的地址 。常規(guī)的映射公式為:(( LinearAddress >> 12 ) *4 )0xC0000000。LinearAddress 取值范圍為: 0xC0000000----0xC0300000。位于線性地址 0xC0300000 的數(shù)據(jù)項指向 PTE 數(shù)組在物理內(nèi)存中的起始位置 ?,F(xiàn)在回去看一下 圖 4-3 ,開始于地址 0xC0300000 的 1024 個數(shù)據(jù)項肯定是頁目錄!這種特殊的 PDE 、 PTE 排列方式被多個內(nèi)存管理函數(shù)使用,這些函數(shù)由 ntoskrnl.exe 導(dǎo)出 。例如,有文檔記載的 API 函數(shù) MmIsAddressValid() 和 MmGetPhysicalAddress() 使用 32 位的線性地址來查找其 PDE ,如可用,還會查找其 PTE ,并會檢查它們的內(nèi)容 。MmIsAddressValid() 簡單的檢驗?zāi)繕?biāo)頁是否位于物理內(nèi)存中 。如果測試失敗,就意味著線性地址或者無效或者該地址引用的頁已經(jīng)被置換到了后備存儲器(由系統(tǒng)頁面文件集表示)中 。MmGetPhysicalAddress() 首先從線性地址中提取相應(yīng)的頁幀計數(shù)器( PFN ),該 PFN 就是與其相關(guān)的物理內(nèi)存頁(該頁將按照頁大小進行劃分)的基地址 。接下來,它通過線性地址中剩余的 12 個位,來計算在物理頁中的偏移量,最后將 PFN 指出的物理頁基地址和前面算出的偏移量相加即可得到該線性地址對應(yīng)的物理地址 。
更徹底的檢查 MmGetPhysicalAddress() 的實現(xiàn)方式,會發(fā)現(xiàn) Windows 2000 內(nèi)存布局的另一個有趣的特性 。MmGetPhysicalAddress() 函數(shù)在開始之前,首先測試線性地址是否位于 0x80000000-----0x9FFFFFFF。就像前面提到的,這里存放著 hal.dll 和 ntoskrnl.exe ,而且這也是 Windows 2000 使用 4MB 頁的地址塊 。這個有趣的特性是,如果給定的線性地址位于這一范圍, MmGetPhysicalAddress() 將不會關(guān)心所有的 PDE 或 PTE。替代的是,該函數(shù)簡單的將線性地址的高 3 位設(shè)為零,然后加上字節(jié)偏移量,最后將得到地址作為物理地址返回 。這意味著,物理地址范圍: 0x00000000----0x1FFFFFFF 將按照 1 : 1 的比例映射到線性地址 0x80000000----0x9FFFFFFF !要知道 ntoskrnl.exe 總是被加載到線性地址 0x80400000 ,這意味著 Windows 2000 的內(nèi)核總位于物理地址 0x00400000 ,這種情況發(fā)生在第二個 4MB 頁的基地址位于物理內(nèi)存中 。事實上,通過檢查這些內(nèi)存區(qū)域可以證明上面的假定是正確的 。本章提供的 Memory SPY 將使你有機會看到這一點 。

推薦閱讀