mapeo Linux rango de memoria virtual al rango de memoria virtual existente?
-
25-09-2019 - |
Pregunta
En Linux, ¿hay alguna manera (en el espacio de usuario) para asignar un intervalo de direcciones virtuales a las páginas físicas que respaldan un rango de direcciones virtual existente? La función mmap () sólo permite una para asignar archivos o páginas físicas "nuevos". Tengo que ser capaz de hacer algo como esto:
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
Solución
Tenía curiosidad por lo que probé la idea de memoria compartida se sugiere en los comentarios de interrogación, y parece que funciona:
#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;
}
(código Obviamente real se desee comprobar el valor de retorno de las llamadas al sistema en busca de errores y limpiar después de sí mismo)
Otros consejos
Si usted tiene la FD para el archivo asignado al addr1
, puede simplemente mmap
de nuevo en addr2
.
De lo contrario, la específica de Linux remap_file_pages
puede modificar la dirección de ⇆ archivo rama virtual traducción dentro de una única VMA, con el tamaño de una página de detalle, incluyendo el mapeo de la misma desplazamiento de archivo a varias direcciones.
/proc/self/mem
abierto y mmap
el rango de direcciones virtuales que necesita de ella.