内存布局图
实模式(16位)内存布局
0x00000000 ┌──────────────────────┐
│ 中断向量表 (IVT) │ 1KB
0x00000400 ├──────────────────────┤
│ BIOS数据区 (BDA) │ 256B
0x00000500 ├──────────────────────┤
│ │
│ 可用内存 │
│ (Bootloader栈区) │ ← SP从0x7C00向下增长
│ │
0x00007C00 ├──────────────────────┤
│ 引导扇区 (512B) │ ← 我们的Bootloader
0x00007E00 ├──────────────────────┤
│ │
│ 可用内存 │
│ │
0x0009FFFF ├──────────────────────┤
│ │
0x000A0000 ├──────────────────────┤
│ VGA显存 (128KB) │ ← 0xA0000-0xBFFFF
0x000C0000 ├──────────────────────┤
│ BIOS ROM │
0x000FFFFF ├──────────────────────┤
│ × 无法访问 × │ ← 实模式只能访问到1MB
└──────────────────────┘
保护模式(32位)内存布局
0x00000000 ┌──────────────────────┐
│ 中断向量表 (IVT) │
0x00000400 ├──────────────────────┤
│ BIOS数据区 │
0x00000500 ├──────────────────────┤
│ 可用内存 │
0x00001000 ├──────────────────────┤
│ 内核加载区 │ ← 我们把内核放在这里
│ │
0x00007C00 ├──────────────────────┤
│ 引导扇区 │
0x00007E00 ├──────────────────────┤
│ 可用内存 │
│ │
0x00090000 ├──────────────────────┤
│ 32位模式的栈 │ ← ESP = 0x90000,向下增长
│ │
0x000A0000 ├──────────────────────┤
│ VGA显存 │
0x000B8000 │ └─ 文本模式显存 │ ← 我们在这里写字符
0x000C0000 ├──────────────────────┤
│ BIOS ROM │
0x00100000 ├──────────────────────┤ ← 1MB 边界
│ │
│ 扩展内存 │ ← 现在可以访问了!
│ (内核最终会搬到这里) │
│ │
0xFFFFFFFF └──────────────────────┘ ← 4GB 边界
关键地址
| 地址 | 用途 |
|---|
0x0000 | 内存起始 |
0x1000 | 内核加载位置(我们选的) |
0x7C00 | 引导扇区(BIOS规定) |
0x90000 | 32位模式栈顶 |
0xB8000 | VGA文本模式显存 |
0x100000 | 1MB边界(扩展内存起始) |