我正在构建一个程序,使用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);
}
此外,有没有一种方法可以确定一个内存块当前分配的mprotect()级别(PROT_NONE、PROT_READ等)?