首页 > 系统相关 >4G内存的32位系统,内核地址空间分配1G的情况下,为什么实际可用的低端内存只有800M左右?

4G内存的32位系统,内核地址空间分配1G的情况下,为什么实际可用的低端内存只有800M左右?

时间:2024-09-19 15:48:30浏览次数:8  
标签:800M 映射 32 虚拟地址 内核 空间 物理 内存

在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,其余物理内存要么成为高端内存,需要特殊处理,要么由于硬件地址映射而无法使用。

标签:800M,映射,32,虚拟地址,内核,空间,物理,内存
From: https://www.cnblogs.com/wanglouxiaozi/p/18420683

相关文章

  • 请考虑使用 app.config 将程序集“XXXX”从版本“x.y.z.0”[]重新映射到版本“x.y.z.1
    VisualStudio编译过程中,发现以下警告:请考虑使用app.config将程序集“Newtonsoft.Json,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”从版本“10.0.0.0”[]重新映射到版本“13.0.0.0”[D:\WorkSpace..................\Debug\Newtonsoft.Json.dll],以解决冲突并消除警告......
  • 【终极对决】Ping32 vs 绿盾:十大维度深度剖析,谁是企业数据安全的守护神?
    在信息安全领域,企业对数据保护的需求不断升级。Ping32与绿盾加密作为两款备受关注的数据保护软件,各具特色。本文将从十大维度深度剖析这两款软件,帮助企业选择最适合自己的数据安全解决方案。1.加密算法Ping32Ping32采用了多种高级加密算法(如AES-256),提供强大的数据保护,确保......
  • 【FAT32文件系统详细分析 (格式化SD nandSD卡)】
    ......
  • STM32F407单片机编程入门(七)USART串口485通讯实战含源码
    文章目录一.概要二.USART串口基本介绍三.STM32单片机USART内部结构图四.USART内部信号流向五.USART示波器信号解析六.485通讯基本概念七.CubeMX配置一个USART数据收发例程进行485通讯实验八.工程源代码下载九.小结一.概要USART(UniversalSynchronous/AsynchronousR......
  • uniapp 打包32位
    uniapp打包32位在uniapp中,如果你想要打包成32位的应用,你需要确保你的开发环境支持32位构建,并且你的电脑操作系统也支持32位应用。以下是打包32位应用的步骤:确保你的开发环境支持32位构建,比如HBuilderX。在HBuilderX中,打开你的uniapp项目。在项目视图中,找......
  • C和指针:动态内存分配(malloc,calloc,realloc,free)
     动态内存分配⭐关联知识点:linux动态内存分配为什么使用动态内存分配声明数组必须用一个编译时常量指定数组的长度。但是,数组的长度常常在运行时才知道,由于它所需要的内存空间取决于输入数据。malloc和freemalloc和free,分别用于执行动态内存分配和释放。这些函数维护一个可用......
  • STM32H7 DMA 使用配置 CUbeMX
    突发传输:突发传输在整个传输中过程中,节拍与节拍的传输是连续的 且不会被总线仲裁直到传输结束有利于优化总线的使用带宽。图中需要注意两点:(1)外设处:数据宽度*突发SIZE<=Threshold值(2)内存处:数据宽度*突发SIZE<=Threshold值理解:突发传输,8beat一次 Burst,翻译为8拍一次突发,理解为突......
  • 动态内存管理
    1.为什么要有动态内存分配我们已经掌握的内存开辟⽅式存在两个缺点 •空间开辟⼤⼩是固定的。•数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道,那数组的......
  • 2321. 拼接数组的最大分数
    题目链接2321.拼接数组的最大分数思路最大子数组和-变体题解链接转换成最大子数组和(Python/Java/C++/Go)关键点无时间复杂度\(O(n)\)空间复杂度\(O(1)\)代码实现:classSolution:defmaximumsSplicedArray(self,nums1:List[int],nums2:Lis......
  • 基于STM32的智能水质监测系统设计
    文章目录前言资料获取设计介绍功能介绍设计程序具体实现截图参考文献设计获取前言......