2011-06-24 8 views

答えて

29

それはとてもhttp://tomoyo.sourceforge.jp/cgi-bin/lxr/source/arch/x86/include/asm/user_32.h#L77

73 * is still the layout used by user mode (the new 
74 * pt_regs doesn't have all registers as the kernel 
75 * doesn't use the extra segment registers) 

....である、struct pt_regsであったので、互換性があるように(あまりにもuser_regs_structに含まれているので、ユーザ空間のユーティリティの多くは、ここorig_eaxフィールドを期待古いデバッガやptrace RS)と

次の質問は「なぜstruct pt_regsに含まorig_eaxメンバーは?」です。

これはlinux 0.95 http://lxr.linux.no/#linux-old+v0.95/include/sys/ptrace.h#L44に追加されました。 これは、pt_regs構造体を持ついくつかの他のUNIXの後で行われたことをお勧めします。 0.95でのコメント

29 * this struct defines the way the registers are stored on the 
    30 * stack during a system call. 

だから、orig_eaxの場所はシステムコールインタフェースで定義されていると言います。私たちは二度古いeaxを保存する必要がなぜここでは、http://lxr.linux.no/#linux-old+v0.95/kernel/sys_call.s

17 * Stack layout in 'ret_from_system_call': 
    18 *  ptrace needs to have all regs on the stack. 
    19 *  if the order here is changed, it needs to be 
    20 *  updated in fork.c:copy_process, signal.c:do_signal, 
    21 *  ptrace.c ptrace.h 
    22 * 
    23 *  0(%esp) - %ebx 
... 
    29 *  18(%esp) - %eax 
... 
    34 *  2C(%esp) - orig_eax 

のですか? eaxは、システムコールの戻り値(ビット以下同じファイル)のために使用されるため:

96_system_call: 
    97  cld 
    98  pushl %eax    # save orig_eax 
    99  push %gs 
... 
102  push %ds 
103  pushl %eax    # save eax. The return value will be put here. 
104  pushl %ebp 
... 
117  call _sys_call_table(,%eax,4) 

ptraceのは、システムコールとシステムコールの戻り値の前にすべてのレジスタの状態の両方を読み取ることができる必要があります。戻り値は%eaxに書き込まれます。その後、元のeaxは、syscallが失われる前に使用されます。保存するには、orig_eaxフィールドがあります。

更新:R ..と偉大なLXRのおかげで、私はlinux 0.95でorig_eaxの完全な検索を行いました。システムコールを再起動するときにはptraceのではなく、do_signalではないだけに使用されて

(システムコールがある場合、ERESTARTSYSで終了)

158      *(&eax) = orig_eax; 

アップデート2:ライナスsaidそれについて何か面白いもの:

ORIG_EAXはではない 有効なシステムコール番号であるため、システムコール再開ロジック( シグナル処理コード)はトリガしません。

Update3と:システムコール番号を変更するorig_eaxを変更することができptrace Rアプリ(デバッガ)が呼び出される。http://lkml.org/lkml/1999/10/30/82

+2

に答えをクラッキング(カーネルの一部のバージョンでは、EIOはptraceのにORIG_EAXを変更することであった場合) (一見)軽薄な質問! – sehe

+2

私はそれがsyscallsに関連していると考えました(そしておそらくsyscallが再起動しています)。詳細を追跡するための+1! –

+0

メモ:最近のカーネルは、field to orig_axという名前に変更されました.LXR検索を実行する場合は、orig_eaxとorig_axの両方を行います。 – osgx

関連する問題