虚拟地址到物理地址的转换
1个回答
展开全部
对于一个虚拟地址,我们如何能够实现到物理地址的转换呢?
我们知道,虚拟地址 = 高10位在页目录表中的偏移量(页目录项pde)+中间10位在页表中的偏移量(页表项pte)+物理页的偏移,因此,如果我们能够获取到虚拟地址所对应的pte的物理地址,那么根据该物理地址和虚拟地址中物理页的偏移量进行结合,就能够得到虚拟地址所对应的真实物理地址。
因为我们起初设计的时候,在页目录项的第1023项中存放的是页目录表的物理地址,我们可以根据此特定来构造出虚拟地址所对应的pte的物理地址。
uint32_t* pte = (uint32_t*)(0xffc00000 + ((vaddr & 0xffc00000) >> 10) + ((vddr & 0x003ff000) >> 12) * 4);
其中的第一部分0xffc00000是通过虚拟地址的高10位进行回环,回到自身页目录表的地址,第二项vaddr & 0xffc00000) >> 10是再用页目录项pde(页目录内页表的索引)做为pte的索引访问到页表,((vddr & 0x003ff000) >> 12)再用pte的索引做为页内偏移。
这样我们就得到的虚拟地址对应的页表项的物理地址,最后我们根据 ((*pte & 0xfffff000) + (vaddr & 0x00000fff)),来找到物理页中所对应的那、个内存地址
.
我们知道,虚拟地址 = 高10位在页目录表中的偏移量(页目录项pde)+中间10位在页表中的偏移量(页表项pte)+物理页的偏移,因此,如果我们能够获取到虚拟地址所对应的pte的物理地址,那么根据该物理地址和虚拟地址中物理页的偏移量进行结合,就能够得到虚拟地址所对应的真实物理地址。
因为我们起初设计的时候,在页目录项的第1023项中存放的是页目录表的物理地址,我们可以根据此特定来构造出虚拟地址所对应的pte的物理地址。
uint32_t* pte = (uint32_t*)(0xffc00000 + ((vaddr & 0xffc00000) >> 10) + ((vddr & 0x003ff000) >> 12) * 4);
其中的第一部分0xffc00000是通过虚拟地址的高10位进行回环,回到自身页目录表的地址,第二项vaddr & 0xffc00000) >> 10是再用页目录项pde(页目录内页表的索引)做为pte的索引访问到页表,((vddr & 0x003ff000) >> 12)再用pte的索引做为页内偏移。
这样我们就得到的虚拟地址对应的页表项的物理地址,最后我们根据 ((*pte & 0xfffff000) + (vaddr & 0x00000fff)),来找到物理页中所对应的那、个内存地址
.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询