X86_PTE_4K 定義了頁(yè)表項(xiàng)(屬于一個(gè)頁(yè)表)的內(nèi)部結(jié)構(gòu) 。和頁(yè)目錄類似,一個(gè)頁(yè)表可擁有 1024 個(gè)項(xiàng) 。X86_PTE_4K 和 X86_PDE_4K 的不同之處為:前者沒(méi)有 PS 位,這根本不需要,因?yàn)轫?yè)的大小肯定是 4KB。需要注意的是,沒(méi)有所謂的 4MB 的 PTE,因?yàn)椴捎?4MB 頁(yè)的內(nèi)存模式不需要頁(yè)表這一中間層 。
X86_PNPE 代表一個(gè)“不存在的頁(yè)”項(xiàng)( page-not-present entry, PNPE ),也就是說(shuō),一個(gè) PDE 或 PTE 中的 P 位為 0。如 Intel 的手冊(cè)所說(shuō)的,保留的第 31 位是“對(duì)操作系統(tǒng)或執(zhí)行體( executive )均可用”( Intel 1999c,pp. 3-28 ) 。如果一個(gè)線性地址映射到了一個(gè) PNPE,這意味著這個(gè)地址或者還未使用或者它所指向的頁(yè)已經(jīng)被置換到了頁(yè)面文件中 。Windows 2000 使用 PNPE 保留的第 31 位來(lái)存儲(chǔ)頁(yè)的信息 。有關(guān)頁(yè)信息的結(jié)構(gòu)沒(méi)有文檔記載,不過(guò)它類似于名為 PageFile 的第 10 位,如 列表 4-3 所示,如果設(shè)置了該位,則表示頁(yè)已被置換出物理內(nèi)存 。在這種情況下,Reserved1 和 Reserved2 位域?qū)到y(tǒng)在頁(yè)面文件中定位該頁(yè)的信息,因此,當(dāng)需要訪問(wèn)該頁(yè)時(shí),可很快的將其換回物理內(nèi)存 。
X86_PE 該結(jié)構(gòu)是為了方便使用而加入的 。它僅包含一個(gè) union,該 union 包括頁(yè)項(xiàng)所有可能的狀態(tài),此處的頁(yè)項(xiàng)是指: PDBR 的內(nèi)容、所有 4MB 和 4KB 的 PDE 、 PTE,以及所有的 PNPE。
typedef struct _X86_PDBR // page-Directory base register (cr3)
{
union
{
struct
{
DWORD dValue; // packed value
};
struct
{
unsigned Reserved1 : 3;
unsigned PWT : 1; // page-level write-through
unsigned PCD : 1; // page-level cache disabled
unsigned Reserved2 : 7;
unsigned PFN : 20; // page-frame number
};
};
}
X86_PDBR, *PX86_PDBR, **PPX86_PDBR;
#define X86_PDBR_ sizeof (X86_PDBR)
// -----------------------------------------------------------------
typedef struct _X86_PDE_4M // page-directory entry (4-MB page)
{
union
{
struct
{
DWORD dValue; // packed value
};
struct
{
unsigned P : 1; // present (1 = present)
unsigned RW : 1; // read/write
unsigned US : 1; // user/supervisor
unsigned PWT : 1; // page-level write-through
unsigned PCD : 1; // page-level cache disabled
unsigned A : 1; // accessed
unsigned D : 1; // dirty
unsigned PS : 1; // page size (1 = 4-MB page)
unsigned G : 1; // global page
unsigned Available : 3; // available to programmer
unsigned Reserved : 10;
unsigned PFN : 10; // page-frame number
};
};
}
X86_PDE_4M, *PX86_PDE_4M, **PPX86_PDE_4M;
#define X86_PDE_4M_ sizeof (X86_PDE_4M)
// -----------------------------------------------------------------
typedef struct _X86_PDE_4K // page-directory entry (4-KB page)
{
union
{
struct
{
DWORD dValue; // packed value
};
struct
{
unsigned P : 1; // present (1 = present)
unsigned RW : 1; // read/write
unsigned US : 1; // user/supervisor
unsigned PWT : 1; // page-level write-through
unsigned PCD : 1; // page-level cache disabled
unsigned A : 1; // accessed
unsigned Reserved : 1; // dirty
unsigned PS : 1; // page size (0 = 4-KB page)
unsigned G : 1; // global page
unsigned Available : 3; // available to programmer
unsigned PFN : 20; // page-frame number
};
};
}
X86_PDE_4K, *PX86_PDE_4K, **PPX86_PDE_4K;
#define X86_PDE_4K_ sizeof (X86_PDE_4K)
// -----------------------------------------------------------------
typedef struct _X86_PTE_4K // page-table entry (4-KB page)
{
union
{
struct
{
DWORD dValue; // packed value
};
推薦閱讀
- 1 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章
- Windows 2000下的Raw Socket編程
- Windows 2000開發(fā)過(guò)程中一些有趣的數(shù)據(jù)
- Windows2000軟件沖突一例
- 大叔與少年什么時(shí)候開始播
- 盛世嫡妃好看嗎
- 命令篇 Windows 2000/XP的CMD命令教程 (2)
- 如何手動(dòng)刪除 Windows NT 或 Windows 2000
- Windows 2000系統(tǒng)編程——進(jìn)程的創(chuàng)建
- 4 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章
