内存映射显示的 RAM 多于物理可用内存

2024-03-26

我正在开发一个小型 x86 内核。我正在访问并尝试读取 GRUB 在多重引导标头中提供的内存映射。我有一个 Intel i3 cpu 和 4 GiB RAM。在这台机器上运行时,我正在读取以下内存映射:

 --Base Address--          --Length--      --Type--

0x0000000000000000     0x000000000009d000     0x1
0x000000000009d000     0x0000000000003000     0x2
0x00000000000e0000     0x0000000000020000     0x2
0x0000000000100000     0x00000000bb53f000     0x1
0x00000000bb63f000     0x0000000000080000     0x2
0x00000000bb6bf000     0x0000000000100000     0x4
0x00000000bb7bf000     0x0000000000040000     0x3
0x00000000bb7ff000     0x0000000000001000     0x1
0x00000000bb800000     0x0000000004800000     0x2
0x00000000e0000000     0x0000000010000000     0x2
0x00000000feb00000     0x0000000000004000     0x2
0x00000000fec00000     0x0000000000001000     0x2
0x00000000fed10000     0x0000000000004000     0x2
0x00000000fed18000     0x0000000000002000     0x2
0x00000000fed1b000     0x0000000000005000     0x2
0x00000000fee00000     0x0000000000001000     0x2
0x00000000ffe80000     0x0000000000180000     0x2
0x0000000100000000     0x0000000038000000     0x1

当我合计可用内存区域时,我得到......

0x1(可用)- 3893.8 MiB

这似乎是正确的,将最后 200 左右 MiB 保留给其他设备。 唯一的问题是其他内存类型的总数:

0x2、0x3、0x4- 331.5 MiB

将我的 RAM 总量设置为 4225.3 MiB 或略高于 4.1 GiB,这引出了我的问题:

  1. 为什么我只安装了 4GiB,但 RAM 总量却超过了 4GiB?

  2. 为什么内存映射中的最后一个基地址是0x0000000100000000?由于 RAM 只有 4GiB,因此寻址所有 RAM 所需的最大地址大小应该是 32 位。我在这里误解了什么吗?


一些想法:

  • 地址空间!=物理内存大小。
  • i3 支持 64 位或具有 36 位 PAE 的 32 位模式的虚拟地址空间(可选,需要内核支持)。如果启动的 32 位系统中实际上有 4GiB 的 RAM 可用,则必须启用 PAE。如何检查:https://serverfault.com/q/247080 https://serverfault.com/q/247080
  • AFAIR,这些范围可以重叠并以任何顺序出现,因此需要对最受限制的类型或范围分割进行排序和重新键入。
  • 最后一个基地址0x0000000100000000是 >= 2^32。通常会这样做,因为在(所有?)PC 中,硬件、ROM 映像和其他特殊范围的分配空间低于 2^32。因此,需要 PAE 或长模式来访问从 2^32 或以上开始的主内存范围。

Edit:

查看此处了解更多详细信息:http://wiki.osdev.org/Detecting_Memory_%28x86%29 http://wiki.osdev.org/Detecting_Memory_%28x86%29

Edit 2:

今天,我偶然发现了一个 Sysinternals 工具,它显示了我的 EFI 系统的以下物理范围映射,而没有更改任何相关设置。可以看到,所有 64GiB 主内存都映射到0x100000000,就在 2^32 处:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存映射显示的 RAM 多于物理可用内存 的相关文章

随机推荐

  • 具有 MySQL 连接的 Nodejs 集群

    寻找有关 Nodejs 集群和连接 mysql 服务器的方法的建议 我们是为每个子进程打开一个连接 还是为所有进程只打开一个连接 或者我们为所有子进程创建一个连接池 推荐的方法是什么 单节点进程 var mysql require mysq
  • java.lang.IllegalStateException:驱动程序可执行文件不存在:C:\Users\jagrelot\workspace\AntBuildExample\chromedriver.exe 与 ChromeDriver

    当我尝试在 Eclipse 中运行 Selenium 时 出现驱动程序可执行文件不存在 错误 我已确保 exe 的路径正确并且设置了环境 PATH 变量 该错误引用了位于 Java 项目工作区中的旧驱动程序位置 当我通过命令行运行它时 它似
  • 如何使用 Geo 库创建有效的 Ecto 模型变更集?

    我正在尝试使用Geo https github com bryanjos geo通过 Phoenix 模型变更集存储 Geo Point 的库 我的参数是 coordinates 49 44 17 87 或者更喜欢的是 coordinate
  • boost::hash_combine 与简单异或运算

    使用boost库时 函数boost hash combine工作原理如下 seed hash value v 0x9e3779b9 seed lt lt 6 seed gt gt 2 http www boost org doc libs
  • 通过 css 的 Vaadin Flow/10/11 样式组件

    我的问题很基本 如何将 css 文件中的样式添加到基本 vaadin 组件中 我做什么NOT想要使用 聚合物模板 getStyle set 我是否必须 ImportHtml 其中包含 css 代码 还是必须 StyleSheet 与 css
  • System.Net.Mail 和 =?utf-8?B?XXXXX.... 标头

    我正在尝试使用下面的代码通过以下方式发送消息System Net Mail and am 有时获得像这样的主题 utf 8 B W3AxM25dIEZpbGV 修剪 这就是所谓的代码 MailMessage message new Mail
  • 使用 Fluentvalidation 显示带有 NotEmpty 的星号

    我想在 Asp Net MVC 4 网页上显示label当属性有时带有星号NotEmpty rule 只需将此函数添加到您的常用脚本函数中并在加载时运行 document ready function setRequired functio
  • 从Android模拟器读取C盘文件

    我正在 Android 模拟器上尝试测试应用程序 我希望该应用程序将数据写入存储在我的 C 驱动器上的文件 我已经从 Samba 驱动器和 Web 服务读取和写入数据 但读取和写入本地硬盘似乎是一个难题 我试过filePath file C
  • 如何在隐藏的默认浏览器中打开网页?德尔福

    我一直试图从 delphi 打开隐藏的默认浏览器 但无法打开 I tried ShellExecute self WindowHandle open www google com nil nil SW HIDE 我打开了 chrome 浏览
  • android 6.0.1 (Galaxy Note 5) 通过 FCM 推送通知,优先级高,不从瞌睡模式中唤醒

    经过几周的寻找答案后 遇到了无数的剖析 没有人提供解决方案 甚至没有人找出问题 或改变 https github com firebase quickstart android issues 89 https github com fire
  • 覆盖标记点击操作

    我想在用户单击编辑器左侧垂直标尺上的标记时添加自定义操作 我设法通过添加来运行自定义操作plugin xml下面的代码
  • json_encode PHP 数组为 JSON 数组而不是 JSON 对象

    我在 PHP 中有以下数组 Array 0 gt Array id gt 0 name gt name1 short name gt n1 2 gt Array id gt 2 name gt name2 short name gt n2
  • 如何在给定宽度和高度的情况下调整对象的 2D 向量的大小?

    我的课 GameBoard 有一个成员变量 它是该类对象的二维向量Tile The GameBoard构造函数将宽度和高度作为参数 我怎样才能得到二维向量Tile根据传递给构造函数的宽度和高度调整对象大小 我怎样才能填充它Tile对象以便我
  • CSV 字符串到数据表

    我有以下字符串 我想将其转换为数据表 Id Name Dept r n1 Mike IT r n2 Joe HR r n3 Peter IT r n 我可以使用 String Split 并迭代集合来创建它 但我需要有效的方法 使用 C 4
  • 带有嵌入式哈希表的 Powershell ConvertTo-json

    我在 ConvertTo Json 方面遇到问题 并试图理解其行为和 或我做错了什么 考虑以下命令序列 val ID 10 Config ID 11 Config ID 12 Config end ConvertTo json val Co
  • dask 数据帧 head() 返回空 df

    我有一个 dask 数据框 其中一列上有索引 问题是如果我执行 df head 它总是返回一个空的 df 而 df tail 总是返回正确的 df 我检查过 df head 总是检查第一个分区中的前 n 个条目 因此 如果我执行 df re
  • 在 AppDomain 之间共享数据

    我有一个可以有多个应用程序域的进程 每个AppDomain 都会收集一些统计数据 在指定的时间之后 我想累积这些统计数据并将它们保存到文件中 实现此目的的一种方法是远程处理 我想避免这种情况 我想到的唯一其他技术是将每个应用程序域的数据保存
  • MVC contrib 寻呼机

    我这样使用它 有没有简单的方法来更改呈现的网址 我查找了更多文档 但找不到太多 你到底想改变什么 这是我更改 URL 的方法 Html Pager Model AssetsPagedList First First Last Last Ne
  • 如何在 Spark Dataframe 中按组/分区重命名列?

    我有一些传感器数据按通道名称而不是传感器名称存储在表中 这是为了避免表太宽 因为许多传感器仅在少数设备上使用 这是稀疏列的工作 我知道 但我只是数据的用户 像这样的事情 from functools import reduce import
  • 内存映射显示的 RAM 多于物理可用内存

    我正在开发一个小型 x86 内核 我正在访问并尝试读取 GRUB 在多重引导标头中提供的内存映射 我有一个 Intel i3 cpu 和 4 GiB RAM 在这台机器上运行时 我正在读取以下内存映射 Base Address Length