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()级别?
你必须使用sigaction具有SA_SIGINFO的,而不是signal建立您的处理程序,然后你会得到回叫以有用的信息siginfo_t,包括si_addr.
si_addr,如sigaction(2)中所述,将包含地址.至于长度,除非你愿意解析说明,否则你运气不好.你能做的最好就是对报告的页面采取行动si_addr,然后如果这还不够,你很快就会得到另一个信号.至少,这就是我们在ObjectStore中做事的方式.