2012-01-19 16 views
1

私は、コア、メモリ階層、相互接続などのさまざまなアーキテクチャパラメータで実行されるコードのタイミング効果をシミュレートするために使用される社内アーキテクチャシミュレータに取り組んでいます。i386 linuxカーネルにqemuを使用したアドレス空間識別子

"PinTool"や "qemu-linux-user"のようなエミュレータから実行中のプログラムの実際のトレースを取得し、このトレースをシミュレータに送ります。

これまで私のアプローチは次のようでした: 1)バイナリ実行可能ファイルのobjdumpを取り出し、この情報を解析します。 2)エミュレータは、命令ポインタとロードアドレス/ストアアドレスのような他の情報を私に供給しなければなりません。

このようなアプローチは、プログラムの内容がわかっている場合にのみ機能します。

しかし今、標準のLinuxカーネルの上で実行可能なトレースを実行しようとしています。問題は、基本カーネルイメージにLKM(Loadable Kernel Modules)のコードが含まれていないことです。また、デーモンはカーネルの起動時にはわかりません。

このソリューションへのアプローチは次のとおりです。 1)qemuを使用してマシンをエミュレートします。 2)初めて命令が出たとき、それを解析してこの情報を保存します。後で。 3)命令実行時にip、load/storeアドレスを送信するヘルパー関数を作成します。

手順2でスタックされています。どのように私は、エミュレータだけでゲストOSについて何も知らないqemuから異なるプロセスを区別するのですか?

私はゲストOSのスケジューラを変更することができますが、実際の方法を理解することはできません。

ご質問が非常に長い場合は申し訳ありません。私はいくつかの部分を抽象化することができたが、その一部が問題の文脈の説明を与えると感じた。

答えて

2

最初のケースでは、qemu-linux-userを使用して1つのプログラムのユーザモードエミュレーションを実行すると、メモリがリニアでエミュレータに関連する仮想メモリがないため、タスクは非常に簡単です。基本的にカーネル構造からアドレスを解析する必要があるため、システムエミュレーション全体の2番目のケースはもっと複雑です。

QEmuから直接仮想アドレスを取得できる場合は、仕事が少し楽になります。単一プロセスの場合と同様に、プロセスを識別するだけで、他のすべての機能が必要になります。システムコールをget_pid()に偽ってPIDを取得できるかもしれません。

これ以外の場合、これは物理的なメモリダンプからシステムをデバッグするのに似ているようです。このタスクにはsome toolsがあります。彼らはおそらくすべての命令のために実行するには遅すぎるかもしれませんが、あなたはそこでヒントを探すことができます。

+0

ya、私はユーザモードのエミュレーションにはqemu-linux-userを、システムエミュレーションにはqemu-system-i386を使用しています。完全なシステムエミュレーションの場合、問題はあなたが指摘したものです。コマンドがqemuによって解析されているプロセスのpidを知る。私はqemuの命令段階を逆にして仮想アドレスを取得しています。 –

+0

誰かがLinuxスケジューラで現在のプロセスのpidを出力ポートに出力できる場所を指すことができます。 –

関連する問題