高端内存

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内核高端内存