2 《Undocumented Windows 2000 Secrets》翻译 --- 第四章( 三 )


X86_PTE_4K 定义了页表项(属于一个页表)的内部结构 。和页目录类似,一个页表可拥有 1024 个项 。X86_PTE_4K 和 X86_PDE_4K 的不同之处为:前者没有 PS 位,这根本不需要,因为页的大小肯定是 4KB。需要注意的是,没有所谓的 4MB 的 PTE,因为采用 4MB 页的内存模式不需要页表这一中间层 。
X86_PNPE 代表一个“不存在的页”项( page-not-present entry, PNPE ),也就是说,一个 PDE 或 PTE 中的 P 位为 0。如 Intel 的手册所说的,保留的第 31 位是“对操作系统或执行体( executive )均可用”( Intel 1999c,pp. 3-28 ) 。如果一个线性地址映射到了一个 PNPE,这意味着这个地址或者还未使用或者它所指向的页已经被置换到了页面文件中 。Windows 2000 使用 PNPE 保留的第 31 位来存储页的信息 。有关页信息的结构没有文档记载,不过它类似于名为 PageFile 的第 10 位,如 列表 4-3 所示,如果设置了该位,则表示页已被置换出物理内存 。在这种情况下,Reserved1 和 Reserved2 位域将包含系统在页面文件中定位该页的信息,因此,当需要访问该页时,可很快的将其换回物理内存 。
X86_PE 该结构是为了方便使用而加入的 。它仅包含一个 union,该 union 包括页项所有可能的状态,此处的页项是指: PDBR 的内容、所有 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
};

推荐阅读