0

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

4

1 回答 1

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。

于 2013-01-30T02:55:36.483 回答