设置分段错误处理程序

时间:2011-12-13 13:36:25

标签: c linux linux-kernel

在我的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);
    }

如何让这个信号处理程序处理用户空间中的分段错误?

2 个答案:

答案 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文件中完成的,因此可能还有其他需要我不知道的细节。