物理地址vs虚拟地址
物理地址:逻辑上,我们可以把物理内存看成一个大数组,其中每个字节都可以通过与之对应的地址进行访问,这个地址就叫做物理地址
虚拟地址:应用程序在运行时使用的地址
CPU翻译虚拟地址的过程大概如图所示
他们的包含关系如下:cpu包含MMU,MMU包含TLB
cpu
mmu(内存管理单元):负责虚拟地址到物理地址的转换
tlb(转址旁路缓存):加速地址翻译的过程
加载程序的顺序是
1.操作系统把程序从磁盘加载到内存中
2.cpu去执行程序的第一条指令但是这个指令现在在物理内存中
3.cpu取指令取得是该指令的虚拟地址,由mmu翻译为物理地址
4.这个读物理地址的请求将通过总线,传到相应的物理内存中,然后物理内存把指令发送给cpu
mmu将虚拟地址翻译为物理地址主要有两种机制:分段和分页
分段机制
操作系统以"段"(一段连续的物理内存)的形式管理/分配物理内存
应用程序的虚拟地址空间由若干个大小不同的段组成:代码段、数据段等等
当cpu访问虚拟地址中的某一个段的时候,mmu会通过查询段表来得到该段对应的物理地址
虚拟地址:
段号: 标志着该虚拟地址属于整个虚拟地址空间中的哪一段
段内地址(段内偏移): 相对于该段起始地址的偏移量
当 cpu 读取指令时,发现指令的地址是虚拟地址,那么CPU中的MMU 首先判断这个段号是否合法,如果合法, 则通过 段表基址寄存器 找到段表的位置,通过虚拟地址中的段号,找到该段的起始地址,再加上段内地址(段内偏移),就可以得到最终的物理地址
在分段机制下,虚拟内存和物理内存都划分成了不同的段
分段缺点:外部碎片
分页机制
基本思想:
将应用程序的虚拟地址空间划分为连续的、等长的虚拟页(4K)
物理地址也是划分为连续的、等长的的物理页
物理页和虚拟页页长固定且相等
之所以这样构造是因为会使操作系统很方便的为每个应用程序构造页表,即虚拟页和物理页映射关系表
在分页机制下,应用程序虚拟地址空间中的任意虚拟页可以被映射到物理内存中的任意物理页上,可以避免外部碎片的问题
分页机制下的虚拟地址也由两部分组成:虚拟页号: 页内偏移量:
翻译的具体流程就是:
MMU首先解析虚拟地址中的虚拟页号,检查这个虚拟页号是否合法,通过这个虚拟页号取该应用程序的虚拟页表中找到对应条目(页表起始地址放在页表基地址寄存器)
然后取出该条目中的物理页号
最后用该物理页号对应的物理起始地址加上虚拟地址中的页内偏移得到最终的物理地址
段页式内存管理
分段管理
优点: 很方便的按照逻辑模块实现信息的共享和保护
缺点: 容易产生外部碎片
分页管理
优点 内存空间利用率高,不会产生外部碎片,只会有少量页内碎片
缺点: 不方便按照逻辑模块实现信息的共享和保护
段页式内存管理
将地址空间按照程序自身的逻辑关系分为若干层,将各段分为大小相等的页面
将物理内存与虚拟内存划分为大小相等的一个个的内存块,系统以块为单位为进程分配内存
逻辑地址/虚拟地址(段号,页号,页内偏移量)
虚拟地址翻译为物理地址的步骤变为
根据逻辑地址取出其中的段号,判断这个段号是否正常
如果正常,则找到该段号对应的页表初始地址
根据页号是否正常,若正常则根据页号找到物理初始地址,在加上页内偏移量则找到真正的物理地址