2012-01-24 12 views
5

友人、私はそれの上に実行されているプロセスを含むオペレーティングシステムの完全な実行をトレースしようとしています。このために、各プロセスとその実行トレースによって実行される命令が必要なので、各プロセスのobjdumpを実行しなくても済むようにしたいと思います。現在実行中のプロセスのpid

私の目標は次のとおりです。
1)各pidのビルドアドレススペース。
2)各pidの実行の追跡。

私は上記の目標を達成するために、エミュレータQemuの上にLinuxベースのオペレーティングシステムを実行しています。

qemuが最初に命令を検出すると、ゲストのio-portまたは既知の物理メモリアドレスを使用してこの命令を実行しているプロセスのpidを調べます。私はこの情報を使って、自分が望むものをやることができます。

私の問題は.... カーネル/ sched.cでは、次に実行されるプロセスのPIDを知ることができます。私は、 - > launch_process(pid)のような関数呼び出しを見つけることができないことを意味します。または、アドレス空間を追跡できる既知の場所がシステムにあります。 1つはCR3ですが、本当に信頼できません。

これは、この場所への簡単なポインタのように見えるかもしれませんが、私はこの場所を自分で見つけることができません。

答えて

3

各プロセスには、適切なstruct task_structがあります。 find_task_by_*()関数を使用して、struct task_structをPIDで検索するか、またはtask_pid_*()を使用して、指定されたタスクのPIDを取得できます。関連項目「struct pidとは何ですか?」 include/linux/pid.hセクション。

実行タスクはCPU単位の実行キューにあります。struct rqの定義はkernel/sched.cです。

機能try_to_wake_up()wake_up_process()wake_up_new_task()context_switch()などもあなたの仕事に関係しています。

+0

@droid thanks ... context_switchは、プロセス実行のPIDが変更される機能です。ここでは、task_structを使用してコードを配置します。 pidの変更のための他のエントリポイントはありますか?この方法はsmpシステムにも有効でしょうか? –

+0

私はカーネルに精通していないので、他のエントリーポイントには必ず答えます。 SMPに関して - 私はすべてが大丈夫だと思う。 –

関連する問題