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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top