我需要在用户模式下处理一些页面错误。我在x86_64 Ubuntu-12.04 64位上使用GNU libsigsev库。
作为第一步,我想将未映射变量的虚拟地址映射到另一个已分配变量的相同物理地址。因为我已将所有进程的内容移动到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;
}
这可能吗?目前程序输出:
Page fault
Page fault
Segmentation fault