第11章:物理内存管理

本章概述

内存是操作系统管理的最重要资源之一。本章将实现物理内存管理器——检测可用内存、跟踪内存使用状态,并提供 kmalloc/kfree 接口。

学习目标

  • 理解物理内存的组织方式
  • 通过多种方式检测可用内存
  • 实现位图(Bitmap)内存分配器
  • 实现 kmalloc 和 kfree
  • 理解内存碎片问题

前置知识

  • 基本的数据结构概念(位图、链表)
  • 位运算
  • 前几章的内核基础设施

知识要点

物理内存布局(典型PC)

0x00000000 ┌─────────────────────────┐
           │  实模式IVT + BIOS数据   │  1 KB
0x00000400 ├─────────────────────────┤
           │  可用内存               │
0x00007C00 ├─────────────────────────┤
           │  bootloader             │  512 bytes
0x00007E00 ├─────────────────────────┤
           │  可用内存               │
0x00001000 ├─────────────────────────┤
           │  内核加载位置           │
           │  ...                   │
0x0009FC00 ├─────────────────────────┤
           │  扩展BIOS数据区         │  ~1 KB
0x000A0000 ├─────────────────────────┤
           │  VGA显存               │  128 KB
0x000C0000 ├─────────────────────────┤
           │  BIOS ROM              │  256 KB
0x00100000 ├─────────────────────────┤
           │  扩展内存(可用)       │  ← 大部分可用内存在这里
           │  ...                   │
           └─────────────────────────┘

分配策略

我们使用位图分配器:

  • 将物理内存划分为4KB大小的页帧(page frame)
  • 每个页帧用1个bit表示使用状态
  • 128MB内存只需要 128MB / 4KB / 8 = 4KB 的位图

文件结构

11-物理内存管理/
├── README.md           ← 本文件
├── 理论讲解.md          ← 内存管理理论
├── code/
│   ├── pmm.h           ← 物理内存管理器接口
│   ├── pmm.c           ← 位图分配器实现
│   ├── kernel.c        ← 更新:集成PMM
│   ├── Makefile
│   └── [共享文件]
├── 常见错误.md
└── 练习题.md

构建与测试

cd code
make
make run

本章收获

  • ✅ 物理内存检测与映射
  • ✅ 页帧级别的内存分配与释放
  • ✅ kmalloc/kfree 内核内存分配接口