4G内存的32位系统,内核地址空间分配1G的情况下,为什么实际可用的低端内存只有800M左右?
在32位系统中,即使物理内存为4GB,但由于地址空间和硬件限制,实际可用的低端内存(low memory)只有大约800MB左右。以下我将详细解释其中的原因。
1. 32位地址空间的限制
1.1 32位系统的地址空间
-
虚拟地址空间: 在32位系统中,虚拟地址空间的范围是0x00000000到0xFFFFFFFF,总共4GB。
-
内核与用户空间的划分: 通常操作系统会将这4GB的虚拟地址空间划分为用户空间和内核空间。
- 常见的划分方式: 3GB用户空间(0x00000000 - 0xBFFFFFFF) + 1GB内核空间(0xC0000000 - 0xFFFFFFFF)。
1.2 虚拟地址空间与物理内存的映射
-
直接映射(Direct Mapping): 内核通常会将部分或全部物理内存直接映射到内核的虚拟地址空间中,以方便内核对物理内存的访问。
-
映射限制: 由于内核空间只有1GB,理论上最多只能直接映射1GB的物理内存。
2. 硬件保留的地址空间
2.1 内存映射I/O(Memory-Mapped I/O,MMIO)
-
硬件设备映射: 为了与硬件设备进行通信(如PCI设备,显卡等),系统会将一些物理地址空间保留用于内存映射I/O。
-
保留地址范围: 这些设备通常需要在物理地址空间的高端(接近4GB处)保留一定的地址范围。
2.2 BIOS和其他保留区域
- BIOS保留: 一些系统可能会在物理地址空间的顶部预留地址用于BIOS和系统管理模式。
2.3 物理内存的"重映射"问题
-
地址冲突: 当物理内存达到4GB时,内存条占用的物理地址范围会与设备需要的MMIO地址范围产生冲突。
-
内存覆盖: 为了防止冲突,系统需要将物理内存的高端部分(通常是3GB以上)进行"内存孔"(Memory Hole)处理,即这些物理地址范围的内存无法被正常使用。
3. Linux内核的内存管理
3.1 低端内存和高端内存
-
低端内存(Low Memory): 可以直接映射到内核虚拟地址空间的物理内存区域。
-
高端内存(High Memory): 不能直接映射,需要通过动态映射(如kmap等)才能访问的物理内存区域。
3.2 内核虚拟地址空间的限制
-
直接映射限制: 由于内核空间只有1GB,且需要预留一部分用于其它用途(如永久内核映射、模块、设备映射等),实际用于直接映射物理内存的空间小于1GB。
-
典型划分:
-
直接映射区域: 从0xC0000000开始,大小小于1GB。
-
vmalloc区域: 用于内核动态分配的非连续内存。
-
固定映射区域(fixmap): 用于映射固定地址的设备。
-
-
3.3 内核需要的地址空间
-
内核自身占用: 内核代码、数据、栈、内核模块等会占用部分虚拟地址空间。
-
内核数据结构: 页表、slab缓存、内核堆等。
-
设备映射: 内存映射I/O设备也需要占用虚拟地址空间。
4. 实际可用的低端内存为何只有约800MB
4.1 内核直接映射物理内存的区域
-
实际映射大小: 由于上述原因,内核可用于直接映射物理内存的虚拟地址空间小于1GB,通常在800MB左右。
-
示例计算:
-
内核虚拟地址空间: 1GB(0xC0000000 - 0xFFFFFFFF)。
-
减去内核自身占用和保留区域:
-
内核代码和数据: 可能占用几十MB。
-
vmalloc区域: 通常预留128MB或更多。
-
fixmap区域: 预留固定大小。
-
设备映射区域: 需要预留空间。
-
-
剩余用于直接映射物理内存的空间: 大约800MB。
-
4.2 物理内存与虚拟地址空间的对应
-
物理内存的上限: 由于内核只能直接映射约800MB的物理内存,因此对于超过这一容量的物理内存,内核不能将其视为低端内存。
-
高端内存的处理: 超过直接映射范围的物理内存被视为高端内存,需要通过kmap等方式映射后才能访问。
5. 总结
-
32位地址空间限制: 虚拟地址空间总共4GB,内核和用户空间需要共享这4GB地址空间。
-
内核虚拟地址空间有限: 内核通常只能使用1GB的虚拟地址空间,其中直接用于映射物理内存的空间小于1GB。
-
硬件设备地址占用: 硬件设备的MMIO需要占用物理地址空间,导致部分物理内存无法使用。
-
实际可用低端内存约800MB: 由于以上限制,内核只能直接映射并使用约800MB的物理内存,剩余的物理内存被视为高端内存或无法使用。
6. 解决办法
6.1 启用PAE(Physical Address Extension)
-
PAE技术: 允许32位系统支持超过4GB的物理内存,通过扩展物理地址到36位,可以支持最多64GB的物理内存。
-
内核支持高端内存: 启用PAE后,内核可以更好地管理高端内存,但仍需要通过特殊的映射方式访问。
6.2 使用64位系统
-
64位地址空间: 64位系统的虚拟地址空间和物理地址空间都大大增加,能够直接映射更多的物理内存。
-
优势: 消除了32位系统的内存限制问题,能够充分利用大容量内存。
综上所述,在32位系统中,由于虚拟地址空间和硬件的限制,即使物理内存为4GB,内核实际能够直接映射并使用的低端内存只有约800MB,其余物理内存要么成为高端内存,需要特殊处理,要么由于硬件地址映射而无法使用。
本文来自博客园,作者:闹闹爸爸,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/18420683