0

x86_64 Linux 3.0 で syscall を実装しましたが、呼び出しプロセスのスタック ポインター (%rsp) を取得する方法を知りたいです。私のシステムコールは普通のバニラシステムコールです...

私はtask_pt_regs呼び出し元プロセスのスタック フレームを取得するために使用することに慣れていますが、 からarxh/x86/include/asm/ptrace.hstruct pt_regs非トレース syscall がすべてのレジスタを読み取らないことに注意してください: ip、cs、flags、sp、および ss は、CPUsyscall命令がが呼び出され、実際のシステムコールが呼び出されます。言い換えれば、私のシステムコールtask_pt_regs(current)->ssではガベージです。

sys_fork のような呼び出しの場合、arch/x86/kernel/entry_64.S( PTREGSCALL) 内の特別なマクロは、sys_fork 関数が適切な pt_regs スタック フレームで呼び出されるように設定します。

sys_fork のようなカスタム システム コールに追加の引数を強制せずに、syscall で IP や SS などの値を抽出するにはどうすればよいPTREGSCALLですか?

4

1 に答える 1

0

syscall がいつ呼び出されたかをよく理解できれば、CPU はカーネル コードにジャンプします (特権のジャンプ)。 IRET (中断からの復帰) を実行します。

これは、syscall が実行されたときに、呼び出しプロセスの RSP と RIP がスタックを調べているだけで見つかる可能性があることを意味します。

詳細については、「AMD64 アーキテクチャ、プログラマーズ マニュアル、第 2 巻: システム プログラミング」、292 ページを参照してください。これは、「割り込み後のロングモード スタック - より高い特権」と呼ばれます。

前の回答では、Linux カーネルがシステムコールを処理する方法に関するいくつかのことを無視しましたが、回答は変わりません。

于 2012-09-17T14:26:11.167 に答える