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

2 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 六 )


#define X86_DESCRIPTOR_SYS_CALL32 0xC
#define X86_DESCRIPTOR_SYS_INT32 0xE
#define X86_DESCRIPTOR_SYS_TRAP32 0xF
// -----------------------------------------------------------------
#define X86_DESCRIPTOR_APP_ACCESSED 0x1
#define X86_DESCRIPTOR_APP_READ_WRITE 0x2
#define X86_DESCRIPTOR_APP_EXECUTE_READ 0x2
#define X86_DESCRIPTOR_APP_EXPAND_DOWN 0x4
#define X86_DESCRIPTOR_APP_CONFORMING 0x4
#define X86_DESCRIPTOR_APP_CODE 0x8
列表 4-5. 附加的 i386 內(nèi)存管理相關(guān)定義
第二組宏和常量與 Windows 2000 的 PDE 、 PTE 數(shù)組有關(guān) 。和其他幾個系統(tǒng)地址不同,這些數(shù)組的基地址并沒有在系統(tǒng)啟動時作為一個全局變量出現(xiàn),而是被定義成了一個常量 ??梢酝ㄟ^反編譯內(nèi)存管理 API 函數(shù): MmGetPhysicalAddress() 和 MmIsAddressValid() 來證明,在這些函數(shù)里,這些地址都以“魔術(shù)數(shù)字”的形式出現(xiàn) 。這些常量并沒有包括在 DDK 頭文件中,不過 列表 4-5 展示了如何定義它們 。
l X86_PAGES 是一個硬編碼的地址和指針(指向 0xC0000000 ),0xC0000000 是 Windows 2000 的 PTE 數(shù)組開始的地方 。
X86_PTE_ARRAY 等價于 X86_PAGES,但是被轉(zhuǎn)型為 PX86_PE,也就是說,指向一個 X86_PE 類型的數(shù)組,X86_PE 定義于列表 4-2。
X86_PDE_ARRAY 是一個巧妙的定義,它通過 PTE 數(shù)組的位置來計算 PDE 數(shù)組的基地址,這需要用到 PTI_SHIFT 常量 。將線性地址映射為 PTE 地址的通用格式為:(( LinearAdress >> 12 ) *4 )0xC0000000,線性地址 0xC0000000 轉(zhuǎn)換后的地址為頁目錄的基地址 。
列表 4-5 的最后兩部分包括選擇器和特殊類型的描述符,以及對 列表 4-2 的補充 。
l X86_SELECTOR_RPL 、 X86_SELECTOR_TI 和 X86_SELECTOR_INDEX 都是位掩碼,分別對應(yīng) X86_SELECTOR 結(jié)構(gòu)中的 RPL 、 TI 和 Index 成員 。
l X86_SELECTOR_SHIFT 是一個右移因子,用來使選擇器的 Index 的數(shù)值向右對齊 。
l X86_SELECTOR_LIMIT 定義了選擇器可使用的最大索引值,該限制為 8,191。這個值確定了描述符表的最大尺寸 。每個選擇器索引均指向一個描述符,每個描述符包含 64 個位(即 8 個字節(jié)) 。所以,描述符表的最大尺寸為: 8,192*8=64KB。
l X86_DESCRIPTOR_SYS_* 是一組常量,用于定義系統(tǒng)描述符類型 。如果描述符的 S 位被設(shè)為 0,那么描述的 Type 成員將采用這一組類型中的某一個 。請參考 列表 4-2 中的 X86_DESCRIPTOR 的定義 。系統(tǒng)描述符類型在 Intel 手冊中有詳細(xì)介紹( Intel 1999c, pp. 3-15f ),表 4-1 給出了所有可用的系統(tǒng)描述符類型 。
列表 4-5 中的 X86_DESCRIPTOR_APP_* 常量也可用于定義描述符的 Type 成員,前提是描述符的 S 位不為 0。此時,該應(yīng)用程序描述符可能需要引用一個代碼或數(shù)據(jù)段 。因為應(yīng)用程序描述符類型的屬性受 Type 域的第四個位影響,所以 X86_DESCRIPTOR_APP_* 常量被定義為單位掩碼( single-bit mask ),這樣一些位就可針對數(shù)據(jù)和代碼段有不同的解釋 。
l X86_DESCRIPTOR_APP_ACCESSED 如果一個段可以被訪問,則采用
l X86_DESCRIPTOR_APP_READ_WRITE 決定一個數(shù)據(jù)段是否允許只讀或讀 / 寫訪問 。
l X86_DESCRIPTOR_APP_CONFORMATING 說明一個代碼段是否相匹配 。也就是說,它是否可以被以被弱特權(quán)代碼( less privileged code )調(diào)用(參考 Intel 1999c,pp. 4-13ff ) 。
l X86_DESCRIPTOR_APP_CODE 用來區(qū)別代碼段和數(shù)據(jù)段 。注意,堆棧屬于數(shù)據(jù)段的范疇,而且必須總是可寫的 。
稍后,當(dāng)下一章中的 Memory Spy 程序開始運行時,我們將重溫系統(tǒng)描述符 。表 4-1 算是 i386 內(nèi)存管理的一個簡短總結(jié) 。有關(guān)本話題的更多內(nèi)容,請參考 Intel Pentium 手冊( Intel 1999a,1999b,1999c ) 。
表 4-1. 系統(tǒng)描述符類型
名 稱

描 述

推薦閱讀