Можно ли переместить страницу памяти, изменив таблицу страниц? - PullRequest
3 голосов
/ 21 апреля 2010

Можно ли (на любой разумной ОС, предпочтительно Linux) поменять содержимое двух страниц памяти, изменив только таблицу страниц и фактически не перемещая какие-либо данные?

Мотивация - плотная матрица транспонирования. Если данные были заблокированы по размеру страницы, можно было бы транспонировать данные внутри страницы (помещается в кэш), а затем поменять местами страницы, чтобы переместить блоки на их окончательное место. В большой матрице будет перемещено много страниц, поэтому, надеюсь, очистка TLB не вызовет проблем.

Ответы [ 3 ]

1 голос
/ 21 апреля 2010
#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;
}
0 голосов
/ 21 апреля 2010

В теории, конечно. На практике я думаю , что вы можете использовать mmap () для перемещения системных блоков общей памяти в стиле V таким образом.

0 голосов
/ 21 апреля 2010

Я думаю, что файлы с отображением в памяти могут помочь, но я считаю, что никогда не пробовал это сам. Используйте mmap с MAP_ANONYMOUS, чтобы отобразить чистый виртуальный адрес (без поддержки физического файла). Затем вы можете переназначить ваш «файл» в различные области виртуальной машины, получая семантику нулевого копирования. В Windows вы бы использовали MapViewOfFile с дескриптором отображения файла, созданным с помощью CreateMapOfFile (INVALID_HANDLE_VALUE, ...), но обратите внимание, что в NT вы не можете контролировать target вашего переотображения (т.е. . Недавно назначенный адрес VA является выводом вызова функции), а в Linux требуемый адрес принимается как подсказка .

Если это не сработает, вам, вероятно, потребуется создать модуль ядра в ядре, что невозможно для любого практического проекта.

...