C 将虚拟地址映射到特定的物理地址

C 将虚拟地址映射到特定的物理地址,c,virtual-memory,segmentation-fault,C,Virtual Memory,Segmentation Fault,我需要在用户模式下处理一些页面错误。我使用x86_64 Ubuntu-12.04 64位上的库 作为第一步,我想将一个未映射变量的虚拟地址映射到另一个已分配变量的相同物理地址。因为我已经将所有进程的内容移到了1GB以上 地址空间,我确信未映射的变量地址未被使用 #include <sys/mman.h> #include <sigsegv.h> int handler (void *fault_address, int serious) { printf("Pa

我需要在用户模式下处理一些页面错误。我使用x86_64 Ubuntu-12.04 64位上的库

作为第一步,我想将一个未映射变量的虚拟地址映射到另一个已分配变量的相同物理地址。因为我已经将所有进程的内容移到了1GB以上 地址空间,我确信未映射的变量地址未被使用

#include <sys/mman.h>
#include <sigsegv.h>

int handler (void *fault_address, int serious)
{
    printf("Page fault\n");
    return 0;
}

int main(void)
{
    sigsegv_install_handler (&handler);
    int* p = (void*)0x55555; // This virtual address is not used by the process
    int *q = malloc(sizeof(int));
    *p = 0x77; // This should have the same effect as *q=0x77
    return 0;
}

你试过什么吗?我真的不知道该试什么,mmap似乎不合适。我真的不明白你在问什么。尤其是将
0x55555
放入
p
的部分(您不能分配可能没有虚拟页面条目的随机虚拟地址)。您可能想要的是共享内存(
man shm_open
),但它对于单个进程似乎毫无意义!?或者您只是在寻找
p=q
?我想要p的虚拟地址的页面表条目,它指向与q相同的物理地址。当你取消p的引用时,你的物理地址与q相同。@NoWiS你是对的!我需要的是打开shm_来创建一个共享文件,从中可以直接映射
q
。然后在
*p=77
上,它将页面错误,我将把p映射到与q相同的位置(但p有不同的虚拟地址)。
Page fault
Page fault
Segmentation fault