#+STYLE: <link rel="stylesheet" href="../css/zenburn-emacs.css" type="text/css" />
物理内存的管理
Kernel 获取物理内存布局
参考 Detecting Memory (x86), BIOS 一般提供了两个指令获取内存布局
- INT 0x12 该指令返回小于 1M 的可用内存
- INT EAX=0XE820 该指令返回一个列表, 每个列表包括: 基地址, 长度, 类型
BIOS 返回的内存类型:
- Type 1: Usable (normal) RAM
- Type 2: Reserved - unusable
- Type 3: ACPI reclaimable memory
- Type 4: ACPI NVS memory
- Type 5: Area containing bad memory
成功获取内存布局后, OS 一般做以下处理: 排序, 合并相邻区域, 修改覆盖的区域 (比如某个区域同时有2和3的内存类型, 把该区域修改为3的), 修改未知区域的类型为2
例如在 Linux 内核中, 会把最后的内存布局打印出来:
$ dmesg # 6G 的内存
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
[ 0.000000] BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
[ 0.000000] BIOS-e820: 0000000000100000 - 00000000bfe08c00 (usable)
[ 0.000000] BIOS-e820: 00000000bfe08c00 - 00000000bfe5cc00 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000bfe5cc00 - 00000000bfe5ec00 (ACPI data)
[ 0.000000] BIOS-e820: 00000000bfe5ec00 - 00000000c0000000 (reserved)
[ 0.000000] BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
[ 0.000000] BIOS-e820: 00000000fec00000 - 00000000fed00400 (reserved)
[ 0.000000] BIOS-e820: 00000000fed20000 - 00000000feda0000 (reserved)
[ 0.000000] BIOS-e820: 00000000fee00000 - 00000000fef00000 (reserved)
[ 0.000000] BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved)
[ 0.000000] BIOS-e820: 0000000100000000 - 00000001bc000000 (usable)