Linux сопоставление виртуальной памяти диапазон для существующей виртуальной памяти?
-
25-09-2019 - |
Вопрос
В Linux есть путь (в пользовательском пространстве), чтобы отобразить виртуальный диапазон адресов на физические страницы, которые обратно существующий виртуальный диапазон адресов? Функция MMAP () позволяет только отображать файлы или «новые» физические страницы. Мне нужно иметь возможность сделать что-то вроде этого:
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
Решение
Мне было любопытно, поэтому я проверил идею общей памяти, предложив к вопросу о комментариях, и, похоже, работает:
#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;
}
(Очевидно, что Real Code захочет проверить возвращаемое значение SESCalls для ошибок и убирать после себя)
Другие советы
Если у вас есть FD для файла, отображаемого в addr1
, вы можете просто mmap
Это снова в addr2
.
В противном случае, специфичный Linux remap_file_pages
Может изменять виртуальный адрес ⇆ Перевод смещения файла в пределах одной VMA, с зернистостью размером страниц, включая сопоставление одного и того же смещения файла для нескольких адресов.
Открыть /proc/self/mem
а также mmap
Диапазон виртуальных адресов, которые вам нужен от него.