如何检查系统调用是否来自信号处理程序?

时间:2013-01-28 15:28:55

标签: linux linux-kernel system-calls

如果从信号处理程序调用它,我试图以不同的方式使一个系统调用行为,但我找不到检查这种情况的方法。我可以检查当前线程或任务结构中是否有标志? TIF_SIGPENDING似乎不起作用......

1 个答案:

答案 0 :(得分:0)

现在没有这样的旗帜。 TIF_SIGPENDING是一个标记信号待处理的标志,而不是处理信号。如果信号处理程序从未被解除,该系统可以正常工作。系统调用和信号处理程序的执行是序列化的。

一种方法是回溯用户空间调用堆栈以在信号帧中搜索架构的特殊幻数,如arch / i386 / kernel / signal.c中所述 - setup_frame():

/*
 * This is popl %eax ; movl $,%eax ; int $0x80
 *
 * WE DO NOT USE IT ANY MORE! It's only left here for historical
 * reasons and because gdb uses it as a signature to notice
 * signal handler stack frames.
 */
err |= __put_user(0xb858, (short __user *)(frame->retcode+0));
err |= __put_user(__NR_sigreturn, (int __user *)(frame->retcode+2));
err |= __put_user(0x80cd, (short __user *)(frame->retcode+6));

但是既然你正在改变内核,为什么不直接破解呢?只需操作handle_signal / sys_sigreturn / sys_rt_sigreturn中的计数器。而且你需要涵盖所有异常,例如这样的信号处理程序从不调用sigreturn。