[BitVisor-devel:34] ページ不在対応について (Re: パッチのライセンスについて)

Hideki EIRAKU hdk @ igel.co.jp
2012年 3月 12日 (月) 18:03:41 JST


筑波大学 松下様

イーゲル 榮樂です。こんにちは。

パッチ内容を大雑把に確認しました。

問題になりそうなこととして、ハイパーバイザーコールの引数である仮想マシ
ン上の仮想アドレスが、ページ不在になっている可能性があるということがあ
ります。もし、ゲスト OS 上でメモリが足りなくなるなどして、ページアウト
されていると、VMM はその領域にアクセスすることができず、エラーとなりま
す。

同様の問題を抱えている例としては、core/vmmcall_dbgsh.c のゲスト OS 用プ
ログラムの以下の部分がありますが、これはデバッグ用のコマンドなので、た
まに動かないくらいはいいかということで、あまり問題になっていません。

        asm volatile ("push (%%ebx); push 4(%%ebx); lea 8(%%esp),%%esp; vmcall"
                      : "=a" (n) : "a" (0), "b" ("dbgsh"));

これは、"dbgsh" のファンクション番号を得るためのハイパーバイザーコール
です。ハイパーバイザーコールの前に、"dbgsh" という文字列が格納されたメ
モリの内容を、スタックに積んだ上で破棄しています。これは、ハイパーバイ
ザーコールの直前にアクセスしておくことで、ページアウトされる可能性を小
さくすることを狙ったものですが、ページアウトされない保証はありません。

手軽な対応方法としては、ハイパーバイザーコールがページ不在によって失敗
したら、ゲスト OS 上でその領域をアクセスすることでページインさせて、ふ
たたびハイパーバイザーコールをやり直すという方法があります。ゲスト OS
の負荷が高く、極端にメモリが不足している場合には何回か繰り返すかも知れ
ませんが、そのうち成功するだろうという考えによるものです。領域が数ペー
ジ程度であれば、この方法が一番手軽だと思います。

これ以外には、カーネル権限を使う方法があります。ゲスト OS のカーネル権
限から VMM を呼び出しているのであれば、ページをピン止めすることもできま
すし、そもそも、物理アドレスを渡すこともできます。そのような例としては、
core/vmmcall_log.c があります。

その他の方法として、VMM がページフォールトを生成する方法も考えられます。
この場合、ページフォールトの無限ループを避ける必要がある (ゲスト OS カー
ネルからの呼び出しなど、条件によっては、ページフォールトでエラー処理に
移行せず、無限ループでシステム全体が停止してしまう) 点に注意が必要と思
われます。また、ハイパーバイザーコールの命令でページフォールトが生成さ
れてしまうため、もし、ゲスト OS がページフォールトの原因となった命令を
見るようなつくりになっていた場合、ゲスト OS が混乱する可能性もあります。

-- 
Hideki EIRAKU <hdk @ igel.co.jp>



BitVisor-devel メーリングリストの案内