cartographie Linux plage de mémoire virtuelle à la plage de mémoire virtuelle existante?
-
25-09-2019 - |
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
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.