Question

Linux, est-il un moyen (dans l'espace utilisateur) pour mapper une plage d'adresses virtuelles aux pages physiques qui sauvegardent une plage d'adresses virtuelle existante? La fonction mmap () permet seule à CARTOGRAPHIE ou « nouvelles » pages physiques. Je dois pouvoir faire quelque chose comme ceci:

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
Était-ce utile?

La solution

J'étais curieux si je l'ai testé l'idée de mémoire partagée suggéré dans les commentaires de question, et il semble fonctionner:

#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;
}

(Il est évident que le code réel voudra vérifier la valeur de retour des appels système pour les erreurs et nettoyer après lui-même)

Autres conseils

Si vous avez le fd pour le fichier mis en correspondance à addr1, vous pouvez simplement mmap nouveau à addr2.

Dans le cas contraire, le remap_file_pages peut modifier le fichier adresse virtuelle ⇆ traduction décalage à l'intérieur d'un seul VMA, avec granularité de page de taille, y compris la cartographie du même fichier de décalage à plusieurs adresses.

/proc/self/mem Ouvrir et mmap la plage d'adresses virtuelles que vous avez besoin de lui.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top