Linux-Mapping virtueller Speicherbereich virtuellen Speicherbereich zu bestehenden?
-
25-09-2019 - |
Frage
Unter Linux gibt es eine Möglichkeit (im User-Space) einen virtuellen Adressbereich auf die physikalischen Seiten abzuzubilden, die einen vorhandenen virtuellen Adressbereich unterstützen? Die mmap () Funktion erlaubt nur eine Dateien abzubilden oder „neue“ physische Seiten. Ich muss in der Lage sein, so etwas zu tun:
int* addr1 = malloc(SIZE);
int* addr2 = 0x60000; // Assume nothing is allocated here
fancy_map_function(addr1, addr2, SIZE);
assert(*addr1 == *addr2); // Should succeed
assert(addr1 != addr2); // Should succeed
Lösung
Ich war neugierig, so dass ich die Shared-Memory-Idee vorgeschlagen in Frage Kommentaren getestet, und es scheint zu funktionieren:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <assert.h>
#define SIZE 256
int main (int argc, char ** argv) {
int fd;
int *addr1, *addr2;
fd = shm_open("/example_shm", O_RDWR | O_CREAT, 0777);
ftruncate( fd, SIZE);
addr1 = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
addr2 = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("addr1 = %p addr2 = %p\n", addr1, addr2);
*addr1 = 0x12345678;
assert(*addr1 == *addr2); // Should succeed
assert(addr1 != addr2); // Should succeed
return 0;
}
(Natürlich echter Code will den Rückgabewert des syscalls auf Fehler zu überprüfen und nach selbst aufzuzuräumen)
Andere Tipps
Wenn Sie die fd für die Datei auf addr1
abgebildet, können Sie einfach mmap
es wieder bei addr2
.
Ansonsten ist die Linux-spezifische remap_file_pages
kann die virtuelle Adresse ⇆ Datei mit Seitengröße ausgelegten Granularität innerhalb eines einzigen VMA, Offset Übersetzung ändert die gleiche Datei an mehreren Adressen Offset einschließlich Zuordnung.
Öffnen /proc/self/mem
und mmap
den Bereich der virtuellen Adressen, die Sie von ihm brauchen.