一丶查看GDT表.
我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表
我们知道,GDT表中.存储的是存储段信息. 保存了一系列的段和内存的属性.
但是微软并没有使用.
我们可以通过ring3的段寄存器. 当作GDT表的下标.进行查表. 查询GDT表.
例如我们用OD随便打开一个ring3的exe,然后看下段和虚拟地址.:
虚拟地址: 0040256f 段选择子: cs:1B
那么此时段选择字当下表.虚拟地址当作偏移.去查询GDT表
下图为选择子结构
段选择子结构:
首先先拆分选择子.
1B = 0000000000011 011
查询出来下表为3,那么去GDT表的第三项进行查找.
然后我们从中取出段首地址 加上我们的偏移
00000000 + 40256F = 0040256F(线性地址)
那么通过查询GDT表.那么可以找到线性地址. 而我们GDT表,微软没有使用它来进行进程隔离.
PS: 微软因为不使用GDT表进行进程隔离,所以段选择子都是一样的.基地址都是0,我们的虚拟地址就是线性地址.
如果没有开分页保护.那么就是物理地址了.但是注意FS寄存器. FS寄存器很特殊.并不能说GDT表没用.
二丶控制寄存器CR0
我们上面说过.如果没有开启分页保护.那么虚拟地址就是线性地址,线性地址就是物理地址
而微软是通过分页进行进程内存的隔离的.
首先说一下什么分页的历史,和CR0控制寄存器.
在保护模式下, 寄存器CR0的高位1表示开启分页.0表示不开启.
而这个在操作系统初始化的是否就已经完成了.
如果我们不开启,那么访问虚拟内存,就等价于访问物理内存了.
但是我们的三环是不可以操作的.这个属于特权指令.如果用汇编进行操作.例如:
__asm mov cr0,8000000
程序会崩溃,提示你权限不够,并且报告错误码为 C096
但是我们0环可以进行操作的.
看一下CR0的结构:
但是我们0环可以进行操作的.
此图是从inter手册上截图下来的.有兴趣的可以查询CR0查看.
刚才我们说的高位为1的是否就去掉分页保护,此时访问虚拟内存 等价于访问物理内存,其实我们