Warum zeigt Linux mehr und weniger Speicher an, als ich physisch installiert habe?

11

Ich weiß über Swap Bescheid - bei dieser Frage geht es nicht darum. In dmesg sagt mir der Linux-Kernel (x86-64) 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 = 4194304k RAM haben. Welches ist viel kleiner als die zweite Zahl in der dmesg-Zeile oben!

Was ist mit all diesen verschiedenen Figuren?

Übrigens uname -a:

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
Robin Green
quelle

Antworten:

20

Sie sollten die dmesgWerte "Speicher Akb / Bkb verfügbar" wie folgt lesen :

Derzeit steht A zur Verfügung, und die höchste Seitenrahmennummer des Systems multipliziert mit der Seitengröße ist B.

Dies ist von 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, die vom Kernel verwaltet wird und derzeit nicht verwendet wird. max_pfnist die höchste Seitenrahmennummer (die PAGE_SHIFTVerschiebung konvertiert diese in kb). Die höchste Seitenrahmennummer kann (viel) höher sein als erwartet - die vom BIOS durchgeführte Speicherzuordnung kann Lücken enthalten.
Wie viel diese Löcher aufnehmen, wird von der absent_pagesVariablen verfolgt, die als angezeigt wird kB absent. Dies sollte den größten Unterschied zwischen der zweiten Nummer in der "verfügbaren" Ausgabe und Ihrem tatsächlich installierten RAM erklären.

Sie können für grep BIOS-e820in dmesg„sehen“ diese Löcher. Dort wird die Speicherzuordnung angezeigt (ganz oben in der dmesgAusgabe nach dem Start). Sie sollten in der Lage sein zu sehen, an welchen physischen Adressen Sie über echten, verwendbaren RAM verfügen.
(Andere x86-Macken und reservierte Speicherbereiche machen wahrscheinlich den Rest aus - ich kenne die Details dort nicht.)

MemTotalin /proc/meminfozeigt an, dass RAM zur Verwendung verfügbar ist. Gleich am Ende der Startsequenz gibt der Kernel initDaten frei, die er nicht mehr benötigt, sodass der gemeldete Wert /proc/meminfoetwas höher sein kann als der Wert, den der Kernel während der ersten Teile der Startsequenz ausgibt.

( meminfoWird indirekt totalram_pagesfür diese Anzeige verwendet. Für x86_64 wird dies ebenfalls berechnet, arch/x86/mm/init_64.cüber free_all_bootmem()das sich selbst mm/bootmem.cNicht-NUMA-Kernel befinden.)

Matte
quelle