Speichergröße für den Kernel-mmap-Betrieb

9

Ich interessiere mich für die Art und Weise, wie Linux-MMAP-Dateien in den Hauptspeicher (in meinem Kontext zum Ausführen, aber ich denke, der MMAP-Prozess ist auch beim Schreiben und Lesen derselbe) und welche Größe er verwendet.

Ich weiß also, dass Linux Paging mit einer Seitengröße von normalerweise 4 KB verwendet (wo im Kernel kann ich diese Größe finden?). Aber was genau bedeutet das für den zugewiesenen Speicher: Angenommen, Sie haben eine Binärdatei mit einer Größe von einigen tausend Bytes, sagen wir einfach 5812B, und Sie führen sie aus. Was passiert im Kernel: Weist er 2 * 4 KB zu und kopiert dann den 5812B in diesen Speicherplatz, wodurch> 3 KB Hauptspeicher auf der 2. Seite verschwendet werden?

Es wäre großartig, wenn jemand die Datei in der Kernelquelle kennen würde, in der die Seitengröße definiert ist.

Meine zweite Frage ist auch sehr einfach, denke ich: Ich habe 5812B als Dateigröße angenommen. Ist es richtig, dass diese Größe einfach der Inode entnommen wird?

Rui F Ribeiro
quelle

Antworten:

6

Es gibt keine direkte Beziehung zwischen der Größe der ausführbaren Datei und der Größe im Speicher. Hier ist eine sehr schnelle Übersicht darüber, was passiert, wenn eine Binärdatei ausgeführt wird:

  1. Der Kernel analysiert die Datei und unterteilt sie in Abschnitte. Einige Abschnitte werden auf separaten Seiten direkt in den Speicher geladen. Einige Abschnitte werden überhaupt nicht geladen (z. B. Debugging-Symbole).
  2. Wenn die ausführbare Datei dynamisch verknüpft ist, ruft der Kernel den dynamischen Loader auf, lädt die erforderlichen gemeinsam genutzten Bibliotheken und führt die Link-Edition nach Bedarf durch.
  3. Das Programm beginnt mit der Ausführung seines Codes und fordert normalerweise mehr Speicher zum Speichern von Daten an.

Weitere Informationen zu ausführbaren Formaten, zum Verknüpfen und zum Laden ausführbarer Dateien finden Sie unter Linker und Loader von John R. Levine .

In einer ausführbaren 5-KB-Datei ist es wahrscheinlich, dass alles Code oder Daten sind, die bis auf den Header in den Speicher geladen werden müssen. Der ausführbare Code besteht aus mindestens einer Seite, möglicherweise zwei, und dann gibt es mindestens eine Seite für den Stapel, wahrscheinlich eine Seite oder für den Heap (andere Daten) sowie den von gemeinsam genutzten Bibliotheken verwendeten Speicher.

Unter Linux können Sie die Speicherzuordnungen auf eine ausführbare Datei mit überprüfen cat /proc/$pid/maps. Das Format ist in der proc(5)Manpage dokumentiert ; Siehe auch Grundlegendes zu Linux / proc / id / maps .

Gilles 'SO - hör auf böse zu sein'
quelle
0

Ja, Sie erhalten schließlich zwei 4k-Seiten. Daten werden bei Bedarf geladen. Wenn sich also nie etwas auf die zweite Seite bezieht, werden sie niemals in den Speicher geladen.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Ändern Sie diese Werte nicht und erwarten Sie, dass etwas funktioniert.

Ja, die Dateigröße wird im Inode in ext2 / 3 gespeichert.

pjc50
quelle
0

Für den Definitionsteil auf einem 2.6.38 ~ ish-Kernel für die Intel-Architektur:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFT bestimmt die Seitengröße * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

Frederik Deweerdt
quelle