Ich kenne mich mit Swap aus – darum geht es in dieser Frage nicht. In dmesg sagt mir der Linux (x86-64) Kernel Folgendes darüber, wie viel Speicher ich habe:
[ 0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)
cat /proc/meminfo
sagt mir, dass ich habe
MemTotal: 3910472 kB
Und nach meinen Berechnungen sollte ich genau 4 * 1024 * 1024 =4194304 KB RAM haben. Was Weg ist kleiner als die zweite Zahl in der dmesg-Zeile oben!
Was hat es mit all diesen unterschiedlichen Zahlen auf sich?
Übrigens uname -a
Ausgaben:
Linux pavilion 3.2.2-1.fc16.x86_64 #1 SMP Thu Jan 26 03:21:58 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Akzeptierte Antwort:
Sie sollten das dmesg
lesen Werte „Speicher Akb/Bkb verfügbar“ als:
Derzeit ist A verfügbar, und die höchste Seitenrahmennummer des Systems multipliziert mit der Seitengröße ist B.
Dies ist aus arch/x86/mm/init_64.c
:
printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
"%ldk absent, %ldk reserved, %ldk data, %ldk init)n",
nr_free_pages() << (PAGE_SHIFT-10),
max_pfn << (PAGE_SHIFT-10),
codesize >> 10,
absent_pages << (PAGE_SHIFT-10),
reservedpages << (PAGE_SHIFT-10),
datasize >> 10,
initsize >> 10);
nr_free_pages()
gibt die Menge an physischem Speicher zurück, der vom Kernel verwaltet wird und derzeit nicht verwendet wird. max_pfn
ist die höchste Seitenrahmennummer (der PAGE_SHIFT
shift wandelt das in kb um). Die höchste Seitenrahmennummer kann (viel) höher sein als erwartet – die vom BIOS vorgenommene Speicherzuordnung kann Löcher enthalten.
Wie viel diese Löcher beanspruchen, wird von den absent_pages
erfasst Variable, angezeigt als kB absent
. Dies sollte den größten Teil des Unterschieds zwischen der zweiten Zahl in der Ausgabe „verfügbar“ und Ihrem tatsächlich installierten RAM erklären.
Sie können nach BIOS-e820
suchen in dmesg
um diese Löcher zu „sehen“. Dort wird die Memory Map angezeigt (ganz oben in dmesg
Ausgabe nach dem Booten). Sie sollten sehen können, an welchen physikalischen Adressen Sie echten, nutzbaren RAM haben.
(Andere x86-Macken und reservierte Speicherbereiche machen wahrscheinlich den Rest aus – ich kenne die Details dort nicht.)
MemTotal
in /proc/meminfo
gibt den zur Verwendung verfügbaren RAM an. Gleich am Ende der Bootsequenz gibt der Kernel init
frei Daten, die es nicht mehr benötigt, also der Wert, der in /proc/meminfo
gemeldet wird könnte etwas höher sein als das, was der Kernel während der ersten Teile der Boot-Sequenz ausgibt.
(meminfo
verwendet indirekt totalram_pages
für diese Anzeige. Für x86_64 wird dies in arch/x86/mm/init_64.c
berechnet auch über free_all_bootmem()
die sich selbst in mm/bootmem.c
befindet für Nicht-NUMA-Kernel.)