gpt4 book ai didi

c - Linux 将虚拟内存范围映射到现有的虚拟内存范围?

转载 作者:太空狗 更新时间:2023-10-29 11:11:15 26 4
gpt4 key购买 nike

在 Linux 中,是否有一种方法(在用户空间中)将虚拟地址范围映射到支持现有虚拟地址范围的物理页面? mmap() 函数只允许映射文件或"new"物理页面。我需要能够做这样的事情:

int* addr1 = malloc(SIZE);
int* addr2 = 0x60000; // Assume nothing is allocated here
fancy_map_function(addr1, addr2, SIZE);
assert(*addr1 == *addr2); // Should succeed
assert(addr1 != addr2); // Should succeed

最佳答案

我很好奇,所以我测试了问题评论中建议的共享内存想法,它似乎有效:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <assert.h>

#define SIZE 256
int main (int argc, char ** argv) {
int fd;
int *addr1, *addr2;

fd = shm_open("/example_shm", O_RDWR | O_CREAT, 0777);
ftruncate( fd, SIZE);
addr1 = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
addr2 = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

printf("addr1 = %p addr2 = %p\n", addr1, addr2);
*addr1 = 0x12345678;
assert(*addr1 == *addr2); // Should succeed
assert(addr1 != addr2); // Should succeed

return 0;
}

(显然真正的代码会想要检查系统调用的返回值是否有错误并自行清理)

关于c - Linux 将虚拟内存范围映射到现有的虚拟内存范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404917/

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