2013-09-21 60 views
7

我正在研究一个小的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

把我的内存总量为4225.3 MIB或略高于4.1吉布,这引导我到我的问题:

  1. 为什么我总共超过4GiB的RAM,当我只有4GiB安装?

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

+0

许多地址范围不一定是真实的存储器,它们可映射到DMA /显示/等。 –

+0

确实如此,但这是否会造成对.875 GB的需求超出32位范围? – Joel

回答

2

的几点思考:

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

编辑:

在这里寻找更多详情:http://wiki.osdev.org/Detecting_Memory_%28x86%29

编辑2:

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

Sysinternals RamMap on Win 7/ASUS EFI BIOS

+0

我没有启用PAE;我需要使用64位地址来达到内存的最后部分。那么映射到其他地方的较低范围会导致需要高于4GiB的地址? – Joel

+0

的确,类型为0x2,0x3,0x4的范围导致了这种情况。如何创建映射取决于系统固件。通常情况下,还有'内存漏洞',这就是为什么比预期更多的内存映射到4G以上的原因。 – Sam

+0

是的,我在想这件事,因为在4GiB上映射的映射几乎是900Mb。它能真正解释那么多吗? – Joel