虚拟地址转物理地址

article/2025/9/30 8:37:05

概述

CPU是如何利用页目录和页表 等数据结构将一个32位的虚拟地址翻译为32位的物理地址的。其过程可以概括为如下步骤。
① 通过CR3寄存器定位到页目录的起始地址,正因如此,CR3寄存器又称为页目录基地址寄存器(PDBR)。取线性地址的高10位作为索引选取页目录的一个表项,也就是PDE。 ② 判断PDE的PS位,如果为1,代表这个PDE指向的是一个4MB的大内存页,PDE的高10位便是4MB内存页的基地址的高10位,线性地址的低22位是页内偏移。将二者合并到一起便得到了物理地址。如果PS位为0,那么根据PDE中的页表基地址(取PDE的高20位,低12位设为0)定位到页表。
③ 取线性地址的12位到21位(共10位)作为索引选取页表的一个表项,也就是PTE。
④ 取出PTE中的内存页基地址(取PTE的高20位,低12位设为 0)。
⑤ 取线性地址的低12位作为页中偏移与上一步的内存页基地址相加便得到物理地址。

摘自《软件调试2》

32位经典分页模式(10-10-12)

使用这种分页模式 时,线性地址和物理地址的空间都是4GB大小。

如下图所示,使用r cr4查看cr4寄存器值。
在这里插入图片描述

CR4中的位代表值
PSE(Page SizeExtensions)CR4[4] 为1时启用4MB内存页,为0时限制内存页为4KB。
PAE(Physical AddressExtension)CR4[5] 为1时支持36位或36位以上的物理内存地址,为0时限定物理地址为32位。

直接使用r cr3命令打开的是系统[system]进程的页目录基地址DirBase项。这里打开的是一个DUMP文件,可以直接使用r cr3定位崩溃程序的cr3地址。

以realbug模块的起始地址和结束地址为界,搜索其中的所有ASCII字符串。执行s -sa f8c2e000 f8c35000命令。我们的目的就是要使用虚拟地址找到物理地址,通过内存中存储的字符串来验证,这里以f8c2e04d为例。
在这里插入图片描述
下面我们把虚拟地址f8c2e04d转换为物理地址。使用命令.Formats f8c2e04d展开为二进制。
在这里插入图片描述
11111000 11 000010 1110 0000 01001101
10-10-12模式,其中高10位是页目录(PDE)索引,中间10位是页表(PTE)索引,低12位是页内偏移。使用? 0y1111100011命令转换为其他格式。页目录(PDE)索引是0x3e3,页表索引是0x2e,页内偏移是0x4D。
在这里插入图片描述
CR3的高20位就是页目录基地址的高20位,低12位为0,因此,ca83000就是ImBuggy进程的页目录基地址。
在这里插入图片描述
!dd 0ca83000+3e34 L1,命令中的L1用来限制要观察的内存长度,表示只显示一个32位数据。低12位(163)代表的是内存页的属性。
在这里插入图片描述
!dd 0x0101a000+2e
4 L1,低12位(163)和上面一样代表的是内存页的属性。
在这里插入图片描述
!db 0x0d56604d 可以看到刚才我们搜索到的ASCII字符串。由此可见物理地址是对的。
在这里插入图片描述
其实,只要执行WinDBG的!pte命令便可以自动帮我们执行以上步骤:
!pte f8c2e04d
在这里插入图片描述
最后一行中的pfn是Page Frame Number的缩写,即页帧号。这是内存管理中的一个常用术语,代表以页为单位的物理内存编号。以上面结果为例,pfn是d566,加上低12位04d便得到f8c2e04d对应的物理地址d56604d。

PAE分页(2-9-9-12)

和上面一样,先检查CR4值中的配置。PAE开启,就是2-9-9-12分页机制。
在这里插入图片描述
查看CR3值
在这里插入图片描述
!dq 072c0260 L4
在这里插入图片描述
将线性地址f8bdd04d转化为二进制。
在这里插入图片描述
11 111000 101 11101 1101 0000 01001101
页目录(PDE)索引是0x1c5,页表索引是0x1dd,页内偏移是0x4D。
线性地址对应的页目录表基地址为0x1028d000。
!dq 1028d000+1c58 L1
在这里插入图片描述
!dq 1033000+1dd
8 L1
在这里插入图片描述
将低12位的标志位替换为0, 便得到内存页的基地址10561000,加上最低12位代表的页内偏移,便得到了线性地址f8bdd04d对应的物理地址0x1056104d。
在这里插入图片描述

差别

与32位分页相比,32位线性地址中的页目录索引位和页 表索引位都从10位减少到9位,所以每张页目录和页表的总表项数也 由1024项减少为512,同时每个表项的大小由4个字节增加到8个字 节,所以每张页目录或者页表的总大小仍然是4KB。总体来看,虽然 每张页目录和页表的表项数少了一半,但因为增加了一级映射,页目 录的数量由原来的1张变为最多4张,所以支持的最大页面数仍然是4×512×512 = 220,即2M个。

参考文献
《软件调试2》


http://chatgpt.dhexx.cn/article/qkjDv7bt.shtml

相关文章

虚拟地址与物理地址

虚拟地址 恰如其名,这个地址是虚拟的,与具体环境是解耦的,这样可以是程序员在编写程序时只需要关注代码逻辑本身,而不需要考虑地址分配。这些虚拟地址并不是真正运行在机器上的内存地址,每个程序的虚拟地址都是独立存在…

虚拟机ip地址

文章仅为自己在建立虚拟机过程中遇到的问题进行记录。 虚拟机查看IP地址输入 ip address 即可查看; 新建虚拟机的时候会遇到输入ip addr出现没有看到ip地址,例如如下情况时: 每个人上图可能会有不同显示,例如我的就是以eno16777…

浅谈虚拟地址转换成物理地址(值得收藏)

这里,我们讲解一下Linux是如何将虚拟地址转换成物理地址的 一、地址转换 在进程中,我们不直接对物理地址进行操作,CPU在运行时,指定的地址要经过MMU转换后才能访问到真正的物理内存。 地址转换的过程分为两部分,分段…

虚拟地址

虚拟地址 虚拟地址是程序运行在保护模式下,这样程序访问存储器所使用的逻辑地址称为虚拟地址。 那为什么需要虚拟地址呢 我们要说到寻址方式 寻址:根据指令内容确定操作数地址的过程,称为寻址 在16位的cup或者8086cpu的时候,他…

虚拟地址如何访问到物理地址

环境:32bit CPU 一、通过二级页表映射的方式访问物理地址 1、取一级页表的基地址Abase1 2、取虚拟地址的前12bit[31:20]地址O1 3、计算得到新地址Apgd(Abase1&0xFFFFF000)O1,此地址是PGD页表上的地址,取此地址中的数据Abase2 4、取虚拟地…

总线地址、物理地址、虚拟地址

1、总线地址 地址总线(Address Bus)是一种计算机总线,是CPU或有DMA能力的单元,用来沟通这些单元想要访问(读取/写入)计算机内存组件/地方的物理地址。 其实就是CPU能够访问内存的范围。 CPU寻找外部的内…

虚拟地址空间和物理地址空间

1.概念 物理地址:物理地址空间是实在的存在于计算机中的一个实体,在每一台计算机中保持唯一独立性。我们可以称它为物理内存;如在32位的机器上,物理空间的大小理论上可以达到2^32字节(4GB),但如果实际装了512的内存&a…

Linux虚拟地址空间

目录 父子进程地址相同的变量值不同问题运行结果 Linux下进程虚拟地址空间分布什么是虚拟地址空间?进程直接访问物理内存(无虚拟空间)再述虚拟地址空间!虚拟地址空间结构体是如何区域划分?解答最初的问题延伸问题: 一个pid变量怎…

虚拟地址空间

对于每一个进程都会对应一个虚拟地址空间,对于32位的操作系统(其指令的位数最大为32位,因此地址码最多32位),虚拟地址空间的大小为B即0~4GB的虚拟地址空间,其中内核空间为1GB,如下所示&#xff…

逻辑地址、物理地址、虚拟地址

文章目录 物理地址(physical address)虚拟地址(virtual memory)逻辑地址(logical address)线性地址(linear address)或也叫虚拟地址(virtual address)地址转换 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。 虽然可以…

CPU中虚拟地址、逻辑地址(有效地址)、线性地址、物理地址

虚拟地址、逻辑地址(有效地址)、线性地址、物理地址 1、虚拟地址2、逻辑地址(有效地址)3、线性地址4、物理地址5、总结 1、虚拟地址 在实模式下,虚拟地址是指由程序产生的由段选择符和段内偏移地址组成的地址。经过CPU…

虚拟地址和物理地址

1、地址概念 物理地址:物理内存就是真实的内存,CPU的地址线可以直接进行寻址的内存空间大小。比如在32位平台下,寻址的范围是2^32也就是4G,并且这是固定的。在实际的应用中,很多的应用程序都比较大,计算机…

Linux操作系统~什么是虚拟地址?深度剖析进程地址空间

目录 1.所以进程的地址空间是什么呢? 2.mm_struct内部有什么? 3.虚拟地址空间与物理内存如何关联 页表 4.为什么设计这样一个进程地址空间,不让程序直接访问内存 Q:为什么子进程修改值以后,地址还是相同&#xf…

初识虚拟地址空间

物理地址和虚拟地址 物理寻址:CPU访问存储器的最原始方法就是直接用物理地址(Physical Address, 可简称PA)。物理地址是唯一的。 虚拟寻址:CPU通过生成一个虚拟的地址来访问内存,在访问前会把虚拟地址转化为物理地址…

虚拟地址空间,虚拟文件系统

1、虚拟地址空间 1、概念与原因 虚拟地址空间是一个抽象的概念,在IBM中,这样说道:它存在,但你看不见,就是虚拟的。虚拟地址空间就是这样一个东西。(注意区分虚拟内存与虚拟地址空间) 虚拟地址空…

彻底搞懂虚拟内存,虚拟地址,虚拟地址空间

程序经过编译后,变成了可执行的文件,可执行文件主要包括代码和数据两部分,代码是只读的,数据则是可读可写的。 可执行文件由操作系统加载到内存中,交由CPU去执行,现在问题来了,CPU怎么去访问代…

使用POI导出Excel(并使用公式)

使用POI导出Excel(并使用公式) 使用java直接生成Excel并填充数据 可以参考POI官方文档,就是对Sheet,row,cell,Formula等操作, https://poi.apache.org/components/index.html 这种方式也可以生成…

poi导出excel日期格式问题

POI导出Excel的时候有时需要日期格式,在筛选时是这样的 private XSSFWorkbook wb null; String dateFormat "yyyy-MM-dd";//或者"yyyy/MM/dd"格式,"yyyy/M/d"这样的格式不会自动补0 public void setCell(int index,Date value,bool…

POI导出Excel详细教程

文章目录 前言一、引入jar包依赖二、创建自定义导出Excel样式类三、创建核心导出工具类四、创建导出对象实体Bean五、具体使用案例5.1.创建SQL脚本和初始化数据5.2.写一个查询所有学生信息接口5.3.查询学生基本信息返回数据格式5.4.导出Excel方法5.5.通过页面导出按钮导出Excel…

Java使用POI导出Excel文件

Java使用POI导出Excel文件 POI概述Apache POI 下载依赖引用关系图如下所示:直接下载Maven下载 POI实例总结 POI概述 HSSF 是 POI 项目的 Excel 97(-2007) 文件格式的纯 Java 实现。XSSF 是 POI 项目的 Excel 2007 OOXML (.xlsx) 文件格式的纯 Java 实现。 HSSF 和 XSSF 提供了读…