私はそのRAMのみ、単一の物理ページに裏付けされたLinux仮想マシンを実行することが可能であるかどうかを把握しようとしています。
これをシミュレートするために、私は、現在処理ページフォールトに対応するものを除き、すべてのネストされたページテーブル(NPT)のエントリから存在ビットを取り除くためにKVMにネストされたページフォルトハンドラを変更しました。
Linuxゲストを起動しようとしているが、私のような、使用メモリオペランドことをそのアセンブリ命令を観察しました
add [rbp+0x820DDA], ebp
私は(この例では同様にオペランドに参照されたページのための命令を含むページの現在のビットを回復するまで、ページフォルトループにつながります[rbp+0x820DDA]
)。
このような場合は、なぜ私が疑問に思って。CPUアクセスメモリページは順次、つまり最初の命令を読み込みメモリオペランドにアクセスするべきではないでしょうか。またはx86命令のページだけでなく、すべてのオペランドのページが同時にアクセス可能であることを要求していますか?
私はAMD禅1でテストしています。
はい、彼らはマシンコードとすべてのメモリオペランドを必要とします。
CPUアクセスメモリページは順次、つまり最初の命令を読み込みメモリオペランドにアクセスするべきではないでしょうか。
はい、それは何が起こるか、論理的だが、ページフォルト例外割り込みその2段階のプロセスと任意の進歩を破棄します。CPUは、それがページフォルトが発生したときの真ん中にあったものを命令覚えてどのような方法を持っていません。
CPUの再試行がそれを実行するための有効なページフォールトを処理した後、ページフォルトハンドラが戻ると、RIPは、障害命令のアドレスを=場合は、最初から。
OSは、障害命令のマシンコードを変更し、それが後に別の命令を実行することを期待することは、法的になりiret
、ページフォルトハンドラ(またはその他の例外や割り込みハンドラ)から。あなたが話しているときのRIPを:私の知る限りので、アーキテクチャCPUのやり直しがCSからのコードフェッチすることが必要です。
それはおそらく、また、アーキテクチャ、ハイパーバイザの入口/出口のために必須です。それは紙の上禁じられていない場合でも、それはどのようにCPUの作業ではありません。
少数の命令は割り込み可能であり、部分的な進歩を遂げることができ、同様rep movs
と他のストリング命令、またはロード/散乱店舗を収集します。しかし、唯一のメカニズムはRCX / RSI / RDI、または宛先などのアーキテクチャレジスタを更新し、ひだのためのレジスタをマスクしています。いくつかの隠された内部レジスタにオペコード/デコード結果を保持し、ページフォルトハンドラからIRET後にそれを再起動しません。これらは、複数の独立したデータアクセスを行う命令です。
また、(ほとんどのISAのような)のx86の命令がアトミックWRTあることを保証することを念頭に置いておきます。割り込み/例外:彼らは、完全に起こる、または割り込みの前に、すべてでは発生しません。だから、例えばadd [mem], reg
店舗の一部が故障した場合の負荷を破棄するために必要とされるであろう。
前進をするために存在するゲストユーザ空間のページの最悪のケースの数は、6次のようになります。
movsq
またはmovsw
両方のページを復号化するために、それのために必要とされるように、2バイト命令は、ページ境界にまたがります。- QWORDソースオペランド
[rsi]
ページ分割も - QWORD先オペランド
[rdi]
もページ分割
これらの6ページフォルトのいずれかの場合、私たちは振り出しに戻っています。
rep movsd
また、2バイト命令であり、それの一歩に進捗状況を作ることは同じ要件を持っているでしょう。同様の例は好きpush [mem]
かpop [mem]
ずれスタックで構成することができます。
@Brandonは、ゲストがメモリ内のページ・テーブルが必要になり、そして双方はトップレベルPML4の異なるサブツリーにあるように、ユーザ空間のページ分割も1GiB分割することができることをコメントで指摘しています。HWページ徒歩進捗状況を作るためにこれらのゲスト・ページ・テーブル・ページのすべてに触れる必要があります。
そして、PMUパフォーマンスカウンタが有効になっており、命令はまた、その命令のPEBSバッファに書き込むperfのイベントを記述する必要があるように構成することができます。