虚拟内存地址和物理内存地址

什么是虚拟内存地址和物理内存地址呢?

假设你的计算机是32位,那么它的地址总线是32位的,

也就是它可以寻址0~0xFFFFFFFF(4G)的地址空间,

但如果你的计算机只有256M的物理内存0x~0x0FFFFFFF(256M),同时你的进程产生了一个不在这256M地址空间中的地址,那么计算机该如何处理呢?

回答这个问题前,先说明计算机的内存分页机制。

计算机会对虚拟内存地址空间(32位为4G)分页产生页(page),

对物理内存地址空间(假设256M)分页产生页帧(page frame),这个页和页帧的大小是一样大的,

所以呢,在这里,虚拟内存页的个数势必要大于物理内存页帧的个数。

在计算机上有一个页表(page table),就是映射虚拟内存页到物理内存页的,更确切的说是页号页帧号的映射,而且是一对一的映射。

但是问题来了,虚拟内存页的个数 > 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?

不是的,操作系统是这样处理的。操作系统有个页面失效(page fault)功能。操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。

这就是处理虚拟内存地址到物理内存的步骤。

虚拟内存地址由页号和偏移量组成。页号对应的映射到一个页帧。那么,说说偏移量。

偏移量就是我上面说的页(或者页帧)的大小,即这个页(或者页帧)到底能存多少数据。

举个例子,有一个虚拟地址它的页号是4,偏移量是20,那么他的寻址过程是这样的:

首先到页表中找到页号4对应的页帧号(比如为8),

如果页不在内存中,则用失效机制调入页,

否则把页帧号和偏移量传给MMU(CPU的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。

总结起来说,虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。

 

虚拟内存=物理内存+swap空间(存储在交换区磁盘的空间)
---------------------
作者:Demons_at
来源:CSDN
原文:https://blog.csdn.net/qq_40840459/article/details/81054164

posted @ 2018-12-20 17:52  定静沉行  阅读(2099)  评论(0编辑  收藏  举报