摘要
什么是物理地址,什么是虚拟地址?
如果处理器没有MMU或未启用,CPU执行单元发出的内存地址直接传到芯片引脚上,被内存芯片接受,这称为物理地址(Physical Addraress)
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU地址称为虚拟地址,而MMU将这地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射到物理地址。
通俗的理解:CPU拿到的地址都是MMU给的虚拟地址,通过MMU的翻译找到了内存的物理地址进而找到数据。为什么这样设计呢?这得从早期cpu读取内存数据的历史开始道来。
早期CPU读取内存数据的历史
85年前计算机,cpu读数据是直接从内存读数据。为什么这样设计呢?
在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时应用程序也很小,将程序存储在内存中基本满足需要。例如早期的魂斗罗800k~1MB,一般16MB的内存足够用了。
缺点:随着科技发展后,很多复杂的程序大小都远超内存大小了,内存本身也不是想增大就增大,为了解决这个问题,人民提出了虚拟存储器的方法-MMU
上述相当于处理器没有MMU,CPU执行单元发出的内存地址直接传到物理地址中。
为什么有物理地址和虚拟地址?-因为内存很宝贵
随着科技的发展,图形界面以及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了。人们在想能否设计出一个程序+数据+堆栈的总大小可以超过内存空间的大小并正常运行的机制。例如如何让16MB的代码可以运行在4MB的机器呢?
人们想出了一个虚拟存储器的方法MMU(Memory Manager Unit)主要是用来管理虚拟存储器,物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权、多任务多进程操作完成。比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择哪部分4MB的程序内容保存在内存与磁盘交互程序代码,这样16MB的代码就可以运行在4MB的机器中了。
MMU原理:利用程序具有局部性原则
MMU的设计利用了程序的一个特性。例如5000行的代码程序是全部运行吗?不是的往往只有百分之一或千分之一的代码运行.该特性:程序的局部代码在物理内存中运行。即程序具有局部性原则。所以某一段很小的时间段内,只有很少一部分代码会被CPU执行。例如VMware虚拟机就是程序具有局部性原则,让我们电脑可以跑双window,苹果或Linux系统。
本学习笔记来源于哔哩哔哩:4.什么是虚拟地址和物理地址_哔哩哔哩_bilibili