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:
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
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/cpuinfo
pokazuje, ż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
linux
memory
debian-squeeze
Jonathon Reinhart
źródło
źródło
Odpowiedzi:
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.
źródło
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.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.
źródło
0x100000000 == 1<<32
bardzo interesujący. Dlaczego więc BIOS nie mapuje reszty pamięci RAM powyżej 1 << 32? To Celeron E3400 i/proc/cpuinfo
mówi,address sizes : 36 bits physical, 48 bits virtual
że powinno to być dobre dla 64 GB. ((1<<36) / (1024*1024*1024) == 64
)1<<32
, albo jądro nie wie, jak to zrozumieć.smem
zainstalowany, spróbujsmem -R 4G -w
ogólnego przeglądu dostępnej / używanej pamięci.Brakująca pamięć RAM jest używana przez oprogramowanie układowe:
Podsumowując:
Widzisz, sumuje się do 4 GB. A oto około 800 mln, o których zgubiłeś:
źródło
0x100000000 (1<<32)
? Zachowuje się, jakby to był system 32-bitowy.smem -R 2G -w
mó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 ...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 ...