una pagina di memoria può essere spostato modificando la tabella delle pagine?
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.
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.