1、几个虚拟地址区间:
0x00000000 - 0x0000FFFF 不可访问,NULL指针检测
0x7FFDE000 - 0x7FFDEFFF TEB
0x7FFDF000 - 0x7FFDFFFF PEB
0x7FFE0000 - 0x7FFE0FFF 共享数据区
0x80000000 - 0x9FFFFFFF 系统代码,HAL和ntoskrnl.exe,驱动(boot和ntosldr)。GDT、IDT和TSS
0xC0000000 - 0xC0FFFFFF 系统表。进程页表,页目录等和进程相关的数据结构。
0xE1000000 - 0xE57FFFFF 分页池
0xFB000000 - 0xFFDFEFFF 非分页池
0xFFDFF000 - 0xFFFFFFFFF PCR用于每个进程。保存PCR结构体,包含了IRQL,当前线程,IDT等。
2、保护
Intel提供段机制,描述符中的DPL保护每个被描述的逻辑段。但Windows NT实现的是FLAT模型。这样选种子的使用降到了最低限度。下面是GDT中的表项:
Sel Type Base Limit DPL Attributes
0008 Code32 00000000 FFFFFFFF 0 P RE
0010 Data32 00000000 FFFFFFFF 0 P RW
001B Code32 00000000 FFFFFFFFF 3 P RE
0023 Data32 00000000 FFFFFFFFF 3 P RW
0028 TSS32 8024D000 FFFFFFFFF 0 P B
0030 Data32 FFDFF000 00001FFF 0 P RW
003B Data32 7FFD9000 00000FFF 3 P RW
。。。
在FLAT模型下,APP并不关心段寄存器的内容。在ring3时候,CS、DS、SS寄存器总是分别为8、10、10。
代码运行在ring0时,FS寄存器为30,用于寻址PCR结构体如果在ring3,FS为3b。
待续。。。。。。。。