在我的signal.h文件中,我添加了一个像这样的信号处理程序:
#define SIG_WPG ((__sighandler_t)3)
然后在signal.c中实现它,如下所示:
if (ka->sa.sa_handler == SIG_WPG) {
unsigned long ul_cr2 = current->tss.cr2;
unsigned long ul_eip = (unsigned long) regs->eip
int ul_cr2_rounded = ul_cr2 & PAGE_MASK;
printk("ul_eip: %d\n", ul_eip);
printk("ul_cr2: %d\n", ul_cr2);
printk("ul_cr2_rounded: %d\n", ul_cr2_rounded);
}
如何让这个信号处理程序处理用户空间中的分段错误?
答案 0 :(得分:4)
您可以使用signal()
方法注册该异常的回调:
//callback prototype
void Handler(int sig);
//register the callback for the specific signal
signal(SIGSEGV,&Handler);
答案 1 :(得分:1)
解决方案是定义:
static struct sigaction segv_action
然后设置:
segv_action.sa_handler = SIG_WPG;
这是针对大学项目的,这些更改是在我们从学校获得的.c文件中完成的,因此可能还有其他需要我不知道的细节。