Domanda

In Linux, c'è un modo (in spazio utente) per mappare un intervallo di indirizzi virtuali alle pagine fisiche che eseguono il backup di un intervallo di indirizzi virtuale esistente? La funzione mmap () consente a un solo ai map file o "nuove" pagine fisiche. Ho bisogno di essere in grado di fare qualcosa di simile:

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
È stato utile?

Soluzione

Ero curioso così ho provato l'idea di memoria condivisa suggerito nei commenti questione, e sembra funzionare:

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

(codice Ovviamente reale vorrà controllare il valore di ritorno delle chiamate di sistema per gli errori e pulire dopo se stessa)

Altri suggerimenti

Se avete la fd per il file mappato in addr1, si può semplicemente mmap di nuovo a addr2.

In caso contrario, il Linux-specifica remap_file_pages può modificare il file virtuale indirizzo ⇆ offset di traduzione all'interno di un unico VMA, con la pagina di dimensioni granularità, compresa la mappatura di offset a più indirizzi lo stesso file.

Apri /proc/self/mem e mmap l'intervallo di indirizzi virtuali è necessario da esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top