高端内存

Linux 高端内存是针对物理内存来说的,虚拟内存没有高端这个概念。Linux 系统将虚拟内存分为两个部分,即用户地址空间内核地址空间,对于 32 位系统来说,虚拟地址空间为 4GB,其中用户空间范围为 0-3GB,内核空间范围为 3-4GB。Linux 将 3GB 开始的内核虚拟地址空间的 896M 地址直接映射到物理地址空间的 0-896M,这部分是永久性映射,剩下的 128M 则可根据需要进行动态映射,也称临时性映射。如果没有动态映射,那么 1GB 的内核虚拟地址空间最多只能访问 1GB 的物理内存,那么如果物理内存大于 1GB,就会有一部分物理内存无法被内核访问到,显然不是我们想要的。因此,对于 32 位系统来说,高端物理内存是内核虚拟地址空间后 128M 可动态映射使内核得以访问的物理内存,用户空间虚拟地址也是映射到这部分物理内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
          ________________ _____    ________________
|Other KernelData|___ | | |
|----------------| | |__| |
| Kernel |\ |____| Real Other |
3 GB --->|----------------| \ | Kernel Data |
| |\ \ | |
| __|_\_\____|__ Real |
| Tasks | \ \ | Tasks |
| __|___\_\__|__ Space |
| | \ \ | |
| | \ \|----------------|
| | \ |Real KernelSpace|
|________________| \|________________|

Logical Addresses Physical Addresses

启动参数”mem=”

1
mem=255M@0x0 mem=256M@0x30000000

内核解析:

1
early_param("mem", early_parse_mem);

file:arch/mips/kernel/setup.c

mem 参数由 early_parse_mem 函数处理。每一个 mem=size@addr 格式的参数,表示从 addr地址(物理地址)开始的 size 大小的内存区域。如果没有”@addr” 则默认起始地址为 0

参考

  1. Linux 内核高端内存