BitVisorのtools/vmmstatus-gtkおよびtools/vmmstatus-win32の使い方を紹介します。
vmmstatusとは
VMMの状況を出力するツールです。
VMM側設定
make configでCONFIG_STATUSをセットします。
$ make config
また、defconfigまたはbitvisor.confにて、vmm.status=1にします。
tools/vmmstatus-gtkのビルド方法
gtk+2.0を使用していますので、必要なライブラリなどは事前にインストールしておきます。カレントディレクトリを移動して、./autogen.sh && makeで完了です。src/vmmstatus-gtkというファイルができます。
tools/vmmstatus-win32のビルド方法
MinGWクロスコンパイラーを事前にインストールしておきます。カレントディレクトリを移動してmakeで完了です。vmmstatus.exeというファイルができます。
Makefileはコマンド等がUnix環境のGNU Make用になっていますので、Windowsで使用される場合は必要に応じて修正してください。
出力内容の追加方法
coreディレクトリにあるソースコードにおいて、
#include "vmmcall_status.h"
としておいて、register_status_callback()関数にchar *(*func) (void)型の関数ポインターを渡して登録することができます。登録すると、vmmstatusのVMM呼び出しが来た時に、その関数ポインターの関数が呼び出されます。登録されている関数がすべて呼び出された後、返されたchar *型のポインターが指すUS ASCIIテキストが連結されて、vmmstatusのコマンドに返される仕組みになっています。通常staticの配列を返すように実装します。最後に'\n'を入れておきます。
本機能は、オーバーヘッドを調べたり、性能改善をしたりする際に、各処理の呼び出し回数などを数えて、それを定期的に取得して変化を見るのが目的です。そのような回数カウントは、複数の論理プロセッサから同時に実行される場所においては、asm_lock_incl()関数を使用するなどして、値が壊れないよう注意深く実装するのが普通です。これは、lock命令を使用するため性能に影響し、本機能を使用しない場合には消しておきたいものです。そのために、STATUS_UPDATEというマクロが用意されており、このマクロの引数に渡された文は、CONFIG_STATUSがセットされている場合にのみ展開されるようになっています。