程序所见的内存
程序中的一个地址,并不必然就是内存芯片上的同号位置。虚拟内存为运行中的进程提供地址空间,使代码、堆、栈等内容可以按程序使用的地址组织,而实际存放位置由系统安排。操作系统与硬件在访问时把虚拟地址转换为物理地址,从而在同一台机器的内存上支持多个进程。
这一抽象首先解决的是寻址与管理问题,而非容量不足问题。即使所有正在使用的页面都留在物理内存中,虚拟地址空间、地址转换和访问保护仍然发挥作用。地址空间能够很大,并不表示其中每一个地址都有效,更不表示系统已经为全部地址分配了物理内存。
页表如何连接两个空间
分页把虚拟地址空间划成固定大小的页,把物理内存划成相应大小的页框。一个进程中相邻的虚拟页可以映射到不相邻的页框,因此不必为整个进程寻找连续的物理区域。页表保存这些映射以及访问所需的状态信息。
转换时,虚拟地址被分成虚拟页号与页内偏移。系统用页号查得物理页框号,保留偏移后形成物理地址。页表本身也需要内存;若每次访问都重新查表,转换还会带来时间开销。常用的转换后备缓冲器(TLB)缓存地址转换结果,减少反复查询页表的成本。
映射也是保护边界
不同进程可以使用相同的虚拟地址数值,却通过各自的映射访问不同的物理内容。权限信息进一步约束读取、写入和执行,使普通程序不能仅靠猜测地址就任意修改其他进程或操作系统的内存。受控共享仍可由系统安排,并不与隔离目标矛盾。
必须区分地址无效、访问权限不足和合法页面暂不驻留内存。它们都可能使普通访问流程转入操作系统,但处理结果不同:非法访问不能靠调入一页就变成合法访问。具体硬件的状态位安排也不同,系统有时需要结合页表之外的记录判断原因。
按需分页与容量边界
按需分页允许程序只在真正访问某页时才把所需内容调入内存。访问合法但不驻留的页面会引发缺页处理;若内容位于外部存储,操作系统读取它、更新映射,再让指令继续执行。内容可能来自交换区,也可能来自原有的程序文件,因此缺页不应简单理解为读取交换文件。
这种机制让驻留内存的内容与整个地址空间分离,但没有消除资源限制。外部存储访问远慢于内存访问,频繁调页会付出明显代价。虚拟内存提供的是受管理的地址与存储抽象,不是无限容量,也不是把磁盘变成同样快速的内存。
参考:[3]