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

我正在研究一个小的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时,为什么总计超过4GiB的RAM?

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

一些想法:

  • 地址空间!=物理内存大小。
  • i3支持64位或32位模式的虚拟地址空间,36位PAE(可选,内核支持)。 如果您在启动的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_%28×86%29

编辑2:

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

Win 7 / ASUS EFI BIOS上的Sysinternals RamMap