mprotect()を使用して、メモリのブロックへのアクセスを制限するプログラムを作成しています。メモリが要求されると、signal()呼び出しを使用してリッスンするSIGSEGVがスローされます。
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など)を判別する方法はありますか?