我正在尝试使用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 地址yyy的p2是b p0是地址xxx处的b
答案 0 :(得分:3)
malloc()
返回的地址可能不是页面对齐的,因此mremap()
将errno
设置为EINVAL
。如果我使用mmap()
代替malloc()
,请修复代码中的语法错误:
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
int main(void) {
char *p1 = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
memset(p1, 'a', 4096);
char *p2 = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
memset(p2, 'b', 4096);
printf("p1 is %c at address %p\n", p1[0], (void *)p1);
printf("p2 is %c at address %p\n", p2[0], (void *)p2);
void *p0 = mremap(p2, 4096, 4096, MREMAP_MAYMOVE | MREMAP_FIXED, p1);
if ( p0 == MAP_FAILED ) {
perror("mremap: mremap failed");
return EXIT_FAILURE;
}
printf("p0 is %c at address %p\n", ((char *)p0)[0], p0);
return EXIT_SUCCESS;
}
然后我得到:
paul@local:~/src/c/scratch$ ./mremap
p1 is a at address 0x7f5addb71000
p2 is b at address 0x7f5addb70000
p0 is b at address 0x7f5addb71000
paul@local:~/src/c/scratch$