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

Posted

技术标签:

【中文标题】内存映射显示的 RAM 多于物理可用的 RAM【英文标题】:Memory map shows more RAM than physically available 【发布时间】:2013-09-26 21:52:47 【问题描述】:

我正在开发一个小型 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

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

0x2、0x3、0x4 - 331.5 MiB

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

    为什么我只安装了 4GiB 的 RAM?

    为什么内存映射的最后一个基地址是0x0000000100000000?只有 4GiB 的 RAM,32 位应该是寻址所有它所需的最大地址大小。我是不是误会了什么?

【问题讨论】:

很多地址范围不一定是真实内存,它们可能映射到DMA/display/etc。 没错,但这是否需要 .875 GB 超出 32 位范围? 【参考方案1】:

一些想法:

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

编辑:

查看这里了解更多详情:http://wiki.osdev.org/Detecting_Memory_%28x86%29

编辑 2:

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

【讨论】:

我没有启用 PAE;我需要使用 64 位地址来到达内存的最后一部分。那么映射到其他地方的较低范围导致需要 4GiB 以上的地址? 没错,类型为 0x2,0x3,0x4 的范围导致了这种情况。如何精确地创建映射取决于系统固件。通常,还有“内存漏洞”,这解释了为什么比预期更多的内存映射到 4G 以上。 是的,我想知道这一点,因为在 4GiB 之上映射了将近 900MiB。它真的可以占这么多吗? 是的,根据各种消息来源,4G 以下的主内存范围最多可以达到 2.0 - 3.75GiB,具体取决于固件 (Bios) 如何映射它。可能存在 4G 以上的设备映射,这显然需要适当的 CPU 模式。我自己从未见过这样的配置。关于“漏洞”:en.wikipedia.org/wiki/PCI_hole @Joel 在 Linux 中您可以查看 /proc/iomem 以查看物理地址映射。它结合了来自 PCI 配置等的信息,以实际标记非 RAM 区域的用途。

以上是关于内存映射显示的 RAM 多于物理可用的 RAM的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows XP 中将内存地址映射到物理模块

CUDA 映射内存是不是占用 GPU RAM?

STM32 内存分配解析及变量的存储位置

虚拟内存和物理内存有什么区别?

确定 iOS 设备上的可用 RAM 量

如何通过批处理脚本检查可用内存(RAM)?