操作系统中的“静态重定位”和“动态重定位”
目录
在操作系统中,静态重定位和动态重定位是两种不同的地址转换技术,用于将程序的逻辑地址(相对地址)映射到物理内存的实际地址。它们的核心区别在于地址转换的时机和灵活性,直接影响内存管理的效率和多道程序设计的支持。
1. 静态重定位(Static Relocation)
特点
- 时机:在程序装入内存时一次性完成地址转换(由装入程序完成)。
- 修改内容:程序中的所有逻辑地址(如指令、数据地址)被直接修改为物理地址。
- 硬件支持:无需额外硬件机制,完全由软件(装入器)处理。
- 限制:一旦装入内存,程序不能移动,否则所有物理地址会失效。
工作流程
- 编译时:程序生成逻辑地址(从0开始)。
- 装入时:装入器根据程序在内存的起始位置(基地址),将逻辑地址全部转换为物理地址:
物理地址 = 逻辑地址 + 基地址 - 运行时:CPU直接使用物理地址访问内存。
优点
- 实现简单,无需运行时硬件支持。
- 适合早期单道批处理系统。
缺点
- 无法移动程序:若程序需要换出或内存紧缩(Compaction),必须重新装入并重定位。
- 内存利用率低:无法支持多道程序动态共享内存。
- 安全性差:程序直接访问物理地址,可能破坏其他进程数据。
示例
- 程序逻辑地址空间:
0x0000~0x0FFF - 装入内存的基地址:
0x3000 - 静态重定位后,所有地址被修改为
0x3000~0x3FFF。
2. 动态重定位(Dynamic Relocation)
特点
- 时机:在程序运行时通过硬件机制(如基址寄存器)实时转换地址。
- 修改内容:逻辑地址不直接修改,由硬件在每次内存访问时动态计算物理地址。
- 硬件支持:需要MMU(内存管理单元)和专用寄存器(如基址寄存器、界限寄存器)。
- 灵活性:程序可动态移动(只需更新基址寄存器),支持多道程序设计。
工作流程
- 编译时:程序生成逻辑地址(从0开始)。
- 装入时:操作系统记录程序的基地址和长度,存入进程控制块(PCB)。
- 运行时:
- CPU发出的逻辑地址由硬件自动转换为物理地址:
物理地址 = 逻辑地址 + 基址寄存器值 - 硬件同时检查逻辑地址是否越界(通过界限寄存器)。
- CPU发出的逻辑地址由硬件自动转换为物理地址:
优点
- 支持多道程序:多个进程可动态共享内存。
- 程序可移动:通过修改基址寄存器即可调整位置(如内存紧缩后)。
- 安全性高:界限寄存器防止越界访问。
缺点
- 需要硬件支持(MMU),增加系统复杂度。
- 每次内存访问需地址转换,可能轻微影响性能(现代CPU通过TLB缓存优化)。
示例
- 程序逻辑地址:
0x0100 - 基址寄存器值:
0x3000 - 动态重定位后的物理地址:
0x3100。
关键对比
| 特性 | 静态重定位 | 动态重定位 |
|---|---|---|
| 转换时机 | 程序装入时 | 程序运行时(每条指令执行时) |
| 硬件支持 | 无需 | 需要MMU和基址/界限寄存器 |
| 程序移动性 | 不可移动 | 可动态移动(修改基址寄存器) |
| 多道程序支持 | 不支持 | 支持 |
| 安全性 | 低(直接访问物理地址) | 高(硬件检查越界) |
| 典型应用 | 早期单道批处理系统 | 现代通用操作系统(如Linux、Windows) |
补充:动态重定位的硬件实现
现代操作系统通常结合分页或分段机制进一步优化动态重定位:
- 基址-界限寄存器:简单动态重定位的基础(如早期系统)。
- 分页机制:通过页表将逻辑地址映射到任意物理页帧,支持虚拟内存。
- 分段机制:为每个逻辑段(代码、数据等)分配独立的基址和长度。
总结
- 静态重定位简单但僵化,适合单任务环境;
- 动态重定位灵活高效,是现代多任务操作系统的基石。
动态重定位的硬件支持(如MMU)是实现虚拟内存、进程隔离和安全性的关键技术。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号