一、前置概念
实模式:直接操作物理内存。每次只能运行一个程序,不安全;最大使用内存1M,限制太大。
保护模式:虚拟地址被转换为物理地址,要有页表。
装载器:把指令和数据加载到内存运行。要满足两个条件:
- 1)可执行程序加载后占用内存空间应该是连续的。
- 2)我们需要同时加载很多个程序,并且不能让程序自己规定在内存中加载的位置。
那就是我们可以在内存里面,找到一段连续的内存空间,然后分配给装载的程序,然后把这段连续的内存空间地址,和整个程序指令里指定的内存地址做一个映射。
二、分段分页
分段分页都是操作系统发展过程中为了更好地使用内存资源。
2.1 直接映射(为物理地址)
问题:
- 1)进程地址空间不隔离。不小心程序数据被修改,导致运行异常。
- 2)内存使用效率低。内存碎片需将运行数据暂时拷贝到硬盘,再重装入内存,效率十分低下。
解决方法: 增加中间层,将虚拟地址映射为物理内存地址。
2.2 分段含义、优劣
段: 系统分配出来的连续内存空间。
分段: 找出连续物理内存和虚拟内存地址映射的方法。
优劣: 解决了程序本身不需要关系具体物理内存的问题,同时带来内存碎片的问题。
补充:
优:没内部碎片、重定位段比整个地址空间更容易;
劣:有外部碎片、很难将连续内存分配给可变大小分区、昂贵的内存管理算法。
内存交换:可解决内存不连续的问题,将内存写到硬盘,重新加载,让剩下的内存空间连续。
Linux的swap分区就是作用。但硬盘访问速度太慢,会有性能瓶颈,机器可能出现卡顿。
段表存储在线性地址空间,而页表则保存在物理地址空间。
2.3 分页
页: 切成的连续且尺寸固定的内存空间。
分页: 分段导致内存碎片和交换空间太大,为了让交换写入的数据更少,出现了内存分页。
- 和分段相比,分页把(虚拟/物理)整块内存切成一段段固定尺寸的大小内存存储单元。
缺页错误: 操作系统读取特定页,发泄数据没加载到物理内存(缓存未命中),就会触发CPU Page Fault。
三、虚拟地址和物理地址
3.1 含义
虚拟内存地址(Virtual Memory Address
):指令里用到的内存地址。
定义的虚拟地址空间是连续,使程序编写难度降低。因为每个进程都提供了一个一致的、私有的、连续完整的地址空间,让每个进程都产生了一种自己在独享主存的错觉。
物理内存地址(Physical Memory Address
):实际内存硬件里面的空间地址,它是真实的物理地址
3.2 地址转换
内存管理单元 - MMU(Memory Management Unit
):将虚拟地址转换为物理地址,借助存放在内存中的页表动态翻译虚拟地址。
页表:将虚拟内存地址映射到物理内存地址的映射表,能将虚拟内存里的页一一映射到物理内存里面。
地址变换高速缓冲/快表 - TLB(Translation lookaside buffer
):存储当前最可能被访问到的页表项,是部分页表项的一个副本,减少了因MMU导致的处理器性能下降。
页号(Directory
)和偏移量(Offset
) 可用来计算内存地址转换,步骤:
- S1:把虚拟内存地址切分成页号和偏移量的组合;
- S2:从页表里,查询出虚拟页号对应物理页号;
- S3:拿物理页号+偏移量,就得到了物理内存地址。
多级页表:
-
问题:数字范围: