译注:
列表 4-2 中的这些结构定义可以在随书光盘的 srccommonincludew2k_spy.h 中找到 。
typedef DWORD X86_REGISTER, *PX86_REGISTER, **PPX86_REGISTER;
// -----------------------------------------------------------------
typedef struct _X86_SELECTOR
{
union
{
struct
{
WORD wValue; // packed value
WORD wReserved;
};
struct
{
unsigned RPL : 2; // requested privilege level
unsigned TI : 1; // table indicator: 0=gdt, 1=ldt
unsigned Index : 13; // index into descriptor table
unsigned Reserved : 16;
};
};
}
X86_SELECTOR, *PX86_SELECTOR, **PPX86_SELECTOR;
#define X86_SELECTOR_ sizeof (X86_SELECTOR)
// -----------------------------------------------------------------
typedef struct _X86_DESCRIPTOR
{
union
{
struct
{
DWORD dValueLow; // packed value
DWORD dValueHigh;
};
struct
{
unsigned Limit1 : 16; // bits 15..00
unsigned Base1 : 16; // bits 15..00
unsigned Base2 : 8; // bits 23..16
unsigned Type : 4; // segment type
unsigned S : 1; // type (0=system, 1=code/data)
unsigned DPL : 2; // descriptor privilege level
unsigned P : 1; // segment present
unsigned Limit2 : 4; // bits 19..16
unsigned AVL : 1; // available to programmer
unsigned Reserved : 1;
unsigned DB : 1; // 0=16-bit, 1=32-bit
unsigned G : 1; // granularity (1=4KB)
unsigned Base3 : 8; // bits 31..24
};
};
}
X86_DESCRIPTOR, *PX86_DESCRIPTOR, **PPX86_DESCRIPTOR;
#define X86_DESCRIPTOR_ sizeof (X86_DESCRIPTOR)
// -----------------------------------------------------------------
typedef struct _X86_GATE
{
union
{
struct
{
DWORD dValueLow; // packed value
DWORD dValueHigh;
};
struct
{
unsigned Offset1 : 16; // bits 15..00
unsigned Selector : 16; // segment selector
unsigned Parameters : 5; // parameters
unsigned Reserved : 3;
unsigned Type : 4; // gate type and size
unsigned S : 1; // always 0
unsigned DPL : 2; // descriptor privilege level
unsigned P : 1; // segment present
unsigned Offset2 : 16; // bits 31..16
};
};
}
X86_GATE, *PX86_GATE, **PPX86_GATE;
#define X86_GATE_ sizeof (X86_GATE)
// -----------------------------------------------------------------
typedef struct _X86_TABLE
{
WORD wReserved; // force 32-bit alignment
WORD wLimit; // table limit
union
{
PX86_DESCRIPTOR pDescriptors; // used by sgdt instruction
PX86_GATE pGates; // used by sidt instruction
};
}
X86_TABLE, *PX86_TABLE, **PPX86_TABLE;
#define X86_TABLE_ sizeof (X86_TABLE)
列表 4-2. i386 的寄存器、选择器、描述符、门和表
接下来的一组与 i386 内存管理相关的结构,它们收录在 列表 4-3 中,这些结构包括:与请求式分页相关的结构和 图 4-3 和 图 4-4 给出的几个成员 。
l X86_PDBR 该结构对应 CPU 的 CR3 寄存器,即众所周知的页目录基地址寄存器( PDBR ) 。其高 20 位为 PFN,即 4KB 物理页数组的索引 。PFN=0 对应物理地址 0x00000000,PFN=1 为 0x00001000,依此类推 。20 个位足够转换整个 4GB 地址空间 。PDBR 中的 PFN 是物理页的索引,用来控制整个页目录 。PFN 中剩余的位大多数都被保留,但 3 号位例外,它用来控制页一级的 write-through ( page-level write-through, PWT ),4 号位如果为 1,则禁止页一级的高速缓冲 。
l X86_PDE_4M 和 X86_PDE_4K 是页目录项( PDE )的两个可选方案,用来选择 4MB 页或者 4KB 的页 。一个页目录中最多包含 1024 个 PDE。PFN 是页帧号,它指向下一级的页 。对于一个 4MB 的 PDE,其 PFN 位域仅有 10 个位的宽度,可寻址一个 4MB 的数据页 。4KB 的 PDE 拥有 20 位的 PFN,可指向一个页表,由页表最终选择一个数据页 。剩余的位用来定义多种属性 。这些属性中最有趣的是“页大小”位 PS,用于控制页的大小( 0=4KB,1=4MB )和“存在”位 P,标识下属的数据页( 4MB 模式)或页表( 4KB 模式)是否存在于物理内存中 。
推荐阅读
- 1 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- Windows 2000下的Raw Socket编程
- Windows 2000开发过程中一些有趣的数据
- Windows2000软件冲突一例
- 大叔与少年什么时候开始播
- 盛世嫡妃好看吗
- 命令篇 Windows 2000/XP的CMD命令教程 (2)
- 如何手动删除 Windows NT 或 Windows 2000
- Windows 2000系统编程——进程的创建
- 4 《Undocumented Windows 2000 Secrets》翻译 --- 第四章