长篇预警
一、内存管理背景
内存是现代计算机运行的中心,它是由字或字节组成,每个字或字节都有自己的地址。
基本硬件
程序必须装入内存才能被执行;
CPU可以直接访问的存储器只有主存、高速缓存和寄存器;
寄存器通常可在1个(或少于1个)CPU时钟周期内完成访问,完成主存访问可能需要多个CPU时钟周期;
CPU暂停(Stall):在读取内存数据时,CPU空闲;
在内存和CPU之间,增加高速内存,来协调速度差异,这种内存缓冲区称为高速缓存Cache;
内存保护需要保证正确的操作。
独立运行内存空间
确保进程可访问的合法地址范围,并确保进程只访问其合法地址。
两个寄存器实现进程保护:
- 基址寄存器(Base)
进程最小的合法物理内存地址 - 界限寄存器(Limit)
进程地址的长度 - CPU在执行指令时,需要进行地址合法性检验
合法的地址应该是大于等于基址寄存器的值,小于基址与界限寄存器的值之和。否则将陷入操作系统内核,作为寻址错误处理。
指令和数据绑定到内存
程序以二进制可执行文件的形式存储在磁盘上,为了执行,程序被调入内存并放在进程空间内。
地址绑定(重定位):在秩序装入内存时,把程序中的相对地址转换为内存中的绝对地址的过程。
指令和数据绑定到内存地址可在三个不同阶段:
- 编译时期(Compile time)
如果内存位置已知,可生成绝对代码;
如果开始位置改变,需要重新编译代码 - 加载时期(Load time)
如果存储位置在编译时不知,则必须生成可重定位(relocatable)代码 - 执行时期(Execution time)
如果进程执行时可在内存移动,则地址绑定可延迟到运行时;
需要硬件对地址映射的支持(例如基址和限长寄存器)
逻辑地址和物理地址
逻辑地址:
由CPU产生,在进程内的相对地址,也称虚拟地址、相对地址、程序地址;
物理地址:
内存地址,所有内存统一编址,也称绝对地址、实地址。
编译和加载时的地址绑定生成相同的逻辑地址和物理地址,此时重定位是静态的;但执行时的地址绑定导致不同的逻辑地址和物理地址,此时的重定位称为动态重定位。
由程序所生成的所有逻辑地址的集合称为逻辑地址空间,与这些逻辑地址所对应的所有物理地址的集合称为物理地址空间。
逻辑地址空间绑定到物理地址空间这一概念至关重要,是正确进行内存管理的中心。
内存管理单元(MMU)
运行时,从虚拟地址到物理地址的映射是由一个硬件设备来完成的。该硬件称为内存管