Linux 系统的内存分布结构及其之间的关系
Linux 系统的内存分布结构(memory layout / memory organization)是理解操作系统内核、驱动、应用程序内存管理的基础之一。下面将从宏观到微观、从物理内存到虚拟内存的角度,系统地梳理整个结构。
一、整体框架:物理内存 vs 虚拟内存
| 类型 | 说明 | 典型范围(x86_64) |
|---|---|---|
| 物理内存(Physical Memory) | 实际存在的内存条上的存储空间 | 0x0000_0000 ~ 物理 RAM 最大地址 |
| 虚拟内存(Virtual Memory) | 每个进程或内核看到的逻辑地址空间,由 MMU 映射到物理内存 | 用户态通常 0x0000_0000_0000_0000 ~ 0x0000_7fff_ffff_ffff |
Linux 中每个进程看到的虚拟内存空间都是独立的,通过 页表(Page Table) 映射到共享的物理内存。
二、Linux 内核视角下的内存布局
(1)物理内存布局
在 Linux 启动后,物理内存被划分为以下几个区域(在 /proc/zoneinfo 可以看到):
| 区域名 | 作用 | 对应体系结构 |
|---|---|---|
| ZONE_DMA | 旧式设备需要的低端物理内存(<16MB) | x86 等老平台 |
| ZONE_DMA32 | 需要 32 位地址的 DMA 设备使用(<4GB) | x86_64 平台 |
| ZONE_NORMAL | 普通内存区,内核直接映射 | 通常从 4GB 开始 |
| ZONE_HIGHMEM | 高端内存,内核需要临时映射才能访问(32 位系统) | 仅 32 位平台 |
在 64 位 Linux 系统上,通常没有 HIGHMEM,因为虚拟地址空间够大,全部物理内存都可以直接映射。
(2)虚拟地址空间布局(内核空间)
Linux 内核的虚拟地址空间分为:
| 区域 | 作用 | 典型地址(x86_64) |
|---|---|---|
| 内核空间 (kernel space) | 共享于所有进程,由内核使用 | ffff800000000000 ~ ffffffffffffffff |
| 直接映射区 (direct mapping region) | 将所有物理内存映射到虚拟空间 | 通常 ffff888000000000 开始 |
| vmalloc 区 | 动态分配非连续物理内存的虚拟区域 | ffffc90000000000 ~ |


