gpt4 book ai didi

linux - 进程虚拟内存

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:17 25 4
gpt4 key购买 nike

进程可以有几个虚拟页指向同一地址空间中的同一物理地址吗?

我想要 virt_page1---> 物理-X还有 virt_page2 ---> 物理-X

如何才能做到呢?应该从内核空间完成吗?涉及哪些例程?

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

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

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

更新:

在禁用 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时的.so映射00007ffff7a1a000 1748K r-x--/lib/x86_64-linux-gnu/libc-2.15.so

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

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

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

最佳答案

是的,可以从用户空间实现。最简单的方法是 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);

关于linux - 进程虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20249871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com