32-bitowa przestrzeń adresowa oznacza, że masz miejsce na 4 GB adresów. Idealnie, jądro lubi mapować całą pamięć fizyczną, całą pamięć bieżącego zadania i całą własną pamięć. Jeśli sama pamięć fizyczna zajmuje wszystkie dostępne 4 GB, to nie zadziała. Tak więc pamięć fizyczna jest podzielona na niską pamięć, która jest cały czas mapowana, i pamięć wysoką, którą należy mapować podczas używania. O ile nie korzystasz z łatanego jądra, w architekturze ix86 128 MB przestrzeni adresowej jest przeznaczone na kod jądra i struktury danych, a 896 MB jest przeznaczone na mapowanie pamięci fizycznej (łącznie 1 GB).
Czytanie w tle na temat złożoności zarządzania pamięcią, gdy przestrzeń adresowa nie jest wygodnie większa niż całkowita pamięć:
Fragmenty dzienników jądra:
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 00000000cdce0000 (usable)
BIOS-e820: 00000000cdce0000 - 00000000cdce3000 (ACPI NVS)
BIOS-e820: 00000000cdce3000 - 00000000cdcf0000 (ACPI data)
BIOS-e820: 00000000cdcf0000 - 00000000cdd00000 (reserved)
BIOS-e820: 00000000d0000000 - 00000000e0000000 (reserved)
BIOS-e820: 00000000fec00000 - 0000000100000000 (reserved)
BIOS-e820: 0000000100000000 - 0000000130000000 (usable)
2404MB HIGHMEM available.
887MB LOWMEM available.
Zone PFN ranges:
DMA 0x00000000 -> 0x00001000
Normal 0x00001000 -> 0x000377fe
HighMem 0x000377fe -> 0x000cdce0
Tutaj masz 887 MB wolnej pamięci: teoretycznie maksymalnie 896 MB minus kilka MB buforów DMA (strefy pamięci używane do komunikacji z urządzeniami sprzętowymi).
Z Twojej pamięci fizycznej 3328 MB jest mapowane na adresy poniżej 4 GB, a 768 MB jest mapowane na adresy powyżej 4 GB (zakres 0x100000000–0x130000000). Nie dostajesz dostępu do tych 768 MB, co wyjaśnia, dlaczego masz tylko 3242 MB (4096 MB pamięci RAM minus 768 MB niedostępne minus 9 MB buforów DMA minus 75 MB używanych przez samo jądro dla kodu i danych). Nie wiem, dlaczego BIOS mapuje część pamięci RAM powyżej znaku 4 GB, ale jako punkt danych przesyłam to z komputera z 4 GB pamięci RAM, która podobnie ma pamięć RAM zamapowaną na 0x100000000–0x130000000.
Mapowanie pamięci fizycznej powyżej 4 GB wymaga użycia PAE . PAE wiąże się z niewielkim narzutem wydajności (w szczególności wymaga większych struktur danych w menedżerze pamięci), więc nie jest systematycznie włączany. Domyślne jądro Ubuntu jest kompilowane bez obsługi PAE. Uzyskaj -generic-pae
jądro, aby mieć dostęp do 64 GB pamięci RAM.
TL, DR: Linux działa zgodnie z oczekiwaniami. Oprogramowanie układowe nie jest tak pomocne. Uzyskaj jądro z obsługą PAE.