C SIGSEGV Handler&Mprotect

pws*_*068 4 signals handler mprotect segmentation-fault

我正在构建一个程序,它使用mprotect()来限制一块内存访问.当请求内存时,抛出SIGSEGV,我使用signal()调用来监听.

一旦检测到SIGSEGV,我需要以某种方式访问​​指向所请求的内存(引发错误)的指针以及所请求的段的大小.这可能吗?

void fifoSigHandler(){

    // Needs to only remove protection from requested block of virtual memory
    mprotect(fifoVm,(size_t)fifoVm_size,PROT_WRITE);
    printf("Caught Seg Fault");
}

void fifo_init(void* vm, int vm_size, int n_frames, int page_size)
{
    fifoVm = vm;
    fifoVm_size = vm_size;
    fifoFrames = n_frames;
    fifoPageSize = page_size;

    mprotect(fifoVm,(size_t)fifoVm_size,PROT_NONE);

    signal(SIGSEGV, fifoSigHandler);
}
Run Code Online (Sandbox Code Playgroud)

另外,有没有办法确定当前分配的内存块(PROT_NONE,PROT_READ等等)的mprotect()级别?

bma*_*ies 6

你必须使用sigaction具有SA_SIGINFO的,而不是signal建立您的处理程序,然后你会得到回叫以有用的信息siginfo_t,包括si_addr.

si_addr,如sigaction(2)中所述,将包含地址.至于长度,除非你愿意解析说明,否则你运气不好.你能做的最好就是对报告的页面采取行动si_addr,然后如果这还不够,你很快就会得到另一个信号.至少,这就是我们在ObjectStore中做事的方式.

  • 我们如何参考这些有用的信息?具体是指向所请求内存的指针和大小 (2认同)