首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程虚拟内存

进程虚拟内存
EN

Stack Overflow用户
提问于 2013-11-28 02:05:24
回答 1查看 337关注 0票数 0

进程是否可以在其相同的地址空间中有几个指向相同物理地址的虚拟页?

我想要VirtPage1-> 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.so 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.so

我发现映射是私有的,这是否意味着我不能再次将它们映射到其他虚拟地址?我应该为此改变链接器吗?

更新:

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

代码语言:javascript
复制
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;
}

这是没有ASLR00007ffff7a1a000 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的共享库部分?

EN

回答 1

Stack Overflow用户

发布于 2013-11-28 02:45:57

是的,这在用户空间是可能的。最简单的方法是将同一个文件mmap两次。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20249871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档