[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 メーリングリストの案内