本人把核心编程那单看好几次了,不过还是了解不了,希望高人能帮忙,
我先说下我对虚拟地址转换成物理内存地址的理解,,这也是在网上找到的说法。
==================================================
对于x86系统,页目录的物理地址放在CPU的CR3寄存器中。 CPU把虚拟地址转换成物理地址:一个虚拟地址,大小4个字节(32bit),包含着找到物理地址的信息,分为3个部分
1。第22位到第31位这10位(最高10位)是页目录中的索引,
2。 第 12 位到第21位这10位是页表中的索引,
3。第0位到第11位这12位(低12位)是页内偏移。
对于一个要转换成物理地址的虚拟地址,CPU首先根据CR3中的值,找到页目录所在的物理页。然后根据虚拟地址的第22位到第31位这10位(最高的 10bit)的值作为索引,找到相应的页目录项(PDE,page directory entry),页目录项中有这个虚拟地址所对应页表的物理地址。有了页表的物理地址,根据虚拟地址的第12位到第21位这10位的值作为索引,找到该页表中相应的页表项(PTE,page table entry),页表项中就有这个虚拟地址所对应物理页的物理地址。最后用虚拟地址的最低12位,也就是页内偏移,加上这个物理页的物理地址,就得到了该虚拟地址所对应的物理地址。
一个页目录有1024项,虚拟地址最高的10bit刚好可以索引1024项(2的10次方等于1024)。一个页表也有1024项,虚拟地址中间部分的 10bit,刚好索引1024项。虚拟地址最低的12bit(2的12次方等于4096),作为页内偏移,刚好可以索引4KB,也就是一个物理页中的每个字节。
========================================
问题:
1。这理解过程都OK,不过我现在突然想起,在查找到PDE的时候,低12位是一些标志位,高20位的就是页表的物理地址了,可是我查看资料发现,页表是在系统地址空间的,这时候说的系统地址空间就是我们真实内存条大小范围之内,而不是我们平时说的2G之上????
另外由于一个进程有1个页目录表,1024个页表,而一个页目录表大小为1024*4=4K,1024个页表的大小为1024*1024*4=4M
那就是一个进程启动,不管它有多大多小,它都必要分配到4M+4K大小的物理内存给它???如果这样的话,那这些页表不会被转换出去吧,因为我也听说因为页表是存放在系统地址空间的,所以然不会给转换出去!
2。我知道页表项PTE中有几个重要标志位,我知道页保留,提交这2个标志位是在这上面,
我在看操作系统的书的时候,还有个标志位,就是标志此物理页是否已经调入内存,另外还说能记录到当些物理页被转换到页面文件后的地址,我就晕了,怎么记录得了地址啊,这页表项PTE已经用20位来记录物理页的地址了,还哪有位来记录呢?
3。当发生缺页的时候,系统是怎么知道的?难道在虚拟地址转换的过程中,在页表中没有找到它需要的页表项??
如果是这样的话,那当系统去页面文件把需要的页调进来的时候,系统怎么知道这个页面文件在哪?当凭一个虚拟地址的转换没办法吧?难道还有另一张表维护着?在启动进程的时候已经初始化好的?
4。另外看书说的 保留和提交是什么意思。是不是对页表的一些设置?具体怎么实现,谢谢!!!
是这样吗:保留了地址空间,就应该有一个起始地址,和一个指定大小吧?而这个起始地址是个虚拟地址,也应该可以转换得到一个页表的页表项里面,如果指定的是保留 64K大小,那就应该占用16页表项,并把页表项里面的保留标志位置1,不过由于并没有提交存储空间,所以并没有物理内存影响到相应的页表项吧??是这样吗?感觉这样好合理了
=========================
以上问题,希望高人能帮忙,要不我给它们折磨死的!!!!!!!!!!!
[课程]FART 脱壳王!加量不加价!FART作者讲授!