2011-10-21 7 views
2

カーネル(この場合はLinux)から、プロセスコンテキスト(システムコール、ページフォールトなど)でPTRACE_SINGLESTEPを指定してptrace_requestを呼び出すとどうなりますか?ユーザ空間命令またはカーネル空間命令を単一ステップで実行するかどうか。私は、ptraceがユーザーの指示を一歩進めることができることを認識しています。なぜなら、これが生成する動作が不思議だからです。プロセスコンテキストからのカーネルでの単一ステップの実行?

もう少し情報を提供するために、私はページフォールトハンドラから命令を出しています(フォルトした命令をシングルステップで実行しますが、命令が通過するようにPTEを変更します)。もしこれが全く可能であれば、あるいは実行するプロセスを再スケジュールするなど別の方法が必要なのかどうか疑問に思っています。

これは、プロセスのtask_struct(プリエンプトされている場合)それでもカーネルスペースハンドラIIRCを指しているので、ptraceを使ったシングルステッピングはこれをバイパスし、正しいユーザスペース命令を実行するか、まったく実行しないでしょうか?

答えて

1

私はこのことを完全に理解していませんが、PTRACE_SINGLESTEPは常にユーザコンテキストでカーネルから呼び出されます。あなたのsyscall ptrace(PTRACE_SINGLESTEP)を実行すると、その関数を実行するカーネルコンテキストになります。通常は動作し、ページフォルトハンドラから呼び出しても、ペーストしているプロセスを1命令実行させます。いつものようにカーネルの土地にいる間は、それを一歩踏み出すことはできません。

arch/x86/kernel/ptrace.cを参照して、単一ステップが実際にどのように機能するかを理解することをお勧めします。単一のステップ付き命令は実際にはカーネルによってエミュレートされ、IIRCではハードウェアのサポートはありません。

0

あなたの質問に対する答えを理解するには、インテルのハードウェアを理解する必要があります。

我々は、最も単純な命令(SINGLE_STEPは、シングルステップモードにインテルのCPUを置くことで、1つのstructionを実行した後に戻って、割り込みハンドラに戻るため)で始まりまず:

MOVL(EAX)、EBX

Intelのフォーマットに従い、これはeaxの中の値をメモリポインタとして扱い、メモリにアクセスし、4バイトの値を取得してebxにコピーすることを意味します。

この1つのアセンブリ命令は、カーネル対ユーザコンテキストで実行されるとき、異なる動作/意味を持ちます。

カーネル内にある場合、カーネルのページテーブルを使用してメモリにアクセスし、データをebxにコピーします。ユーザプロセスでは、ユーザのページテーブルはメモリからデータを読み出してebxにコピーするために(MMUハードウェアによって)使用されます。 eaxの値は同じですが、CR3レジスタの値が異なると(異なるプロセスコンテキストを意味する)、メモリの異なる部分が読み込まれます。だから、カーネル内のユーザ空間プログラムをトレースするのは本当にばかげている。あなたは4つの操作を効果的に意味するので、ユーザ命令を実行する前と後に、コンテキストスイッチ(レジスタストアとリストア操作の全セットを含む)を実行する必要があるためです。

ご覧のとおり、カーネル関数APIについては言及していません。全体的な概念の理解が最初に来る。

関連する問題