在64位Debian上仅检测到3.2GB的4GB RAM


9

我正在运行Debian Squeeze(x64):

# uname -srvmo
Linux 2.6.32-5-amd64 #1 SMP Mon Jan 16 16:22:28 UTC 2012 x86_64 GNU/Linux

我的G31M-S主板上有2个兼容的2 GB DDR2 记忆棒。它最多支持8GB:

在此处输入图片说明

由于这是一台服务器,所以我不太在乎图形。所以我将其设置为最低。

Internal Graphics Mode Select: Auto
                               Enabled, 1MB   <--
                               Enabled, 8MB
DVMT Mode Select:              Fixed Mode     <--
                               Auto
    DVMT/FIXED Memory:         128MB          <--
                               256MB

在此处输入图片说明

但是,Linux仅检测3.19GiB内存:

# cat /proc/meminfo
MemTotal:        3350712 kB
...

看看E820地图

[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
[    0.000000]  BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e6000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 00000000cfdb0000 (usable)
[    0.000000]  BIOS-e820: 00000000cfdb0000 - 00000000cfdc0000 (ACPI data)
[    0.000000]  BIOS-e820: 00000000cfdc0000 - 00000000cfdf0000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000cfdf0000 - 00000000cfe00000 (reserved)
[    0.000000]  BIOS-e820: 00000000fed00000 - 00000000fed00400 (reserved)
[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  BIOS-e820: 00000000ff380000 - 0000000100000000 (reserved)
[    0.000000] DMI present.
[    0.000000] AMI BIOS detected: BIOS may corrupt low RAM, working around it.
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)

并做一点数学:

>>> ((0x9F800 - 0x10000) + (0xCF6B0000 - 0x100000)) / 1024.0 / 1024.0 / 1024.0
3.240476608276367

我们得到几乎相同的答案。

我想念什么?


我没有完全购买“ PCI地址空间”参数。取出两个2GB容量之一,设置屏幕将显示2048MB。

# cat /proc/meminfo
MemTotal:        2058432 kB

那是1.96GB。

E820再次映射

[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
[    0.000000]  BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e6000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 000000007fdb0000 (usable)
[    0.000000]  BIOS-e820: 000000007fdb0000 - 000000007fdc0000 (ACPI data)
[    0.000000]  BIOS-e820: 000000007fdc0000 - 000000007fdf0000 (ACPI NVS)
[    0.000000]  BIOS-e820: 000000007fdf0000 - 000000007fe00000 (reserved)
[    0.000000]  BIOS-e820: 00000000fed00000 - 00000000fed00400 (reserved)
[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  BIOS-e820: 00000000ff380000 - 0000000100000000 (reserved)
[    0.000000] DMI present.
[    0.000000] AMI BIOS detected: BIOS may corrupt low RAM, working around it.
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)

还有数学

>>> ((0x9F800 - 0x10000) + (0x7fdb0000 - 0x100000)) / 1024.0 / 1024.0 / 1024.0
1.9973125457763672

所以我有2GB / 2GB。 /proc/cpuinfo显示我的处理器支持36位物理寻址。2 ^ 36 = 64GB,我什至无法接近。


# ./smem -R 4G -w
Area                           Used      Cache   Noncache
firmware/hardware            843592          0     843592
kernel image                      0          0          0
kernel dynamic memory        181116     134616      46500
userspace memory             287784      19736     268048
free memory                 2881812    2881812          0

确保BIOS中的内存重新映射已打开
大卫·史瓦兹

@DavidSchwartz我尝试将其打开,内核在启动时感到恐慌。我可以用现场CD尝试一下。
乔纳森·莱因哈特

@DavidSchwartz您绝对正确。打开内存重新映射似乎可以解决问题。如果不打开,Memtest86 +会报告约3300 MB。打开它,它报告4086 MB。如果您做出答复,我将很乐意接受。
乔纳森·莱因哈特

Answers:


5

你需要把内存重映射ON在BIOS中。否则,它将不会重新映射4GB边界以上的内存,并且某些内存将被硬件映射覆盖。


这就是问题所在。打开内存重新映射似乎可以解决问题。如果不打开,Memtest86 +会报告约3300 MB。打开它,它报告4086 MB。
乔纳森·莱因哈特

同样,在启用Memory Hole Remapping(AMIBIOS)之前,POST将报告大约3.3 GiB,而DMI仍将列出两个模块,每个模块2 GiB。
njsg

5

PCI也使用一些地址空间。PCI卡和PCI设备都内置在主板(例如芯片组)中。

通常,这意味着即使您不使用带有大量板载RAM的现代GPU,在4GB中也只有3¼至3½GB可用。


我几乎忽略了这个事实……我的意思是0.8GB?但是,e820地图的顶部是0x100000000 == 1<<32,这很有趣。那么,为什么BIOS无法将大于1 << 32的其余RAM映射呢?这是一个赛扬E3400,并/proc/cpuinfoaddress sizes : 36 bits physical, 48 bits virtual64GB应该很好。((1<<36) / (1024*1024*1024) == 64
乔纳森·莱因哈特

我旧的Tyan主板的手册似乎是警告我的唯一手册,尽管它支持4GB RAM,但它永远都不会暴露给操作系统。根据所使用的扩展卡(普通的老式PCI,66Mhz,64位),它可能会暴露约3.3GB的可用空间。我从来没有测试过,我可以负担得起512MB RAM。(这是当双CPU主板仍意味着使用两个物理CPU时的情况。从那时起事情可能已经发生变化,PCIe可能没有相同的限制。但是大多数主板仍然同时具有PCI和PCIe)。
Hennes

看到我的编辑。我认为问题是BIOS拒绝报告有关的任何内存1<<32,或者此内核不知道如何理解它。
乔纳森·莱因哈特

您是否考虑过内部图形使用的共享内存?如果已smem安装,请尝试smem -R 4G -w总体了解可用/已用内存。
Izzy 2012年

1
@Hennes如果这是32位系统,则此答案非常合理。但不适用于64位(具有36位物理内存寻址)。
乔纳森·莱因哈特

2

您缺少的RAM被固件使用:

# ./smem -R 4G -w
Area                           Used      Cache   Noncache
firmware/hardware            843592          0     843592
kernel image                      0          0          0
kernel dynamic memory        181116     134616      46500
userspace memory             287784      19736     268048
free memory                 2881812    2881812          0

加起来:

echo $((181116 + 287784 + 2881812 + 843592))
4194304

如此一来,它总共可存储4GB。这是您报告缺少的〜800M:

firmware/hardware            843592          0     843592

是的,对此我并不感到惊讶。问题是,BIOS为什么不报告800MB以上的RAM 0x100000000 (1<<32)?它的行为好像是一个32位系统。
乔纳森·莱因哈特

是的,我认为这个答案是正确的,但是最后一个问题仍然是:-)
乔纳森·莱因哈特

那么smem -R 2G -w,仅使用2G的机器怎么说(特别是关于固件/硬件,因为那似乎是4G缺少“ 800M”的部分)?如果固件突然不再需要那些800M,将会很有趣……
Izzy 2012年

这可能与AMI BIOS detected: BIOS may corrupt low RAM, working around it.-和Wikipedia注释(来自e820link)有关:“有时BIOS有错误,并且错误地报告了保留的内存。这可能导致内存测试软件(例如Memtest)报告错误。” ?编辑:啊,不-那将只占64k而不是800M ...
Izzy

我可以检查一下何时回家,但我假设它会说同样的话。查看2GB的E820地图。通过观察,它看起来大致相同,只是保留/ ACPI范围在地址空间中较低(其中一些)。
乔纳森·莱因哈特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.