首页 文章

处理虚拟内存

提问于
浏览
0

处理过程中是否有几个虚拟页面指向同一地址空间中的同一物理地址?

我想要virt_page1 ---> physical-X以及virt_page2 ---> physical-X

怎么做到呢 ?它应该从内核空间完成吗?什么惯例涉及?

如果我想像这样映射共享库:

7ff2a90d8000-7ff2a928d000 r-xp 00000000 08:02 4980747 /lib/x86_64-linux-gnu/libc-2.15.so 7ff2a928d000-7ff2a948d000 --- p 001b5000 08:02 4980747 /lib/x86_64-linux-gnu/libc-2.15 . 所以7ff2a948d000-7ff2a9491000 r - p 001b5000 08:02 4980747 /lib/x86_64-linux-gnu/libc-2.15.so 7ff2a9491000-7ff2a9493000 rw-p 001b9000 08:02 4980747 /lib/x86_64-linux-gnu/libc-2.15 . 所以

我看到映射是私有的,是否意味着我无法将它们再次映射到其他虚拟地址?我应该更改链接器吗?

更新:

在禁用ASLR时,我执行了以下操作:

int main(void)
{
  int fd = open("/lib/x86_64-linux-gnu/libc-2.15.so", O_RDONLY);
  void* f1 = mmap(0, 1748*1024, PROT_READ|PROT_EXEC, MAP_PRIVATE, fd, 0);
  void *f2 = (void*)0x00007ffff7a1a000;

  if (memcmp(f1, f2, 1748*1024) != 0) {
      printf("DIFFER\n");
  }
  while(1);
  return 0;
}

当没有ASLR 00007ffff7a1a000 1748K r-x-- /lib/x86_64-linux-gnu/libc-2.15.so时,这是.so映射

所以我把上面的区域映射到其他页面,我得到了这个:

00007ffff7e26000 1748K r-x-- /lib/x86_64-linux-gnu/libc-2.15.so

虽然我比较f1和f2我看到相同的数据,是不是说我现在已经将虚拟区域映射到相同的物理地址,这是1748K的共享库部分?

1 回答

  • 0

    是的,可以从用户空间 . 最简单的方法是将同一个文件两次 mmap .

    char templ[] = "XXXXXXXX";
    int fd = mkstemp(templ);
    ftruncate(fd, 1024);
    void* f1 = mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    void* f2 = mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    strcpy (f1, "foo bar baz weep quup");
    printf ("%p %s\n", f1, (char*)f1);
    printf ("%p %s\n", f2, (char*)f2);
    

相关问题