欢迎来到天天文库
浏览记录
ID:23708864
大小:238.50 KB
页数:29页
时间:2018-11-10
《32位系统中有4gb的虚拟地址空间》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、32位系统中有4GB的虚拟地址空间每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间)各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同虚拟地址如0x11111111,看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页号,最后12位表示页内偏移(2^12=4kb),因此,一个虚拟地址实际上是一个三维地址,指明了本虚拟地址在哪个二级页表,又在哪个页以及页内偏
2、移是多少这三样信息!【虚拟地址=二级页表号.页号.页内偏移】:口诀【页表、页号、页偏移】Cpu访问物理内存的原理介绍:如高级语言DWORDg_var;//假设这个全局变量被编译器编译为0x00000004g_var=100;那么这条赋值语句编译后对应的汇编语句为:movDWORDPTR[0x00000004],100这里0x00000004就是一个虚拟地址,简称VA,那么这条mov指令究竟是如何寻址的呢?寻址过程为:CPU中的虚拟地址转换器也即MMU,将虚拟地址0x00000004转换为物理地址具体转换过
3、程为:根据CR3寄存器中记录的当前进程页表的物理地址,找到总页表也即页目录,再根据虚拟地址中的页表号,以页表号为索引,找到总页表中对应的PDE,再根据PDE,找到对应的二级页表,再以虚拟地址中的页号部分为索引,找到二级页表中的对应PTE,再根据这个PTE记录的映射关系,找到这个虚拟页面对应的物理页面,最后加上虚拟地址中的页内偏移部分,加上这个偏移值,就得出最后的物理地址。具体用下面的函数可以形象表达寻址转换过程:movDWORDPTR[0x00000004],100//这条指令的内部原理(没考虑二级缓冲情
4、况){va=0x00000004;//页表号=0,页号=0,页内偏移=4总页表=CR3;//本进程的总页表的物理地址固定保存在cr3寄存器中PDE=总页表[va.页表号];//PDE为对应的二级页表描述符二级页表=PDE.PageAddr;//得出本二级页表的地址PTE=二级页表[va.页号];//得出到该虚拟地址所在页面的PTE映射描述符If(PTE空白)//PTE为空表示该虚拟页面尚未建立映射触发0x0e号页面访问异常(具体为缺页异常)ElseIf(PTE.bPresent==false)//PTE的
5、这个字段表示该虚拟页面当前是否映射到了物理内存触发0x0e号页面访问异常(具体为缺页异常)ElseIf(CR0.wp==1&&PTE.Writable==false)//已开启页面写保护功能,就检查这个页面是否可写触发0x0e号页面访问异常(具体为页面访问保护越权异常)Else物理地址pa=cs.base+PTE.PageAddr+va.页内偏移//得出对应的物理地址将得到的pa放到地址总线上,100放在数据总线上,经由FSB->北桥->内存总线->内存条写入内存}PTE是二级页表中的表项,记录了对应虚拟
6、页面的映射情况,这个PTE实际上可以看做一个描述符。上面的过程比较简单,由于每次访问内存都要先访问一次PTE获取该虚拟页面对应的物理页面,再访问物理页面读得对应的数据,因此实际上访问了两次物理内存,如果类似于每条这样的Mov指令都要访问物理内存两次,才能获得数据,效率就很低。因此,cpu芯片中专门开辟了一个二级缓冲,用来保存那些频繁访问的PTE,这样,cpu每次去查物理页面时,就先尝试在二级缓冲中查找对应的PTE,如果找不到,再才去访问内存中的PTE。这样,效率就比较高,实际上绝大数情况就可以在二级缓冲中
7、一次性找到对应的PTE。另外有一个问题需要说明下:va---->pa的转换过程实际上是va->la->pa,实际上PTE.PageAddr表示的是相对于cs段的偏移,加上cs段的base基址,就得到了该页面的la线性地址。(线性地址=段.基地址+段内偏移),但是由于Windows采取了Flat也即所谓的平坦分段机制,使得每个段的基地址都在0x00000000处,长度为4GB,也即相当于Windows没有采取分段机制。前面讲过,cs是GDT表中的索引,指向GDT表中的cs段描述符,由于Windows不分段,
8、因此GDT中每个段描述符的基址=0,长度=4GB,是固定的!这样一来,由于不分段,线性地址就刚好是物理地址,所以本来是由虚拟地址->线性地址->物理地址的转换就可以直接看做虚拟地址->物理地址。(注:在做SSDThook、IDThook时,由于SSDT与IDT这两张表各自所在的页面都是只读的,也即他们的PTE中标志位标示了该页面不可写。因此,一修改SSDT、IDT就会报异常,一个简单的处理方法是是关闭CRO中的wp即写保护位,
此文档下载收益归作者所有