gpt4 book ai didi

linux - 是否可以更新现有内存映射的标志?

转载 作者:行者123 更新时间:2023-12-05 03:21:56 25 4
gpt4 key购买 nike

我正在用 x64 程序集编写一个小程序,它将产生子代,所有子代都共享它们的内存映射,以便它们可以修改彼此的代码。为此,由于 sys_clone 的参数 CLONE_VM 似乎将程序置于未定义的行为中,我计划使用 mmapMAP_SHARED 参数。

但是,我还需要 child 修改父亲的代码。一种选择是还分配一个 MAP_SHARED 映射并将其提供给父亲,但我想尽可能避免这种情况(仅出于优雅的原因)。

由于程序的基本映射(64 位 Linux 上的 0x400000)默认情况下不会有 MAP_SHARED 标志,是否可以使用更新它设置此标志的系统调用? munmap 然后 mmap 将不会执行并导致 SIGSEGV,并且 mprotect 只能更改 RWX 权限。

最佳答案

您无法更改现有映射是私有(private)映射还是共享映射,但您可以在现有私有(private)映射之上映射新的共享映射。您甚至可以在 C 中这样做,如下所示:

#define _GNU_SOURCE

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>

int main(void) {
FILE *stream = fopen("/proc/self/maps", "rb");
if(!stream) {
perror("fopen");
return 1;
}
char *text_start, *text_end;
do {
if(fscanf(stream, " %p-%p%*[^\n]", &text_start, &text_end) != 2) {
perror("scanf");
return 1;
}
} while(!(text_start <= main && main < text_end));
if(fclose(stream)) {
perror("fclose");
return 1;
}
size_t text_len = text_end - text_start;
char *mem = mmap(NULL, text_len, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
if(mem == MAP_FAILED) {
perror("mmap");
return 1;
}
memcpy(mem, text_start, text_len);
__builtin___clear_cache(mem, mem + text_len);
if(mremap(mem, text_len, text_len, MREMAP_MAYMOVE|MREMAP_FIXED, text_start) == MAP_FAILED) {
perror("mremap");
return 1;
}
/* you can check /proc/PID/maps now to see the new mapping */
getchar();
}

作为奖励,该程序支持 ASLR,并且不要求文本部分从 0x400000 开始。

关于linux - 是否可以更新现有内存映射的标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72858397/

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