Skip to content

408

操作系统

OS-03-01 内存管理基础(逻辑地址/物理地址/地址转换)


一、定位信息

  • 所属圈层:核心层
  • 前置知识回顾:理解计算机硬件基本组成,知道CPU执行指令时需要从内存中取数据和指令。了解内存是一段连续的线性存储空间,每个存储单元有唯一编号(地址)。
  • 知识网络位置:本单元是内存管理的起始点,为后续连续分配、非连续分配、虚拟内存等所有内存管理机制提供基础概念框架。向上承接"进程管理"中进程的内存需求,向下展开各种具体的内存分配与回收策略。
  • 考点热度等级H级(高频重点)——地址转换是几乎所有内存管理题目的基础,近五年真题中几乎每年都有涉及。

二、知识点讲解

2.1 逻辑地址与物理地址

物理地址(Physical Address) 是内存硬件中每个存储单元的真实编号,是CPU最终访问内存时使用的地址。物理地址空间由实际安装的内存大小决定,例如一台机器有4GB内存,物理地址空间为 023210 \sim 2^{32}-1

逻辑地址(Logical Address),也称虚拟地址,是程序中使用的地址。程序员在编写代码时看到的地址都是逻辑地址,例如C语言中的指针变量存储的就是逻辑地址。每个进程拥有独立的逻辑地址空间,从0开始编址,互不干扰。

为什么需要区分? 如果程序直接使用物理地址,会带来两个严重问题:①程序加载到内存的位置不同,地址需要重写,无法做到"一次编写,到处运行";②多个进程的地址空间无法隔离,安全性差。引入逻辑地址后,操作系统通过地址转换机制将逻辑地址动态映射到物理地址,实现进程隔离和内存灵活分配。

2.2 地址转换(重定位)

将逻辑地址转换为物理地址的过程称为地址转换重定位(Relocation)。根据转换时机不同,分为:

静态重定位:在程序装入内存时一次性完成地址转换,将所有逻辑地址加上程序在内存中的起始地址。优点是实现简单,不需要硬件支持;缺点是程序装入后不能移动,无法实现虚拟内存。

动态重定位:在程序执行过程中,每访问一次内存就进行一次地址转换。需要硬件支持——基址寄存器(Base Register)限长寄存器(Limit Register)。CPU发出逻辑地址后,硬件自动检查:若逻辑地址 < 限长寄存器的值,则物理地址 = 基址寄存器 + 逻辑地址;否则产生越界中断。动态重定位允许程序在内存中移动(只需修改基址寄存器),是现代操作系统的基础。

2.3 地址转换过程

以动态重定位为例,完整的地址转换流程为:

  1. CPU执行指令,发出逻辑地址
  2. 硬件检查:逻辑地址是否 < 限长寄存器值?
    • 否 → 产生越界中断,终止进程
    • 是 → 继续
  3. 计算物理地址:物理地址 = 基址寄存器值 + 逻辑地址
  4. 用物理地址访问内存,获取数据

三、记忆与理解辅助

1. 类比记忆法:把逻辑地址想象成"房间号"(酒店3楼301室),物理地址想象成"GPS坐标"(经纬度)。酒店前台(操作系统)根据登记表(基址寄存器)帮你把房间号转换成实际位置。不同酒店(进程)可能有相同的房间号,但GPS坐标不同。

2. 口诀:"逻辑是程序用,物理是硬件找;静态装入定死位,动态执行随时调;基址加偏移,限长防越界。"

3. 对比总结表

对比项静态重定位动态重定位
转换时机程序装入时程序执行时
硬件支持不需要需要(基址/限长寄存器)
程序可否移动不可以可以
能否实现虚拟内存不能
实现复杂度简单较复杂

4. 逻辑地址 vs 物理地址对比

对比项逻辑地址物理地址
使用者程序(CPU发出)内存硬件
空间大小由程序决定由实际内存决定
是否可变每个进程独立固定不变
编址起点从0开始从0到最大物理内存

四、例题与精解

例题1(基础巩固)

题目:某系统采用动态重定位方式管理内存。某进程被分配到内存起始地址为 40004000,限长寄存器值为 20002000。当CPU发出逻辑地址 15001500 时,物理地址是多少?若发出逻辑地址 25002500,会发生什么?

命题意图:考查动态重定位的基本计算和越界检查机制。

精解

1. 审题分析:已知基址 = 4000,限长 = 2000。逻辑地址1500和2500分别需要判断是否越界并计算物理地址。

2. 解题思路:先检查逻辑地址是否 < 限长,若满足则物理地址 = 基址 + 逻辑地址;否则越界中断。

3. 完整步骤

  • 逻辑地址 150015001500<20001500 < 2000(限长),未越界。物理地址 = 4000+1500=55004000 + 1500 = 5500
  • 逻辑地址 25002500250020002500 \geq 2000(限长),越界!操作系统产生越界中断,终止该进程的此次访问。

4. 方法反思:动态重定位的关键在于两个寄存器的配合——基址负责"定位",限长负责"保护"。考试中务必先检查越界,再计算物理地址,顺序不可颠倒。

例题2(中等提升)

题目:某系统内存大小为 64KB64\text{KB},采用基址寄存器和限长寄存器进行动态重定位。现有三个进程A、B、C,其内存分配情况如下:

  • 进程A:基址 = 00,限长 = 10KB10\text{KB}
  • 进程B:基址 = 15KB15\text{KB},限长 = 20KB20\text{KB}
  • 进程C:基址 = 40KB40\text{KB},限长 = 15KB15\text{KB}

(1)画出内存分配示意图(文字描述)。 (2)进程B访问逻辑地址 18KB18\text{KB} 时,物理地址是多少? (3)若进程A要从 10KB10\text{KB} 的数据区移动到 35KB35\text{KB} 处,需要修改什么?

命题意图:综合考查地址转换计算和动态重定位的优势理解。

精解

1. 审题分析:需要理解三个进程在内存中的分布,进行地址转换计算,并理解程序移动时的处理。

2. 解题思路:画图明确内存分布 → 逐一计算 → 分析移动操作。

3. 完整步骤

(1)内存分布(文字描述):

  • 地址 010KB10 \sim 10\text{KB}-1:进程A
  • 地址 10KB14KB110\text{KB} \sim 14\text{KB}-1:空闲
  • 地址 15KB35KB115\text{KB} \sim 35\text{KB}-1:进程B
  • 地址 35KB39KB135\text{KB} \sim 39\text{KB}-1:空闲
  • 地址 40KB55KB140\text{KB} \sim 55\text{KB}-1:进程C
  • 地址 55KB64KB155\text{KB} \sim 64\text{KB}-1:空闲

(2)进程B访问逻辑地址 18KB18\text{KB}

  • 检查:18KB<20KB18\text{KB} < 20\text{KB}(限长),未越界 ✓
  • 物理地址 = 15KB+18KB=33KB15\text{KB} + 18\text{KB} = 33\text{KB}

(3)进程A移动到 35KB35\text{KB} 处:

  • 只需将进程A的基址寄存器00 修改为 35KB35\text{KB},限长寄存器不变(仍为 10KB10\text{KB}
  • 程序代码本身不需要修改,因为地址转换在执行时动态完成

4. 方法反思:动态重定位的核心优势就体现在第(3)问——程序可以"搬家"而不需要修改程序本身,只需修改OS维护的基址寄存器值。这是静态重定位做不到的。


五、考情分析

  • 考查频次:地址转换相关知识在近5年真题中出现频率极高,几乎每年都有至少1道选择题涉及。
  • 常见题型:选择题(判断地址是否越界、计算物理地址)为主,偶尔出现在综合题中作为内存管理大题的第一小问。
  • 分值占比:单题通常2分(选择),作为大题子问题时3-5分。
  • 命题趋势:近年来倾向于将地址转换与分页、分段管理结合考查,单纯的基址/限长计算题减少,但理解本概念是解答更复杂题目的前提。基于大纲与命题规律推测

六、易错点提醒

  1. 错误表现:计算物理地址时直接相加,忘记检查越界。 错误原因:忽略限长寄存器的保护功能,只关注基址寄存器的定位功能。 正确理解/做法:动态重定位包含两步——先检查(逻辑地址 < 限长),后计算(物理地址 = 基址 + 逻辑地址)。考试中必须两步都写。

  2. 错误表现:混淆逻辑地址和物理地址的概念,在题目中无法区分哪个是哪个。 错误原因:对"谁发出的地址"理解不清。 正确理解/做法:记住——CPU发出的是逻辑地址,最终到内存总线上的是物理地址。题目中说"CPU访问地址X",X是逻辑地址;说"内存单元X",X是物理地址。

  3. 错误表现:认为静态重定位和动态重定位的区别只是"时间不同",忽略其对程序可移动性的影响。 错误原因:对静态重定位"一次性修改地址"的后果理解不深。 正确理解/做法:静态重定位在装入时将逻辑地址写死为物理地址,装入后程序中的地址已经是物理地址了,移动程序意味着这些地址全部失效,所以不能移动。动态重定位在执行时才转换,程序中始终保存逻辑地址,移动只需改基址寄存器。


七、来源标注

  • 依据2026考研统考408大纲
  • 依据《操作系统概念》(Operating System Concepts, Silberschatz)第8章
  • 依据汤小丹《计算机操作系统》第4版第3章

考研全科复习资料 - 基于2026考研统考大纲