GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Warum zeigt Linux sowohl mehr als auch weniger Speicher an, als ich physisch installiert habe?

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.

Verwandte:Liste der vom Terminal generierten Signale (z. B. Strg-C -> SIGINT)?

(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.)


Linux
  1. Was ist ein Linux-Server und warum benötigt Ihr Unternehmen einen?

  2. Warum wiederholt rand() Zahlen viel öfter unter Linux als auf Mac?

  3. Warum verwendet Linux eine Swap-Partition und keine Datei?

  4. Was sind High Memory und Low Memory unter Linux?

  5. Warum unterscheiden sich Linux-Systemrufnummern in x86 und x86_64?

Df sagt, ich habe 20 g mehr Speicherplatz belegt als Du. Wieso den??

Linux – Was sind High Memory und Low Memory unter Linux?

Was ist der Grep-Befehl unter Linux? Warum wird es verwendet und wie funktioniert es?

6 Gründe, warum Linux nicht mehr Apps hat

Welche Prozesskiller hat Linux?

Warum zeigt top eine andere Anzahl von Kernen an als cpuinfo?