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

Yasushi Shinjo yas @ cs.tsukuba.ac.jp
2012年 3月 13日 (火) 11:53:52 JST


新城@筑波大学です。こんにちは。

Hideki EIRAKU <hdk @ igel.co.jp> wrote:
> 問題になりそうなこととして、ハイパーバイザーコールの引数である仮想マシ
> ン上の仮想アドレスが、ページ不在になっている可能性があるということがあ
> ります。

copy_from_guest() や copy_to_guest() が常に return 0 は問題で
すね。

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

この楽観的な手法と、必要なら Unix 系の OS なら mlock() システ
ムコールもあるので、それと合わせて使うことにすると、90%の問題
は解決できるのでしょう。

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

vmmcall_newprocess() については、ハイパバイザ・コールを4つに
分ける方法が考えられます。

(1) トランザクション開始
(2) カーネル・ハイパバイザ間共有メモリでバイナリを数回に分けて
    コピーする。
(3) コピーしたバイナリの署名を検証&実行する。
(4) トランザクションのアボート

楽観的な手法と比べて複雑過ぎると思います。1回誰かが作れば、後
は使うだけで楽々ということなんでしょうけれど。

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

これで無限ループになるのは、OSのバグと言ってもよいのでしょう
が、keep it simple の BitVisor としては、ここまでやらなくても
良いかと思いました。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学システム情報系情報工学域 \\



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