Linux отображает диапазон виртуальной памяти в существующий диапазон виртуальной памяти? - PullRequest
3 голосов
/ 10 декабря 2010

В 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

Ответы [ 3 ]

3 голосов
/ 11 декабря 2010

Мне было любопытно, поэтому я протестировал идею общей памяти, предложенную в комментариях к вопросу, и, похоже, она работает:

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

(Очевидно, реальный код захочет проверить возвращаемое значение системных вызовов на наличие ошибок и очистить после себя)

1 голос
/ 10 декабря 2010

Если у вас есть fd для файла, отображенного на addr1, вы можете просто mmap снова на addr2.

В противном случае специфичная для Linux remap_file_pages может изменить виртуальный адрес translation преобразование смещения файла в пределах одного VMA с гранулярностью размера страницы, включая сопоставление одного и того же смещения файла с несколькими адресами.

0 голосов
/ 10 декабря 2010

Открыть /proc/self/mem и mmap диапазон нужных вам виртуальных адресов.

...