虚拟地址到物理地址的转换步骤【转】

简介: 转自:http://www.cnblogs.com/RyanHuang/archive/2012/05/30/2525006.html 已知一个虚拟地址0x01AF5518, 则转换的过程如下:   注意: *这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况* 1.

转自:http://www.cnblogs.com/RyanHuang/archive/2012/05/30/2525006.html

已知一个虚拟地址0x01AF5518, 则转换的过程如下:

  注意: *这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况*

1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:
  -> 0000 0001 1010 1111 0101 0101 0001 1000

  按照10, 10, 12的位数重新排列后
  -> (页目录索引)00 000 00110, (页表项索引)10 1111 0101, (偏移)0101 0001 1000

  换算成十六进制后可以得到如下结果
  页目录索引 = 6, 页表项索引 = 0x2f5 , 偏移 = 0x518

2. 根据当前的CR3寄存器中的物理地址定位页目录表基址
  Cr3中存放的是物理地址, 这个物理地址指向进程的页目录表基址, 由此可以得到
  页目录表基址(PDE) = Cr3 = 0xAA0E5000

3. 计算页表项的地址
  页表地址存放在页目录表(PDE)中的第6个项目中, 也就是
  [0xAA0E5000 + 4 * 6] = [0xAA0E5018] = 0x3D955867, 其中0x00000867为该页表属性值, PTE = 0x3D955000

3. 计算页面物理地址
  我们要找的页面在这个页表中的第0x2f5项, 所以虚拟地址所在的页的物理地址为
  [0x3D955000 + 0x2f5 * 4] = [0x3D955BD4] =
  假设[0x3D955BD4] = 0x7095e847, 页面的物理地址 x0x7095e000, 0x00000847表示的是页面属性

4. 计算最终的物理地址
  由虚拟地址分离的偏移可以计算出最终的物理地址为
  0x7095E000 + 0x00000518 = 0x7095E518.

【作者】 张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
目录
相关文章
|
1月前
请求分页给出逻辑地址,求对应的物理地址
请求分页内存管理中如何根据逻辑地址计算物理地址的过程,包括确定页号、计算偏移量,并将其转换为物理地址。
54 1
请求分页给出逻辑地址,求对应的物理地址
|
6月前
|
存储 程序员 芯片
虚拟地址和物理地址之间的区别
【4月更文挑战第12天】
453 2
虚拟地址和物理地址之间的区别
|
存储 索引
逻辑地址与物理地址的转换
最近一直在学8086,上课老师突然问了个这。对于问题“8086 CPU 能提供20位的地址信息,可直接对1M个存储单元进行访问,而CPU内部可用来提供地址信息的寄存器都是16位,那怎样用16位寄存器来实现20位地址寻址呢"明白了不少。
150 0
|
存储
逻辑地址和物理地址转换
逻辑地址和物理地址转换
|
6月前
|
算法
页表、地址重定位、地址保护的名词解释
页表、地址重定位、地址保护的名词解释
68 0
|
6月前
|
索引
虚拟地址与物理内存地址是如何映射的
虚拟地址与物理内存地址是如何映射的
|
Linux 定位技术 虚拟化
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
45 0
|
数据库 数据安全/隐私保护 索引
【操作系统】第四章:非连续内存分配(Part1:基于分页-分段的物理/逻辑地址转换)
【操作系统】第四章:非连续内存分配(Part1:基于分页-分段的物理/逻辑地址转换)
171 0
|
程序员 索引
《操作系统真象还原》——0.9 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别
物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。不管在什么模式下,不管什么虚拟地址、线性地址,CPU最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站。
2325 0
|
存储
数据寻址——堆栈寻址
数据寻址——堆栈寻址
484 0
数据寻址——堆栈寻址