Linux сопоставление виртуальной памяти диапазон для существующей виртуальной памяти?

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

Вопрос

В 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 Диапазон виртуальных адресов, которые вам нужен от него.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top