基本概念

内存管理基础

内存管理是操作系统的核心功能之一,负责管理计算机的主存储器,为进程分配和回收内存空间,确保内存的安全使用。

程序装入与链接

程序装入过程

程序从外存调入内存的过程称为程序装入,主要包括以下步骤:

  1. 编译阶段:将源代码编译成目标代码
  2. 链接阶段:将多个目标模块链接成可执行程序
  3. 装入阶段:将可执行程序装入内存

链接方式

1. 静态链接

// 编译时链接所有库函数
gcc -static program.c -o program
  • 优点:执行速度快,不依赖外部库
  • 缺点:可执行文件大,内存利用率低

2. 动态链接

// 运行时链接库函数
gcc program.c -o program
  • 优点:节省内存,便于库函数更新
  • 缺点:执行速度稍慢,依赖外部库

3. 运行时动态链接

// 程序运行时根据需要加载库
dlopen("libmath.so", RTLD_LAZY);

装入方式

1. 绝对装入

  • 程序装入到指定的绝对地址
  • 适用于单道程序系统
  • 地址在编译时确定

2. 可重定位装入

  • 程序装入到内存的任意位置
  • 需要重定位寄存器
  • 支持多道程序设计

3. 动态运行时装入

  • 程序在运行时才确定装入位置
  • 支持虚拟内存管理
  • 地址转换延迟到访问时进行

逻辑地址与物理地址空间

地址空间概念

逻辑地址空间:

  • 由 CPU 生成的地址
  • 从 0 开始的连续地址空间
  • 程序员可见的地址

物理地址空间:

  • 内存单元的实际地址
  • 可能不连续
  • 硬件可见的地址

地址转换过程

逻辑地址
地址转换机构
物理地址

地址转换机构:

  1. 重定位寄存器:基址寄存器
  2. 页表:分页系统中的地址映射
  3. 段表:分段系统中的地址映射

地址转换示例

基址重定位:

// 逻辑地址:1000
// 基址寄存器:5000
// 物理地址 = 逻辑地址 + 基址 = 1000 + 5000 = 6000

分页地址转换:

// 逻辑地址:0x1234
// 页号:0x12,页内偏移:0x34
// 通过页表查找物理块号
// 物理地址 = 物理块号 × 页大小 + 页内偏移

内存保护

保护机制

1. 界限寄存器保护

// 基址寄存器:5000
// 界限寄存器:2000
// 有效地址范围:[5000, 7000)
if (address < base || address >= base + limit) {
    // 地址越界,产生保护性中断
    raise_protection_fault();
}

2. 页表保护位

typedef struct {
    int frame_number;    // 物理块号
    int valid;          // 有效位
    int read;           // 读权限
    int write;          // 写权限
    int execute;        // 执行权限
} PageTableEntry;

3. 段表保护位


术语对照表

中文术语英文术语缩写说明
内存管理Memory Management-内存的分配、回收、保护
逻辑地址Logical Address-程序使用的地址
物理地址Physical Address-实际内存的地址
地址转换Address Translation-逻辑地址到物理地址的映射
重定位Relocation-程序装入时的地址调整
静态重定位Static Relocation-装入时完成地址转换
动态重定位Dynamic Relocation-执行时完成地址转换
程序装入Program Loading-将程序装入内存
程序链接Program Linking-链接目标模块
静态链接Static Linking-装入前完成链接
动态链接Dynamic Linking-装入时或运行时链接
运行时动态链接Run-Time Dynamic Linking-运行时按需链接
内存保护Memory Protection-防止进程越界访问
基址寄存器Base Register-存放进程起始地址
界限寄存器Limit Register-存放进程地址空间大小
上下界寄存器Base and Bound Register-基址和界限寄存器
存储保护键Storage Protection Key-内存保护机制
交换Swapping-进程在内存和外存间换入换出
紧凑Compaction-移动进程合并空闲区
碎片Fragmentation-无法利用的小内存块
内部碎片Internal Fragmentation-分配单元内的浪费
外部碎片External Fragmentation-分配单元外的浪费
虚拟地址空间Virtual Address Space-进程的逻辑地址空间

发现内容有问题?

告诉我们哪里需要改进。