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

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


由頁表提供的間接尋址方式蘊含著很有趣的兩件事 。第一,程序所使用的地址和 CPU 使用的物理地址總線上的地址之間并沒有預(yù)設(shè)的關(guān)系 。如果你知道你的程序所使用的數(shù)據(jù)結(jié)構(gòu)位于某一地址,如, 0x00140000 ,你可能仍然不想知道任何有關(guān)這些數(shù)據(jù)的物理地址的信息,除非你要檢查頁表樹( page-table tree ) 。這需要操作系統(tǒng)來決定這些地址之間的映射關(guān)系 。甚至當(dāng)前有效的地址轉(zhuǎn)換都是無法預(yù)測的,部分的來看,這是分頁機制所固有的隨機性導(dǎo)致的 。幸運的是,在大多 數(shù)應(yīng)用程序中,并不需要有關(guān)物理地址的知識 。不過,對于開發(fā)硬件驅(qū)動程序的人員來說還是需要某些這方面的知識 。分頁的另一個隱晦之處是:地址空間并不必須 是連續(xù)的 。實際上,根據(jù)頁表的內(nèi)容, 4GB 的空間可以包含大量的“空洞”,這些“空洞”既沒有映射到物理內(nèi)存也沒有映射到后備存儲器中 。如果一個應(yīng)用程序試圖讀取或?qū)懭脒@樣的一個地址,它將立即被系統(tǒng)中止掉 。稍后,我會詳細(xì)的說明 Windows 2000 是如何將可用內(nèi)存擴展到 4GB 地址空間的 。
80486 和 Pentium CPU 使用的分段和分頁機制與 80386 很相似,但一些特殊的尋址特性除外,如 Pentium Pro 采用的物理地址擴展( Physical Address Extension, PAE )機制 。隨同更高的時鐘頻率一起, Pentium CPU 的另一特性就是其采用的雙重指令流水線,這一特性允許它在同一時刻執(zhí)行兩個操作(只要這兩個指令不互相依賴) 。例如,如果指令 A 修改一個寄存器的值,而與其相鄰的指令 B 需要這個修改后的值來進(jìn)行計算,在 A 完成之前, B 將無法執(zhí)行 。但是如果指令 B 使用另一個寄存器, CPU 就可同時執(zhí)行這兩個指令 。Pentium 系列 CPU 采用的多種優(yōu)化方式為編譯器的優(yōu)化提供了廣闊的空間 。如果你對這方面的話題很感興趣,請參考 Rick 的《 Inner Loops 》( Booth 1997 ) 。
在 i386 的內(nèi)存管理中,有三類地址非常有名,它們的術(shù)語 --- 邏輯、線性和物理地址出現(xiàn)在 Intel 的系統(tǒng)編程手冊( Intel 1999c ) 。
1. 邏輯地址 :這是內(nèi)存地址的精確描述,通常表示為 16 進(jìn)制: xxxx:YYYYYYYY ,這里 xxxx 為 selector ,而 YYYYYYYY 是針對 selector 所選擇的段地址的線性偏移量 。除了指定 xxxx 的具體數(shù)值外,還可使用具體的段寄存器的名字來替代之,如 CS (代碼段), DS (數(shù)據(jù)段), ES (擴展段), FS (附加數(shù)據(jù)段 #1 ), GS (附加數(shù)據(jù)段 #2 )和 SS (堆棧段) 。這些符號都來自舊的“段 : 偏移量”風(fēng)格,在 8086 實模式下使用此種方式來指定“ far pointers ”(遠(yuǎn)指針) 。
2. 線性地址 :大多數(shù)應(yīng)用程序和內(nèi)核驅(qū)動程序都忽略虛擬地址 。它們只對虛擬地址的偏移量部分感興趣,而這一部分通常稱為線性地址 。此種類型的地址假定了一種默認(rèn)的分段模型,這種模型由 CPU 的當(dāng)前段寄存器確定 。Windows 2000 使用 flat segmentation (平滑段),此時 CS 、 DS 、 ES 和 SS 寄存器都指向相同的線性地址空間;因此,程序可以認(rèn)為所有的代碼、數(shù)據(jù)和堆棧指針都可安全的相互轉(zhuǎn)化 。例如,在任何時候,堆棧中的一個地址都可以轉(zhuǎn)化為一個數(shù)據(jù)指針,而不需要關(guān)心相應(yīng)段寄存器的值 。
3. 物理地址 :僅當(dāng) CPU 工作于分頁模式時,此種類型的地址才會變得非?!坝腥ぁ?。本質(zhì)上,一個物理地址是 CPU 插腳上可測量的電壓 。操作系統(tǒng)通過設(shè)立頁表將線性地址映射為物理地址 。Windows 2000 所用頁表的布局的某些屬性,對于調(diào)試軟件開發(fā)人員非常有用,本章稍后將討論之 。
虛擬地址和線性地址的差別多少有些人為的痕跡,在一些文檔中會交替的使用這兩個詞 。我會盡力保證使用這一術(shù)語的一致性 。特別需要注意的是, Windows 2000 假定物理地址有 64 位寬 。而 Intel i386 系統(tǒng)通常只有一個 32 位的地址總線 。不過,某些 Pentium 系統(tǒng)支持大于 4GB 的物理內(nèi)存 。例如,使用 PAE 模式的 Pentium Pro CPU ,這種 CPU 可以將物理地址擴展到 36 位,這樣就可訪問多大 64GB 的物理內(nèi)存( Intel 1999c ) 。因此, Windows 2000 的 API 函數(shù)通常使用數(shù)據(jù)類型 PHYSICAL_ADDRESS 來表示物理地址, PHYSICAL_ADDRESS 實際是 LARGE_INTEGER 結(jié)構(gòu)的別名,如 列表 4-1 所示 。這兩種類型都定義在 DDK 頭文件 ntdef.h 中 。LARGE_INTEGER 實際上是 64 位有符號整數(shù)的結(jié)構(gòu)化表示,它可以被解釋為一對 32 位數(shù)( LowPart 和 HighPart )或一個完整的 64 位數(shù)( QuadPart ) 。LONGLONG 類型等價于 Visual C/C的原生類型 __int64 ,該類型的無符號表示叫做 ULONGLONG 或 DWordLONG ,它們都依賴基本的無符號類型 __int64。

推薦閱讀