计算机系统-1物理地址和物理地址

本文详细阐述了虚拟地址空间、物理地址空间以及它们在虚拟内存和物理内存中的作用,介绍了进程的虚拟地址空间划分,重点讲解了虚拟页、物理页和页表的概念,以及虚拟地址到物理地址映射的过程,包括页表命中的步骤和未命中时的缺页中断处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 虚拟地址,物理地址,虚拟地址空间,物理地址空间,虚拟内存,物理内存

虚拟地址空间是虚拟地址的集合,假设虚拟地址空间是N位的,它的地址范围为{02的N次方-1}即它有2的N次方个虚拟地址,例如16位的虚拟地址空间,它的地址范围为{065535},这意味着16位的虚拟地址空间有65536个虚拟地址。

物理地址空间是物理地址的集合,假设物理地址空间有M个字节,它的地址范围为{0M-1},M不一定是2的多少次幂,例如M=100,表示物理地址空间大小为100个字节,它的地址范围为{099},通常情况下物理地址空间是2的幂次方,例如65536,这也是为了计算机方便处理而已,并不是强制要求的。

物理内存可以认为是一个的物理字节数组,每个物理地址指向这个物理字节数组中的一项。

虚拟内存也一样,它也可以认为是一个物理字节数组,不过这个字节数组是存储在磁盘上。

物理地址空间是物理内存的范围,虚拟地址空间是虚拟内存的范围,物理地址空间中的每个物理地址都是实打实地指向了具体的存储单元,虚拟地址空间中每个虚拟地址指向哪里有3种情况:

a.未分配,这个虚拟地址仅仅是个数字而已,没有任何指向。

b.未缓冲,这个虚拟地址指向了磁盘的某个字节存储单元,里面存储了指令或者数据。

c.已缓冲,这个虚拟地址指向了物理内存的某个字节存储单元,里面存储了指令或者数据。

2 进程虚拟地址空间

操作系统加载可执行文件后,创建了一个进程,这个进程就有了自己的虚拟地址空间,每个进程的虚拟地址空间都一样,如下图所示
在这里插入图片描述
进程虚拟地址空间

如上图所示,进程的虚拟地址空间被统一划分成了多个固定区域,例如代码区,数据区,堆区,共享区,栈区,内核区。

代码区和数据区域:来自于可执行文件,代码区和数据区挨着,代码区总是在0x0040000地址以上,0x0040000地址以下另有它用。

运行时堆区域:它初始化大小为0,随着动态分配内存(malloc),运行时堆不断往高地址方向扩展,有个指针brk指向了堆的最高地址。

共享库的内存映射区域:这个区域是一些标准的系统库,这个共享库在物理内存中只存储一份,每个进程将这个区域的虚拟地址映射到同一份共享库物理内存上。

用户栈区域:这个区域紧挨着内核区域,处于高地址处,随着用户栈的出栈,入栈,动态扩展,入栈向低地址方向扩展,出栈则向高地址方向收缩,栈顶指针存储在栈寄存器(ESP)中。

内核区域:这个区域是操作系统自己代码,数据,栈空间,内核在物理内存中只存储一份,每个进程将这个区域的虚拟地址映射到同一份内核物理内存上。
在这里插入图片描述

3 虚拟页 物理页

现代操作操作和CPU将物理内存按照固定的页大小分成很多份,每一份叫做物理页(PP),每一份有一个编号叫做物理页号(PPN),这个物理页大小通常是4KB,例如一个物理内存大小为20KB,这个物理内存可以分成5个物理页,那么物理页号(PPN)就是0,1,2,3,4。

虚拟内存也一样,它的页大小与物理内存的页大小相同,虚拟内存也被分成了很多份,每一份叫做虚拟页(VP),每一份的编号叫做虚拟页号(VPN),例如假设虚拟页大小为4KB,一个虚拟内存大小为10KB,这个虚拟内存可以分成2个虚拟页(VP),虚拟页号(VPN)就是0,1

每个物理页存储在物理内存上,每个虚拟页存储在磁盘上,如下图所示
在这里插入图片描述
每个虚拟页可以有三种状态,未分配,已缓冲,未缓冲

未分配:虚拟页还没有分配磁盘空间

已缓冲:虚拟页缓冲或者映射在了物理页上。

未缓冲:虚拟页分配了磁盘空间,但没有在物理页上缓冲。

3.1 虚拟地址到物理地址的映射

VPO即虚拟页偏移量

虚拟地址由虚拟页号+虚拟页偏移量组成,虚拟页偏移量是相对某个虚拟页的偏移量。

PPO即物理页偏移量:

物理地址由物理页号+物理页偏移量组成,物理页偏移量是相对某个物理页的偏移量,

VPO等于PPO

页表(Page Table)PT:

页表是建立虚拟页号和物理页号映射关系的表结构,每个页表项(PTE)包括了有效位,物理页号,磁盘地址等信息,如下图:
在这里插入图片描述
由上图可以得知,操作系统可以根据页表项的有效位和地址信息判断出虚拟页目前所处的状态即未分配,已缓冲,未缓冲

如上图所示,页表有8个页表项,每个页表项里包含一个有效位和地址信息。

当页表项 PTE n的页表项有效位为0时,表示虚拟页 n没有缓冲在物理内存,可能在磁盘或者未分配,例如PTE 0页表项里存储的是null,表明虚拟页0即VP0是未分配状态,PTE 3里存储的是磁盘地址,表明虚拟页 3即VP3在磁盘里,但没有缓冲,VP3状态为未缓冲。

当页表项PTE n的页表项的有效位为1时,表示虚拟页n缓冲在物理内存,PTE n存储了物理页号,虚拟页 n的状态为已缓冲,例如PTE 1的页表项,有效位为1,则虚拟页VP1缓冲在了物理页中。
页表基址寄存器(PTBR)

每个进程都有自己的页表,CPU执行某个进程时,会先把该进程的一级页表起始地址存储到页表基址寄存器,这样CPU查找一级页表起始地址可以直接从寄存器查找,加快了查找效率。
在这里插入图片描述
上图为虚拟地址翻译物理地址的示意图,可以看出VPO等于PPO。

下面看看计算机各个部件是怎么通过虚拟地址访问物理内存的。

处理器根据虚拟地址访问物理内存的分为页表项命中和页表项未命中两种情况,页表项命中意味着页表项的有效位为1,页表项存储的是物理页号,虚拟页缓冲在物理页中,未命中意味着页表项有效位为0,此时需要发送缺页中断。

页表项命中的步骤如下图:
在这里插入图片描述
页表项命中翻译步骤

1.CPU将虚拟地址(VA)送入MMU,MMU根据页表基址寄存器中页表的起始地址加上虚拟页号,找到了页表项的物理地址PTEA。

2.MMU将PTEA送入到高速缓冲或者内存。

3.从高速缓冲或者内存中找到页表项(PTE),返回页表项(PTE)给MMU。

4.MMU根据PTE找出物理页号,然后加上虚拟页偏移量形成物理地址(PA),送入到高速缓冲或者内存。

5.高速缓冲或者内存获取数据,返回数据给处理器。

页表项未命中的步骤如下图:
在这里插入图片描述
1.CPU将虚拟地址(VA)送入MMU,MMU根据页表基址寄存器中页表的起始地址加上虚拟页号,找到了页表项的物理地址PTEA。

2.MMU将PTEA送入到高速缓冲或者内存。

3.从高速缓冲或者内存中找到页表项(PTE),返回页表项(PTE)给MMU。

4.MMU根据PTE,发现页不在内存中,未命中,因此MMU发送一个缺页中断,交由缺页异常处理程序处理。

5.缺页异常处理程序根据页置换算法,选择出一个牺牲页,如果这个页面已经被修改了,则写出到磁盘上,最后将这个牺牲页的页表项有效位设置为0,存入磁盘地址。

6.缺页异常程序处理程序调入新的页面,如果该虚拟页尚未分配磁盘空间,则分配磁盘空间,然后磁盘空间的页数据拷贝到空闲的物理页上,并更新PTE的有效位为1,更新物理页号,缺页异常处理程序返回后,再回到发生缺页中断的指令处,重新按照页表项命中的步骤执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值