W 64-bitowym systemie Debian wykryto tylko 3,2 GB 4 GB pamięci RAM

9

Używam 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

Mam 2 kompatybilne 2 GB pamięci DDR2 na mojej płycie głównej G31M-S . Obsługuje do 8 GB:

wprowadź opis zdjęcia tutaj

Ponieważ jest to serwer, tak naprawdę nie dbam o grafikę. Ustawiłem więc na najniższą.

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

wprowadź opis zdjęcia tutaj

Jednak Linux wykrywa tylko 3,19 GiB pamięci:

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

Patrząc na mapę 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)

I wykonując małą matematykę:

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

Otrzymujemy prawie taką samą odpowiedź.

czego mi brakuje?


Nie kupuję całkowicie argumentu „przestrzeń adresowa PCI”. Po zdjęciu jednego z dwóch wystających dysków o pojemności 2 GB ekran konfiguracji pokazuje 2048 MB.

# cat /proc/meminfo
MemTotal:        2058432 kB

To 1,96 GB.

Mapa E820 ponownie:

[    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)

A matematyka ...

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

Mam więc 2 GB / 2 GB. /proc/cpuinfopokazuje, że mój procesor obsługuje 36-bitowe adresowanie fizyczne. 2 ^ 36 = 64 GB, do których nawet nie jestem blisko.


# ./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
Jonathon Reinhart
źródło
Upewnij się, że mapowanie pamięci jest włączone w systemie BIOS.
David Schwartz,
@DavidSchwartz Próbowałem to włączyć, a jądro spanikowało podczas uruchamiania. Mogę jednak spróbować z płytą CD na żywo.
Jonathon Reinhart
@DavidSchwartz Masz absolutną rację. Wydaje się, że włączenie mapowania pamięci załatwiło sprawę. Bez włączenia Memtest86 + zgłasza ~ 3300 MB. Po włączeniu zgłasza 4086 MB. Jeśli odpowiesz na to pytanie, chętnie się zgodzę.
Jonathon Reinhart

Odpowiedzi:

5

Trzeba skręcić w pamięci remapping ON w BIOS. W przeciwnym razie nie zmieni mapowania pamięci powyżej granicy 4 GB, a część pamięci zostanie pokryta mapowaniami sprzętowymi.

David Schwartz
źródło
To był problem. Wydaje się, że włączenie mapowania pamięci załatwiło sprawę. Bez włączenia Memtest86 + zgłasza ~ 3300 MB. Po włączeniu zgłasza 4086 MB.
Jonathon Reinhart
To samo, przed włączeniem Memory Hole Remapping(AMIBIOS), POST zgłosi około 3,3 GiB, podczas gdy DMI nadal będzie wyświetlał dwa moduły po 2 GiB każdy.
njsg
5

PCI wykorzystuje również część przestrzeni adresowej. Zarówno karty PCI, jak i urządzenia PCI są wbudowane w płytę główną (np. Mikroukład).

Zwykle oznaczało to, że z 4 GB dostępnych było tylko 3¼ do 3½ GB, nawet jeśli nie korzystałeś z nowoczesnego procesora graficznego z dużą ilością wbudowanej pamięci RAM.

Hennes
źródło
Prawie zignorowałem ten fakt ... Mam na myśli 0,8 GB? Co ciekawe, szczyt mapy e820 jest 0x100000000 == 1<<32bardzo interesujący. Dlaczego więc BIOS nie mapuje reszty pamięci RAM powyżej 1 << 32? To Celeron E3400 i /proc/cpuinfomówi, address sizes : 36 bits physical, 48 bits virtualże powinno to być dobre dla 64 GB. ( (1<<36) / (1024*1024*1024) == 64)
Jonathon Reinhart
Podręcznik mojej starej płyty głównej Tyan był jedynym, który zdawał się mnie ostrzegać, że chociaż obsługuje 4 GB pamięci RAM, nigdy nie ujawniłby tego wszystkiego w systemie operacyjnym. W zależności od używanych kart rozszerzeń (zwykły stary PCI, 66 MHz, 64-bitowy) odsłania około 3,3 GB przestrzeni użytkowej. Nigdy nie musiałem tego testować, 512 MB pamięci RAM było wszystkim, na co mogłem sobie pozwolić. (To było wtedy, gdy ta płyta główna z dwoma procesorami nadal oznaczała użycie dwóch fizycznych procesorów. Od tego czasu mogło się to zmienić i PCIe może nie mieć tego samego limitu. Ale większość płyt głównych wciąż ma zarówno PCI, jak i PCIe).
Hennes,
Zobacz moją edycję. Myślę, że problem polega na tym, że albo BIOS odmawia zgłaszania pamięci 1<<32, albo jądro nie wie, jak to zrozumieć.
Jonathon Reinhart
Czy rozważałeś pamięć współdzieloną używaną przez wewnętrzną grafikę? Jeśli masz smemzainstalowany, spróbuj smem -R 4G -wogólnego przeglądu dostępnej / używanej pamięci.
Izzy
1
@Hennes Ta odpowiedź miałaby sens, gdyby był to system 32-bitowy. Ale nie dla wersji 64-bitowej (z 36-bitowym adresowaniem pamięci fizycznej).
Jonathon Reinhart
2

Brakująca pamięć RAM jest używana przez oprogramowanie układowe:

# ./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

Podsumowując:

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

Widzisz, sumuje się do 4 GB. A oto około 800 mln, o których zgubiłeś:

firmware/hardware            843592          0     843592
Izzy
źródło
Tak i nie jestem tym zaskoczony. Pytanie brzmi: dlaczego BIOS nie zgłasza, że ​​powyżej 800 MB pamięci RAM 0x100000000 (1<<32)? Zachowuje się, jakby to był system 32-bitowy.
Jonathon Reinhart
Tak, myślę, że ta odpowiedź jest prawidłowa, ale to ostatnie pytanie pozostaje :-)
Jonathon Reinhart
Co więc smem -R 2G -wmówi tylko 2G w maszynie (szczególnie w przypadku oprogramowania / sprzętu, ponieważ wydaje się, że jest to sekcja, w której „brakujące 800M” poszło z 4G)? Byłoby całkiem zabawne, gdyby oprogramowanie nagle nie potrzebowało już tych 800 mln ...
Izzy
Czy może to mieć związek z AMI BIOS detected: BIOS may corrupt low RAM, working around it.- i uwagą Wikipedii (z twojego e820link) „Czasami BIOS jest wadliwy i niepoprawnie zgłasza zarezerwowaną pamięć. Może to spowodować, że oprogramowanie do testowania pamięci, takie jak Memtest, zgłosi błędy”. ? EDYCJA: Ach, nie - to tylko 64 tys. , A nie 800 mln ...
Izzy
Mogę sprawdzić, kiedy wrócę do domu, ale zakładam, że powie to samo. Spójrz na mapę E820 dla 2 GB. Z obserwacji wynika, że ​​wygląda mniej więcej tak samo, z tym wyjątkiem, że zakresy zarezerwowane / ACPI są niższe w przestrzeni adresu (niektóre z nich).
Jonathon Reinhart