【发布时间】:2014-07-03 07:13:36
【问题描述】:
我正在尝试使用 malloc 分配两个不同的 4096 字节,并使用不同的值初始化这些分配。之后,我希望其中一个指针指向另一个分配“不”改变 p1 的值和“不”复制数据。我想将第二个分配“重新映射”到第一个分配,这基本上应该改变进程页表中的虚拟地址,即不涉及复制。当我运行此代码时,我得到 mremap 失败。知道如何做到这一点吗?
int main(){
char *p1 = (char *)malloc(4096);
memset(p1, 'a', 4096);
char *p2 = (char *)malloc(4096);
memset(p2, 'b', 4096);
printf("p1 is %c at address %p\n", p1[0], p1);
printf("p2 is %c at address &p\n", p2[0], p2);
free(p1);
/* remapping virtual addresses */
void *p0 = mremap(p2, 4096, 4096, MREMAP_MAYMOVE | MREMAP_FIXED, p1);
/* checking */
printf("p0 is %c at address %p\n", p0[c], p0);
return 0;
}
预期输出: p1 是地址 xxx p2 是 b 在地址 yyy p0 是地址 xxx 处的 b
【问题讨论】:
-
来自手册页:“如果指定了 MREMAP_FIXED,则还必须指定 MREMAP_MAYMOVE。”您是否可能需要按位 & 而不是 |?
-
@cecilg23:它们都是指定的。按位
|对组合位标志是正确的 - 按位&通常总是给你零。
标签: c linux memory-management