私はVMMを作成していますが、VMX非ルートモードで動作するゲストOSによってx2APICのレジスタへの仮想アクセスをサポートしようとしています。x2APICの仮想APICページの理解
私は、ゲストOS内からローカルAPIC IDを読み取るなどの簡単な操作を行うことから始めたいと考えています。私はこれをVMMに追加しようとしましたが、私が読む価値は間違っているようです。
残念ながら、私は仮想APICページについて多くの情報をオンラインで見つけることはできないようです。私はインテルのマニュアルの章29(APIC仮想化と仮想割り込み)を読んできた、とここで私がやっているものだ:二次プロセッサベースのVM-実行制御で
、私は次のビットを設定しました
SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE
(私は最終的に投稿IPIのをサポートしたいので、私は以下のビット9をセットしています)(ビット4)SECONDARY_EXEC_APIC_REGISTER_VIRT
(ビット8)SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY
(ビット9) :1〜
MSRビットマップでは、ローカルAPIC IDレジスタである
0x802
のインターセプトを無効にします。私のゲストOSでは、
rdmsr
を使用して0x802
を読んでいます。
私は異なるコアに固定された2つのスレッドに対して手順3を実行します。彼らは両方ともレジスタから値2621447225
を読みます。これは、スレッドが異なるコアに固定されているため、異なるローカルAPIC IDを読み取る必要があります(そして、数字は2621447225
が本当に大きいからです)。私は間違って何をしていますか?
ここにあなたの参考のためにいくつかの追加情報です:
は、インテルのマニュアルの(仮想化するMSRベースのAPICアクセス)セクション29.5で、それは言う:
If “APIC-register virtualization” is 1 and ECX contains a value in the range 800H–8FFH, the instruction reads the 8 bytes from offset X on the virtual-APIC page into EDX:EAX, where X = (ECX & FFH) « 4. This occurs even if the local APIC is not in x2APIC mode (no general-protection fault occurs because the local APIC is not in x2APIC mode).
オフセットX
は理にかなって私:MSRアドレス0x802
は、0xFF
とANDをとったときに0x2
になり、左シフトの4ビットのときになる。0x2
となる。 0x20
は、メモリマップドレジスタを介してxAPICにアクセスしていた場合、物理APICのページ内のオフセットです。次に8バイト(すなわち64ビット)が読み取られるので、下位32ビットはx2APICのローカルAPIC IDです。
仮想APICレジスタの値で仮想APICページを初期化していますか? – prl
@prlうん、私はそれをする必要があるか分からなかった。申し訳ありません - VMMとCPUの間の分業は私には不明です。私は自分でこれを書く必要があるかどうか分かりませんでした。私はそれを働かせて、私は戻って報告します。ありがとうございます:) –
仮想APIC(VMM内)の状態が変わるたびに、仮想APICページの適切なレジスタを更新する必要があります。 – prl