una pagina di memoria può essere spostato modificando la tabella delle pagine?

StackOverflow https://stackoverflow.com/questions/2679065

  •  30-09-2019
  •  | 
  •  

Domanda

E 'possibile (su qualsiasi sistema operativo ragionevole, preferibilmente Linux) per scambiare il contenuto di due pagine di memoria da solo modificando la tabella delle pagine e non in realtà in movimento tutti i dati?

La motivazione è una fitta matrice di trasposizione. Se i dati sono stati bloccati da dimensioni pagina sarebbe possibile trasporre i dati in una pagina (attacchi nella cache) quindi le pagine di scambio per spostare i blocchi nella loro posizione finale. Una grande matrice avrebbe molti molte pagine si trasferisce, quindi speriamo che il lavaggio del TLB non sarebbe causare problemi.

È stato utile?

Soluzione

Credo file mappato in memoria possono fare il trucco, ma mi sa che non ho mai provato io stesso. Usa mmap con MAP_ANONYMOUS alla mappa indirizzo virtuale over puro (senza supporto file fisico). Quindi è possibile rimappare il tuo 'file' in varie aree del VA ottenendo in effetti la semantica a zero-copy. In Windows devi usare MapViewOfFile con una maniglia di mapping di file creata usando CreateMapOfFile (INVALID_HANDLE_VALUE, ...), ma nota che su NT, non è possibile controllare il obiettivo della tua rimappatura (es. l'indirizzo VA recentemente mappato è il di uscita della chiamata di funzione), e su Linux l'indirizzo desiderato viene preso come un suggerimento .

Se questo non funziona, allora si sarebbe probabilmente necessario creare un modulo di gestione della memoria nel kernel, che non è fattibile per qualsiasi progetto concreto.

Altri suggerimenti

#include <stdio.h>
#include <string.h>

#define __USE_GNU
#include <unistd.h>
#include <sys/mman.h>

int main() {
    int PAGE_SIZE = getpagesize();
    char* m = NULL;
    void* temp;

    printf("page size = %d\n", PAGE_SIZE);

    m = (char*)mmap(0, PAGE_SIZE*3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    temp = m+PAGE_SIZE*2;

    memset(m, '0', PAGE_SIZE);
    memset(m+PAGE_SIZE, '1', PAGE_SIZE);

    printf("before %c %c\n", m[0], m[PAGE_SIZE]);

    mremap(m + PAGE_SIZE, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, temp); 
    mremap(m, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m+PAGE_SIZE); 
    mremap(temp, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m); 


    printf("after %c %c\n", m[0], m[PAGE_SIZE]);
    return 0;
}

In teoria, certamente. In pratica, ho che è possibile utilizzare mmap () per spostare i blocchi di memoria condivisa del sistema V-stile in questo modo.

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