几种不同的装入方式
静态装入
定义:程序在编译链接后,将完整的可执行映像一次性装入内存,且在程序运行期间不再进行装入操作。需要在编程阶段就把物理地址计算好。
静态重定位(Static Relocation)或可重定位
定义:静态重定位是在装入时,由链接器(linker)或装载器(loader)将程序中的逻辑地址转换为物理地址。装入后不能改变。
动态重定位(Dynamic Relocation)
定义:动态重定位是在程序执行时再决定装入的地址并装入,装入后有可能换出,所以同一个模块在内存中的物理地址有可能改变。需要硬件支持(如内存管理单元 MMU)。
装入方式比较
| 特性 | 静态装入 | 静态重定位 | 动态重定位 |
|---|---|---|---|
| 装入时机 | 执行前一次性装入 | 执行前地址转换 | 运行时动态转换 |
| 地址绑定时机 | 编译时/装入时 | 装入时 | 执行时 |
| 内存连续性要求 | 必须连续 | 必须连续 | 可不连续 |
| 程序移动能力 | 不可移动 | 不可移动 | 可移动 |
| 内存保护 | 无 | 弱 | 强 |
| 硬件需求 | 无特殊要求 | 无特殊要求 | 需要 MMU 支持 |
| 典型应用 | 简单嵌入式系统 | 早期单任务系统 | 现代操作系统 |
| 虚拟内存支持 | 不支持 | 不支持 | 支持 |
| 动态链接支持 | 不支持 | 不支持 | 支持 |
📌 页式存储管理
| 重定位方式 | 适用性分析 |
|---|---|
| 静态重定位 | ❌ 不适用。页式管理要求程序可分页加载到不连续的物理页框,静态重定位无法满足这种动态映射需求 |
| 动态重定位 | ✅ 最佳匹配。通过页表机制实现运行时地址转换,完美支持分页特性 |
📌 段式存储管理
| 重定位方式 | 适用性分析 |
|---|---|
| 静态重定位 | ⚠️ 有限适用。仅当所有段加载后不再移动时可用,但会丧失段式管理的灵活性 |
| 动态重定位 | ✅ 标准配置。段表机制天然支持动态重定位,允许段在内存中移动和共享 |
📌 段页式存储管理
| 重定位方式 | 适用性分析 |
|---|---|
| 静态重定位 | ❌ 完全不适用。段页式结合了两种动态特性,静态方式无法满足双重映射需求 |
| 动态重定位 | ✅ 必需方案。需要同时维护段表和页表,实现段级和页级的双重地址转换 |
关键结论:
- 现代操作系统普遍采用动态重定位
- 静态重定位仅适用于早期简单系统或特殊嵌入式场景
- 段页式管理必须依赖动态重定位硬件(如 MMU)
补充说明:动态重定位虽然实现复杂,但能完美支持虚拟内存、内存保护和共享等现代 OS 核心功能。