8

私の理解では、ゲスト仮想からホストの物理アドレス変換をハードウェアでサポートしていないプロセッサでは、KVMはシャドウページテーブルを使用します。

ゲストOSがページテーブルを変更すると、シャドウページテーブルが作成および更新されます。ページテーブルを変更するための特別な指示がハードウェアにありますか(参照用にx86を取り上げます)?特別な指示がない限り、VMMへのトラップはありません。Linuxカーネルによってソフトウェアで維持されているページテーブルは、単なる別のデータ構造ではありませんか?なぜそれを更新するために特別な指示が必要なのですか?

ありがとう!

4

1 に答える 1

15

私はKVM以外のVMMを使用しているため、KVMの詳細はわかりませんが、原則はすべてのVMMで同じです。それが機能する方法は、2セットのページテーブルがあるということです。

ページテーブルのベースアドレス用の特殊レジスタ(および一般にプロセッサの構成に関係する他のレジスタのランダムビット)を除いて、ページテーブルを管理するための特別な命令はありませんが、通常は「1回限りの」セットアップです。ページテーブルは、通常のインストルメンテーションで書き込まれるメモリのほんの一部です。本当に必要な場合は、加算、減算、および、または乗算などを行うことができます[何をしているのかを完全に理解していない限り、問題が発生する可能性があります。 ]ですが、一般的な操作は「mov」(ストア)または「xchg」(交換)操作です。

最初のページテーブルは、OSによって実際に作成されたものです。VMMはこれを読み取り専用メモリとして設定するため、VMMへの書き込みがあると、プロセッサのページフォールトが発生します。KVMはプロセッサ(AMDプロセッサのSVMまたはIntelプロセッサのVMX)でハードウェア仮想化拡張機能を使用するため、ページ障害はVMM(この場合はKVM)によってキャプチャされ、書き込み操作が「ページ」であるかどうかが検査されます。 -table write "、もしそうなら、それは2番目のシャドウページテーブルに変換されます-これは、VMMがVMにメモリが0から始まり1GBになると信じさせる方法ですが、実際にはたくさんのページを取りましたいたるところにあり、フラットで連続したページのセットのように見える1GBのメモリをまとめます。もちろん、VMMはVM内のOSに「嘘をついている」ので、OSに実際のページテーブルを書き込ませることはできません。そこに書き込む「真の」ページテーブル値がわからないためです。[ただし、OSが実際に期待しているものとは異なる場合に、ページテーブルから読み取って完全に混乱する場合に備えて、OSに独自のページテーブルを持たせる必要もあります]。

プロセッサ「実際のCR3」はVMMによって設定され、シャドウページテーブルを指します。

VMMはCR3(ページテーブルベースアドレス)書き込みをトラップするため、ページテーブルが存在する場所を追跡できます(また、使用する「実際のCR3」を追跡できます)。ただし、VMMはCR3の読み取りについて知る必要がないため、通常、CR3を傍受せずにVM内で直接実行できます。

プロセッサのVMM拡張機能の要点は、VM内のほとんどの特権命令を「通常の」命令として実行しながら、この種の特別な命令のインターセプトをサポートすることです。たとえば、飛び込みたくないでしょう。割り込みを有効/無効にするためのフラグレジスタへの書き込みごとのVMMなど-実際のハードウェアであるかのようにVMで発生させます。ただし、一部のレジスタは、VMMが制御できる重要なものです。

明らかに、ページテーブルのハードウェアサポートがある場合、ページテーブルの2つの層があります。1つは「0-1GB」を「あちこちに散らばっている」に変換し、もう1つはOSが維持する実際のページテーブルです。この場合、ページテーブルの書き込み、ページフォールト、またはCR3の更新をインターセプトする必要はありません。OSは、基になるページテーブルによってマップされるメモリの許可されたセクション内で好きなことを実行できます。 、およびVMが許可されたセクションの外に出た場合、VMMはそれを「VMMページテーブルフォールト」としてキャッチします。もちろん、これにより全体がかなり効率的になります。

これが理にかなっていることを願っています。

于 2013-01-05T22:34:28.857 に答える