私は、コア、メモリ階層、相互接続などのさまざまなアーキテクチャパラメータで実行されるコードのタイミング効果をシミュレートするために使用される社内アーキテクチャシミュレータに取り組んでいます。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のスケジューラを変更することができますが、実際の方法を理解することはできません。
ご質問が非常に長い場合は申し訳ありません。私はいくつかの部分を抽象化することができたが、その一部が問題の文脈の説明を与えると感じた。
ya、私はユーザモードのエミュレーションにはqemu-linux-userを、システムエミュレーションにはqemu-system-i386を使用しています。完全なシステムエミュレーションの場合、問題はあなたが指摘したものです。コマンドがqemuによって解析されているプロセスのpidを知る。私はqemuの命令段階を逆にして仮想アドレスを取得しています。 –
誰かがLinuxスケジューラで現在のプロセスのpidを出力ポートに出力できる場所を指すことができます。 –