OS Awareness
Simics OS awareness は、Simics のターゲットシステムで実行されている OS のデータ構造と抽象化を理解する Simics モジュールです。 OS 意識により、Simics と Simics デバッガーはカーネル空間、ユーザー空間、プロセス、スレッド、およびタスクについて知ることができます。
Fundamentally, OS awareness perform the two tasks: live tracking of events as they happen, and investigating the instantaneous state of the operating system. イベントのライブ追跡とは、オペレーティング システムがタスクスイッチを実行したとき、ソフトウェアがシステム コールを実行したとき、または割り込みが発生したときに、OS アウェアネスが検出することを意味します。 実際、このようなイベントを検出する最も一般的な方法は、ターゲットシステムで割り込みを待つことである。割り込みが発生しない限り、同じユーザーレベルのソフトウェアが実行されていることになる。 割り込みが発生すると、オペレーティングシステムに引き継がれ、実行中のプロセスは切り替わったとみなされる。 オペレーティング・システムがユーザー空間に戻ったとき、あるプロセスがスイッチ・インされたと見なされます。
ライブ・トラッキングは、何かが起こったときに決定しますが、何が起こったかを決定するには、オペレーティング・システムの瞬間的な状態を調査する必要があります。 たとえば、割り込みがトリガーされたとき、その割り込みを受けたプロセッサ上のアクティブなスレッドは何なのか。 それを判断するために、OSアウェアネスは、実行中や待機中のプロセスのOSキューの構造、タスク構造体やプロセス制御ブロックの内容、その他のデータ構造などを知る必要があります。 これが正しく構成されていれば、OS アウェアネスはターゲット メモリ内のリストを走査して、特定のプロセッサ上で現在アクティブなプロセスの名前、すべての既存プロセス、動的にロードされたソフトウェア モジュールとその再配置アドレス、および関心のあるその他のものを判断することが可能です。 ほとんどの場合、OS ビルドからのデバッグ情報を含むシンボル・テーブルまたはカーネル・ファイルを見ることにより、OS アウェアネス用のパラメータを決定することが可能です。 しかし、実行時まで正確なパラメータを決定できないOSもあり、その場合はターゲット・システムが起動するまで設定を待つ必要があります。 いずれにせよ、一度決定したパラメーターのセットは保存でき、次に同じターゲット設定を実行するときに使用できます。
パラメーター ファイルの使用により、OS 認識設定を、それが参照する OS イメージと一緒に配布することが可能になります。 これは、プラットフォーム・チームが OS イメージを構築し、それに対して OS アウェアネスを構成し、パラメータを保存し、シンボル・ファイルまたはデバッグ情報を提供しなくても、OS とその OS アウェアネス・パラメータをユーザーに提供できることを意味します。 OS認識パラメータファイルは、単に提供されるソフトウェアスタックの一部であり、Simicsの起動に使用されるスタートアップスクリプトでアクティブ化されます。 システムのユーザーは、OS認識機能の設定方法を知る必要はなく、提供されたターゲットシステムのセットアップを開始するとすぐに動作するようになるだけです。 OS awareness パラメーターは Simics チェックポイント ファイルの内部にも保存されるので、OS awareness はチェックポイントの保存と復元操作にわたって機能し続けます。
OS awareness は、特定のプロセス内部のみに設定されるブレークポイントや、ユーザーレベルのタスクではなくカーネルによって実行されるメモリアクセスのみを追跡するなど、ソフトウェアスタックの特定のサブセットのみで動作する Simics 機能を持つことを可能にします。 ユーザーが書いたSimics拡張機能またはスクリプトは、OS認識からのイベントを聞き、ターゲットシステムで現在実行されているソフトウェアに基づいたアクションを取ることができます。 OS awareness システムに特定のプロセスだけの通知を求めることも、すべてのプロセスのすべてのアクションを見ることも可能です。
Simics の OS awareness システムは、ノードツリーの概念で動作します。 ツリーの各ノードは、OSプロセスモデルにおける抽象化レベルを表します。 通常、 トップノードはオペレーティングシステムそのものであり、 その後、 カーネルレベルとユーザーレベルのタスクに分割されます。 LinuxのようなOSでは、各ユーザーレベル・タスクは1つ以上のスレッドを含んでいます。 カーネルでは、OSの意識は通常カーネル・スレッドをアイドル・タスクと区別し、それが目標実行時間を説明するのに役立つからです。 図3.3は、ベアボーンLinuxシステムからのノードツリーの例です。