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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top