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

news/2024/9/19 15:48:36/文章来源:https://www.cnblogs.com/wanglouxiaozi/p/18420683

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易优eyoucms网站下载的系统导入就数据库出问题了,如何升级数据库?

数据库版本需要一样 数据库有新建模型的 需要打补丁包再导入扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD转HTML、网站被黑、…

易优eyoucms网站登录报错:Array and string offset access syntax with curly braces is deprecated

根据提供的错误信息 Array and string offset access syntax with curly braces is deprecated,这个错误提示表明当前使用的 PHP 版本不支持使用大括号 {} 来访问数组和字符串偏移量。这种语法在 PHP 7.4 之后被标记为已弃用。 以下是一些可能的解决步骤: 1. 切换 PHP 版本 尝…

易优eyoucms网站报错,\\core\\library\\think\\db\\Connection.php

报错 \\\\core\\\\library\\\\think\\\\db\\\\Connection.php 第 380 行左右 数据表或视图不存在,请联系技术处理。[错误代码] SQLSTATE[42S02]: Base table or view not found: 1146 Table eyoucms.ey_channeltype doesnt exist 根据提供的错误信息 SQLSTATE[42S02]: Base ta…

高等数学 3.3 泰勒公式

泰勒(Taylor)中值定理1 如果函数 \(f(x)\) 在 \(x_0\) 处具有 \(n\) 阶导数,那么存在 \(x_0\) 的一个邻域,对于该领域内的任一 \(x\) ,有 \[f(x) = f(x_0) + f^{}(x_0)(x - x_0) + \cfrac{f^{}(x_0)}{2!}(x - x_0)^2 + \cdots + \cfrac{f^{(n)}(x_0)}{n!}(x - x_0)^n + R_…

腾讯云TDSQL数据库认证值得考吗?来看看TDSQL证书有什么用

国内市场上的数据库产品有不少,很多大企业都有自己的数据库产品,比如金仓的KingBase、华为的OpenGauss、阿里云的PolarDB、达梦DM数据库等等,腾讯云也有自己的数据库产品,叫做TDSQL数据库,TDSQL数据库有两个分支:基于MySQL版 + 基于PostgreSQL版。腾讯云是国内知名的云平…

Maximum execution time of 30 seconds exceeded

遇到 Maximum execution time of 30 seconds exceeded 这个错误,通常是因为 PHP 脚本执行时间超过了设定的最大执行时间限制。这可能是由于脚本执行了耗时的操作,例如长时间的数据库查询或其他资源密集型任务。 以下是一些解决步骤: 1. 增加最大执行时间限制 可以在 PHP 配置…

易优eyoucms网站报错 \core\library\think\db\Connection.php 第 307 行左右,SQLSTATE[HY000] [1045]访问被拒,这样的情况要怎么处理啊

根据提供的错误信息 SQLSTATE[HY000] [1045] Access denied for user cs2021@localhost (using password: YES),这个错误表明数据库访问被拒绝了,通常是因为用户名或密码不正确导致的。 以下是几个可能的解决步骤:检查数据库连接配置:确认数据库连接配置文件中的用户名和密…

如何用Python将HTTP接口封装成可视化页面。

在软件行业中,经常会遇到有一些功能只能通过接口触发,没有页面。这样很不方便,。 我们这里,就是通过PyQt5实现,将接口的入参,封装成一个可视化的表单。将用户在表单中填写的数据,传给接口,接口再带参请求业务1.先看最终的效果,用户打开桌面应用后,只会出现下面的弹窗…

易优eyoucms网站php5.4版本,报错:Cant use method return value in write context

当你在使用 PHP 5.4 版本时遇到 “Cant use method return value in write context” 的错误,这通常是因为你在代码中错误地使用了方法返回值。这种错误通常发生在试图将方法返回值直接赋值给变量或用于其他上下文时。 解决方案 以下是一些常见的原因和解决方法: 1. 检查代码…

易优eyoucms网站报错 /core/library/think/db/Connection.php 第 389 行左右,如何解决?

SQLSTATE[42S22]: Column not found: 1054 Unknown column groupid in where clause 遇到“SQLSTATE[42S22]: Column not found: 1054 Unknown column groupid in where clause”这类错误,通常是因为数据库表结构与代码中的查询不匹配。具体来说,可能是数据库表中缺少某个列(…

【HFSS】HFSS绘制梯形走线的5种方法

使用HFSS仿真PCB走线,需要对走线进行建模,但是由于PCB制造过程中的蚀刻导致走线截面不是理想的矩形,而是接近梯形。为了使仿真尽量精确,需要将PCB走线截面绘制成梯形。下面介绍几种绘制梯形走线的方法。 方法一:修改line参数直接生成梯形 1)画一条线100mil,右侧窗口选中…

汇总区间

给定一个有序的list, 需要根据数据的连续性进行区间的汇总实例如下: 解决方法:设置左右指针,固定左指针,当右指针对应的数+1=右指针+1对应的数 and 右指针不要越界,就移动右指针,直到跳出while,并更新左指针=右指针+1class Solution(object):def summaryRanges(self, n…