¿Puede una página de memoria puede mover mediante la modificación de la tabla de páginas?

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

  •  30-09-2019
  •  | 
  •  

Pregunta

¿Es posible (en cualquier sistema operativo razonable, preferentemente Linux) para intercambiar el contenido de dos páginas de memoria sólo por la modificación de la tabla de páginas y en realidad no se mueve ningún dato?

La motivación es una densa matriz de transposición. Si los datos fueron bloqueados por tamaño de página sería posible transponer los datos dentro de una página (ataques en caché), entonces las páginas del intercambio para mover los bloques en su lugar definitivo. Un gran matriz tendría muchas muchas páginas se movió, así que espero que tirar de la TLB ¿no causa problemas.

¿Fue útil?

Solución

Creo archivos de memoria asignada pueden hacer el truco, pero creo que nunca he tratado yo mismo. Uso mmap con MAP_ANONYMOUS al mapa dirección virtual más pura (sin respaldo de archivo físico). A continuación, puede volver a asignar el 'archivo' en diversas áreas de la Administración de Veteranos en la obtención de efectos semántica copia cero. En Windows tendrá que utilizar MapViewOfFile con un mango de asignación de archivos creado usando CreateMapOfFile (INVALID_HANDLE_VALUE, ...), pero tenga en cuenta que en el NT no se puede controlar el target de la reasignación es decir. la dirección de VA recién asignada es la salida ( de la llamada de función), y en Linux la dirección deseada se toma como un pista .

Si esto no funciona, entonces usted probablemente necesita para crear un módulo gestor de memoria en el kernel, lo cual no es factible para cualquier proyecto práctico.

Otros consejos

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

En teoría, desde luego. En la práctica, I que Puede utilizar mmap () para mover los bloques de memoria compartida del sistema de tipo V de esta manera.

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