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

6 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章

第四章 探索 Windows 2000 的內(nèi)存管理機(jī)制
翻譯: Kendiv( fcczj@263.net)
更新: Sunday, February 17, 2005
聲明:轉(zhuǎn)載請(qǐng)注明出處,并保證文章的完整性,本人保留譯文的所有權(quán)利 。
IOCTL 函數(shù) SPY_IO_PDE_ARRAY
SPY_IO_PDE_ARRAY 是另一個(gè)普通的函數(shù),它只是簡(jiǎn)單的把整個(gè)頁(yè)目錄(開始于地址 0xC0300000 )復(fù)制到調(diào)用者提供的輸出緩沖區(qū)中 。該緩沖區(qū)采用 列表 4-21 所示的 SPY_PDE_ARRAY 結(jié)構(gòu) 。你可能已猜到,該結(jié)構(gòu)的大小正好是 4KB,它由 1,024 個(gè) 32 位的 PDE 組成 。X86_PE 結(jié)構(gòu)將在這里使用,X86_PE 結(jié)構(gòu)代表一個(gè)一般化的頁(yè)項(xiàng)( page entry ),可在 列表 4-3 中找到該結(jié)構(gòu)的定義,常量 X86_PAGES_4M 定義在 列表 4-5。SPY_PDE_ARRAY 的結(jié)構(gòu)體成員總是頁(yè)目錄項(xiàng)( PDE ),X86_PE 結(jié)構(gòu)可以是 X86_PDE_4M 類型,也可以是 X86_PDE_4KB 類型,這取決于 PDE 的 PS 位的取值 。
在無(wú)法保證源數(shù)據(jù)頁(yè)存在于物理內(nèi)存時(shí),就開始復(fù)制內(nèi)存中的數(shù)據(jù)通常并不是一個(gè)好主意 。不過(guò),頁(yè)目錄是少數(shù)列外中的一個(gè) 。在當(dāng)前任務(wù)處于運(yùn)行狀態(tài)時(shí),它的頁(yè)目錄總是存在于物理內(nèi)存中 。它不會(huì)被置換到頁(yè)面文件中,除非另一個(gè)任務(wù)被置換進(jìn)來(lái) 。這就是為什么 CPU 的頁(yè)目錄基地址寄存器( PDBR )沒(méi)有 P ( present )位的原因,PDE 和 PTE 也類似 。請(qǐng)參考 列表 4-3 中的 X86_PDBR 結(jié)構(gòu)的定義,以驗(yàn)證這一點(diǎn) 。
typedef struct _SPY_PDE_ARRAY
{
X86_PE apde [X86_PAGES_4M];
}
SPY_PDE_ARRAY, *PSPY_PDE_ARRAY, **PPSPY_PDE_ARRAY;
#define SPY_PDE_ARRAY_ sizeof (SPY_PDE_ARRAY)
列表 4-21. SPY_PDE_ARRY 結(jié)構(gòu)的定義
IOCTL 函數(shù) SPY_IO_PAGE_ENTRY
如果你對(duì)給定線性地址的 page entry 感興趣的話,這個(gè)函數(shù)就是一個(gè)很好的選擇 。列表 4-22 給出了 SpyMemoryPageEntry() 的內(nèi)部細(xì)節(jié),該函數(shù)就是用來(lái)處理 SPY_IO_PAGE_ENTRY 請(qǐng)求的 。該函數(shù)返回的 SPY_PAGE_ENTRY 結(jié)構(gòu)本質(zhì)上是一個(gè) X86_PE page entry (定義于 列表 4-3 ),不過(guò)這里增加了兩個(gè)新成員(為了使用方便): dSize 和 fPresent。其中 dSize 成員用于說(shuō)明頁(yè)的大?。ㄒ宰止?jié)為單位),其值不是 X86_PAGE_4KB ( 4,096 字節(jié))就是 X86_PAGE_4MB ( 4,194,304 字節(jié)); fPresent 成員用來(lái)說(shuō)明頁(yè)是否存在于物理內(nèi)存中 。這個(gè)標(biāo)志必須和 SpyMemoryPageEntry() 自身的返回值進(jìn)行對(duì)比,即使 fPresent 為 FALSE,函數(shù)自身的返回值也可為 TRUE。此時(shí),提供的線性地址時(shí)有效的,但它指向的數(shù)據(jù)頁(yè)已被置換到了頁(yè)面文件中 。這種情況可通過(guò)設(shè)置 page entry 的第 10 位(即 列表 4-22 中出現(xiàn)的 PageFile )來(lái)表示 。當(dāng) P 位(該位屬于 X86_PNPE 結(jié)構(gòu))被置 0 時(shí),PageFile 就會(huì)被設(shè)置 。請(qǐng)參考本章稍早討論過(guò)的 X86_PNPE 結(jié)構(gòu)的細(xì)節(jié) 。X86_PNPE 結(jié)構(gòu)代表一個(gè) page-not-persent entry,該結(jié)構(gòu)定義于 列表 4-3。
SpyMemoryPageEntry() 首先假定目標(biāo)頁(yè)是 4MB 頁(yè),然后,從系統(tǒng)的 PDE 數(shù)組(此數(shù)組起始于 0xC0300000 )中復(fù)制指定線性地址的 PDE 到 SPY_PAGE_ENTRY 結(jié)構(gòu)體的 pe 成員 。如果 P 位不為 0,則肯定存在下一級(jí)的頁(yè)或頁(yè)表,所以接下來(lái)檢查 PS 位以確定頁(yè)面大小 。如果 PS 位不為 0,則表示此 PDE 指向一個(gè) 4MB 數(shù)據(jù)頁(yè),工作到此就可結(jié)束了 ------SpyMemoryPageEntry() 返回 TRUE,并且 SPY_PAGE_ENTRY 結(jié)構(gòu)體的 fPresent 成員也同時(shí)被設(shè)為 TRUE。如果 PS 位為 0,則 PDE 指向的是一個(gè) PTE,所以代碼從起始于 0xC0000000 的數(shù)組中提取該 PTE,并檢查它的 P 位 。如果不為 0,則包含指定線性地址的 4KB 頁(yè)存在于物理內(nèi)存中,此時(shí),SpyMemoryPageEntry() 和 fPresent 都會(huì)報(bào)告 TRUE。否則,找到的必定是一個(gè) page-not-present entry,因此 SpyMemoryPageEntry() 返回 TRUE,不過(guò)僅當(dāng) PageFile 位不為 0 時(shí),fPresent 成員才會(huì)被設(shè)為 FALSE。
typedef struct _SPY_PAGE_ENTRY

推薦閱讀