Die korrekten Begriffe sind speicherabgebildete Dateien und anonyme Zuordnungen. Wenn man sich auf Memory Mapping bezieht, bezieht man sich normalerweise auf mmap(2). Es gibt 2 Kategorien für die Verwendung von mmap. Eine Kategorie ist SHARED vs. PRIVATE Mappings. Die andere Kategorie ist FILE vs. ANONYMOUS-Mappings. Zusammengemischt ergeben sich die 4 folgenden Kombinationen:
- PRIVATE DATEI ZUORDNUNG
- ZUORDNUNG FREIGEGEBENER DATEIEN
- PRIVATE ANONYME ZUORDNUNG
- GETEILTE ANONYME ZUORDNUNG
Eine Dateizuordnung gibt eine Datei auf der Festplatte an, die N viele Bytes im Speicher zugeordnet hat. Die Funktion mmap(2) nimmt als viertes Argument einen Dateideskriptor für die in den Speicher abzubildende Datei. Das 5. Argument ist die Anzahl der einzulesenden Bytes als Offset. Der typische Prozess der Verwendung von mmap zum Erstellen einer speicherabgebildeten Datei lautet
- Datei öffnen(2), um einen Dateideskriptor zu erhalten.
- fstat(2) die Datei, um die Größe aus der Dateideskriptor-Datenstruktur zu erhalten.
- mmap(2) die Datei, die den von open(2) zurückgegebenen Dateideskriptor verwendet.
- Schließen(2) Sie den Dateideskriptor.
- was auch immer mit der speicherabgebildeten Datei machen.
Wenn eine Datei als PRIVATE zugeordnet wird, werden vorgenommene Änderungen nicht an die zugrunde liegende Datei übertragen. Es ist eine PRIVATE Kopie der Datei im Arbeitsspeicher. Wenn eine Datei SHARED zugeordnet wird, werden vorgenommene Änderungen vom Kernel automatisch in die zugrunde liegende Datei übernommen. Dateien, die als Shared gemappt sind, können für sogenannte Memory Mapped I/O und IPC verwendet werden. Sie würden eine speicherabgebildete Datei für IPC anstelle eines gemeinsam genutzten Speichersegments verwenden, wenn Sie die Persistenz der Datei
benötigenWenn Sie strace(1) verwenden, um die Initialisierung eines Prozesses zu beobachten, werden Sie feststellen, dass die verschiedenen Abschnitte der Datei mit mmap(2) als private Dateizuordnungen abgebildet werden. Dasselbe gilt für Systembibliotheken.
Beispiele für die Ausgabe von strace(1), wo mmap(2) verwendet wird, um Bibliotheken dem Prozess zuzuordnen.
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42238, ...}) = 0
mmap(NULL, 42238, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff7ca71e000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\356\341n8\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1926760, ...}) = 0
mmap(0x386ee00000, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x386ee00000
Anonyme Zuordnungen werden nicht durch eine Datei gesichert. Genauer gesagt werden das 4. (Dateideskriptor) und 5. (Offset) Argument von mmap(2) nicht einmal verwendet, wenn das MAP_ANONYMOUS-Flag als 3. Argument von mmap(2) verwendet wird. Eine Alternative zur Verwendung des Flags MAP_ANONYMOUS ist die Verwendung von /dev/zero als Datei.
Das Wort „Anonym“ ist meiner Meinung nach eine schlechte Wahl, da es so klingt, als ob die Datei anonym abgebildet wird. Stattdessen ist es die Datei, die anonym ist, dh. Es ist keine Datei angegeben.
Verwendungen für private anonyme Mappings sind in der User-Land-Programmierung rar. Sie könnten eine gemeinsam genutzte anonyme Zuordnung verwenden, damit Anwendungen einen Speicherbereich gemeinsam nutzen können, aber ich kenne den Grund nicht, warum Sie stattdessen nicht den gemeinsam genutzten SYSV- oder POSIX-Speicher verwenden würden.
Da Speicher, der mit anonymen Zuordnungen abgebildet wird, garantiert mit Null gefüllt ist, könnte es für einige Anwendungen nützlich sein, die mit Null gefüllte Speicherbereiche erwarten/erfordern, mmap(2) auf diese Weise anstelle von malloc(2) + memset(2) zu verwenden ) Kombination.
Soweit ich weiß, werden anonyme Seiten so genannt, weil sie keine benannte Dateisystemquelle haben, während zugeordnete Seiten eine Zuordnung einer konkreten Datei sind. Zum Beispiel können Sie anonyme Seiten mit einer einfachen Malloc-Operation in jedem Userspace-Prozess erhalten ...
Über Kernel-Strukturen:Offensichtlich ist es struct page , aber im Fall der Anonymos-Seiten haben Sie struct anon_vma sitzt in page->mapping und im Falle von gemappten Seiten - struct address_space , die mit konkretem Inode verbunden ist.