9

Linuxカーネルを変更して、現在のPIDが変更されるたびに、つまり新しいプロセスが切り替えられるたびに、いくつかの診断コードが実行されるようにしたいと考えています(興味がある場合は、以下の詳細な説明)。いろいろ調べてみたところ、スケジューラーが新しいプロセスを選択するたびに関数context_switch()が呼び出されるようです。これは理にかなっています (これはsched.c/schedule().

問題は、Linux スケジューラーが今の私にとって基本的にブラック マジックなので、その仮定が正しいかどうか知りたいということです。CPU で時間を取得するために新しいプロセスが選択されるたびに、context_switch() 関数が呼び出されることが保証されていますか? または、他の状況でスケジューリングを処理できるカーネル ソース内の他の場所はありますか? (または、私はこれらすべてを完全に誤解していますか?)

いくつかのコンテキストを提供するために、私は MARSS x86 シミュレーターを使用して、特定のプログラムの計測と測定を実行しようとしています。問題は、データの誤解を避けるために、特定のコード イベントがどの実行プロセスに対応するかをインストルメンテーションが知る必要があることです。MARSS に組み込みのメッセージ パッシング システムを使用して、すべてのコンテキスト スイッチで新しいプロセスの PID を渡し、現在実行中の PID を常に認識できるようにするという考え方です。誰かがそれを達成するためのより簡単な方法を考えることができれば、それも大歓迎です.

4

1 に答える 1

5

Yes, you are correct.

The schedule() will call context_switch() which is responsible for switching from one task to another when the new process has been selected by schedule().

context_switch() basically does two things. It calls switch_mm() and switch_to().

switch_mm() - switch to the virtual memory mapping for the new process

switch_to() - switch the processor state from the previous process to the new process (save/restore registers, stack info and other architecture specific things)

As for your approach, I guess it's fine. It's important to keep things nice and clean when working with the kernel, and try to keep it relatively easy until you gain more knowledge.

于 2012-06-18T09:43:32.223 に答える