0

システム コールがシグナル ハンドラから呼び出された場合、システム コールを別の方法で動作させようとしていますが、この状態をチェックする方法が見つかりません。現在のスレッドまたはタスク構造に確認できるフラグはありますか? TIF_SIGPENDING が機能していないようです...

4

1 に答える 1

0

現在、そのようなフラグはありません。TIF_SIGPENDING は、処理中のシグナルではなく、保留中のシグナルをマークするフラグです。システムは、シグナル ハンドラーが決して閉じられない場合に機能するように設計されています。syscall とシグナル ハンドラの実行はシリアル化されます。

1 つの方法は、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 に答える