内存映射显示的RAM比实际可用的RAM更多

7

我正在开发一个小型的x86内核。我正在访问并尝试读取GRUB在multiboot头中提供的内存映射。我的计算机使用Intel i3处理器和4 GiB内存。在此计算机上运行时,我正在读取以下内存映射:

 --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. 为什么我的RAM总量超过4GiB,而实际上只安装了4GiB?

  2. 为什么内存映射中的最后一个基地址是0x0000000100000000?只有4GiB的RAM,32位应该足以寻址所有RAM。我是否有什么误解?


许多地址范围不一定是真实的内存,它们可能映射到DMA/显示器等。 - Ramchandra Apte
但是,这是否需要创建0.875 GB位于32位范围之外的需求呢? - Joel
1个回答

3

一些想法:

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

编辑:

在这里查看更多详细信息:http://wiki.osdev.org/Detecting_Memory_%28x86%29

编辑2:

今天,我偶然发现了一个Sysinternals工具,显示了我的EFI系统的以下物理范围映射,而没有改变任何相关设置。正如大家所见,所有64GiB的主存储器都映射在0x100000000处,恰好在2^32处:

Sysinternals RamMap on Win 7 / ASUS EFI BIOS


我没有启用PAE;我需要使用64位地址才能到达内存的最后一部分。因此,映射到其他地方的较低范围会导致需要4GiB以上的地址? - Joel
1
确切地说,类型为0x2、0x3、0x4的范围导致了这个问题。映射的具体创建方式取决于系统固件。通常也会有“内存空洞”,这解释了为什么比预期更多的内存被映射到4G以上。 - Sam
是的,我也在想这个问题,因为几乎有900MiB映射到了4GiB以上.. 它真的可以解释那么多吗? - Joel
2
@Joel 在 Linux 中,您可以查看 /proc/iomem 以查看物理地址映射。它结合了来自 PCI 配置等的信息,实际上使用标签标识非 RAM 区域的用途。 - Geoff Reedy
1
(这是一些关于旧答案的额外信息:)如果我理解正确,大多数x86-64硬件/固件会创建一个映射,其中从RAM开始的3GB到4GB之间的物理地址不包含实际的物理RAM。这是因为许多设备仅支持将DMA传输到这些物理地址,所以操作系统必须使用不同的地址访问RAM。这也是为什么需要PAE来访问带有32位操作系统内核的完整4GB RAM的原因 - 32位地址空间的一部分用于硬件访问接口,因此一些RAM必须位于32位可寻址范围之外。 - Mikko Rantalainen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接