sys/user.h
のstruct user_regs_struct
にはなぜorig_eax
のメンバーが含まれていますか?eaxに加えてorig_eaxが提供されるのはなぜですか?
答えて
それはとても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
- 1. なぜ、シングルトンインスタンスがJavaのデフォルトで提供されていないのですか?
- 2. EAXの内容が異なるのはなぜですか?
- 3. 提供された形式で表される時間を解析できないのはなぜですか?
- 4. なぜData.Time.ClockはDiffTimeとNominalDiffTimeを提供するのですか?
- 5. 必要な偽装レベルが提供されていないか、または提供されている偽装レベルが無効です
- 6. Qtがサブクラス化するクラスを提供するのはなぜですか?
- 7. サブドメインから提供されるルートアクセスを書き換えます
- 8. WSSecurityEngineは、コールバック中にパスワードが提供されていないのにパスワードが提供されていないと示します
- 9. 適切なデータが提供されているモデルバインディングが表示されます
- 10. MSCVR100D.DLLデバッグシンボルはどのパッケージで提供されていますか?
- 11. なぜResharperは「ネストされたクラスを作成する」などのコンテキストアクションを提供しないのですか?
- 12. このjqueryのバリデーションがなぜ提出されないのか誰にでも教えてください。
- 13. シードが提供されていないときに播種されるクラスRandomとは何ですか?
- 14. JPA CriteriaQueryが更新クエリを提供しないのはなぜですか?
- 15. なぜGCCはmov%eax、%eaxを生成しましたか?それはどういう意味ですか?
- 16. ラウンドロビンディレクターでクッキー/セッションが提供されている場合のワニスキャッシュ
- 17. なぜ反応するネイティブはボタンコンポーネントを提供しないのですか?
- 18. ログインプラットフォームまたはデバイスに応じてトークンが提供されていますか?
- 19. アプリケーションサーバーは、提供できるSpringを提供しますか?
- 20. Javaが配列を逆転させる標準機能を提供しないのはなぜですか?
- 21. 「カレンダーに追加」リンクを提供する
- 22. Go:http静的ディレクトリが提供されていない
- 23. JPAはEclipseLinkからどのプロバイダに提供されますか?
- 24. アプリ内通話でコールバックテストが提供されています
- 25. JavaScriptのgetElementsByClassNameが配列ではないオブジェクトを提供するのはなぜですか?
- 26. なぜIDSはRSAMのCライブラリ関数を提供しないのですか?
- 27. 提供されたユーザーアカウント
- 28. Yahooが提供するYUI3ファイルは縮小されていませんか?
- 29. URL Hashが置き換えられる代わりに追加されるのはなぜですか?
- 30. ModeShapeはJackRabbitが提供しないものは何ですか?
に答えをクラッキング(カーネルの一部のバージョンでは、EIOはptraceのにORIG_EAXを変更することであった場合) (一見)軽薄な質問! – sehe
私はそれがsyscallsに関連していると考えました(そしておそらくsyscallが再起動しています)。詳細を追跡するための+1! –
メモ:最近のカーネルは、field to orig_axという名前に変更されました.LXR検索を実行する場合は、orig_eaxとorig_axの両方を行います。 – osgx