X86分页机制-101012分页

在32位的系统中,我们每一个程序都有自己独立的4GB空间,假设现在开启了2个程序,那么这两个程序就拥有了8GB的空间。但是我们的内存如果只有4GB大小,2个程序又占用8GB占用内存,如何存的下这么大的进程呢?所以我们产生了 一个疑问,一个程序独占的4GB空间是不是真实存在的呢?答案很明显不是,因此这个4GB的空间其实就是我们所说的虚拟空间,虚拟空间的地址也就称为虚拟地址。那么又如何通过虚拟地址找到物理地址的呢?这其中要通过转换才能找到。下面我们先理清一些概念。

1.线性地址,有效地址,物理地址。

物理地址我们清楚,是真实存在也就是我们数据真实放的地方。

假设我们有如下汇编指令:

mov eax,dwrod ptr ds:[0x12345678]

我们看到的0x12345678这就是有效地址。这条汇编指令的意思是将0x12345678这个地址内的数据放入eax寄存器中。但是0x12345678并不是真正的那个地址,是通过ds.base+0x12345678去找到。这个ds.base+0x12345678地址我们称为线性地址。这里如果没看懂的话涉及到分段机制以及GDT表的知识,可以先不管,这个线性地址是假的,所以我们需要通过它找到这个数据的真实物理地址。但是如果仅通过这个线性地址去找数据其实是不存在的。因为这个地址是数据一个程序的虚拟地址,这就涉及到如何通过这个线性地址找到物理地址这一步其实是CPU做的事情。

当CPU通过地址译码器见到一个线性地址的时候,它会去自动转换成物理地址。针对32位的系统来说,有两种转换的方式,一种是10-10-12分页,一种是2-9-9-12方式。如果是64位系统还有一种分页方式,我们这篇研究10-10-12分页方式。

首先我们在xp上做实验,打开一个记事本写一句Hello world,因为一个记事本也是一个进程,同样有属于自己的4GB空间,我们写的hello world一定会存在它的空间里。借助CE工具,我们找到它的线性地址。如图:

 可以看到我们得到的线性地址是000B09A8这是一个32位的地址,所谓的10-10-12分页就是把一个32位的地址拆分成10比特位10比特位和12比特位,我们拆分后的结果如下:

9A8展开是12位所以我没有拆分,为什么要这样拆分呢,因为每个进程都有一个CR3,准确来说都有一个CR3值,CR3是一个寄存器。它指向一个物理页,一共是4096个字节也就是4kb。 

 CR3是唯一指向物理地址的寄存器。它里面存了一个值指向的是物理页,上图所示的一级二级其实是一个页目录表,我们的10-10-12分页第一个10比特位就是找在第一级页目录的哪个位置,找到后里面存的又是一个地址,指向第二级页目录,然后通过第二个10比特位来找到第二级目录表中具体位置,里面存的是指向物理页的地址,接着用这个物理地址加上我们分解的12比特位找到最终位置。可以结合上面图示理解。我们做一下实验会更好理解。首先我们得找到CR3的值。通过windbg找到它:

我们找到笔记本这个进程,然后找到CR3的值,也就是0x1c041000。

现在我们开始用我们刚刚分解的值,首先是第一个10比特我们算出来是0,所以它里面的存的值就是0x1c1c0867参考上图,但是我们在算的时候要忽略后三位,因为这三位是属性位,并不是真实的值。所以这里我们得到的其实是0x1c1c0000。通过这个地址我们找到了第二级目录表,但是我们需要知道具体偏移。我们知道在页目录表中每一项是4个字节,里面是一个32位的地址。所以第二个分解出来的10比特比特的值的乘以4找到它在第二级目录表中具体位置。

 

 现在我们找到了第二级目录表项。得到的值是0x1c64c867 同样,后三位是属性位,我们需要忽略,所以此时得到的是0x1c64c000。最后12位比特是一样的。我们直接看实验:

这里的9a8不需要乘以4了。具体细节再下篇会详细给出。此时0x1c64c9a8就是我们真实的物理地址。后面都是存的数据。我们可以用字节显示的方式查看这里的内容:

 我们看到我们的写入的数据hello world就在这里存着的。下一篇会讲解X86架构下分页更详细的内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值