内存映射显示的 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 多于物理可用内存 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐

  • 具有 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