2017-12-23 22 views
1

私はVMMを作成していますが、VMX非ルートモードで動作するゲストOSによってx2APICのレジスタへの仮想アクセスをサポートしようとしています。x2APICの仮想APICページの理解

私は、ゲストOS内からローカルAPIC IDを読み取るなどの簡単な操作を行うことから始めたいと考えています。私はこれをVMMに追加しようとしましたが、私が読む価値は間違っているようです。

残念ながら、私は仮想APICページについて多くの情報をオンラインで見つけることはできないようです。私はインテルのマニュアルの章29(APIC仮想化と仮想割り込み)を読んできた、とここで私がやっているものだ:二次プロセッサベースのVM-実行制御で

  1. 、私は次のビットを設定しました

    1. SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE(私は最終的に投稿IPIのをサポートしたいので、私は以下のビット9をセットしています)(ビット4)
    2. SECONDARY_EXEC_APIC_REGISTER_VIRT(ビット8)
    3. SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY(ビット9)
    4. :1〜
  2. MSRビットマップでは、ローカルAPIC IDレジスタである0x802のインターセプトを無効にします。

  3. 私のゲスト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です。

+1

仮想APICレジスタの値で仮想APICページを初期化していますか? – prl

+0

@prlうん、私はそれをする必要があるか分からなかった。申し訳ありません - VMMとCPUの間の分業は私には不明です。私は自分でこれを書く必要があるかどうか分かりませんでした。私はそれを働かせて、私は戻って報告します。ありがとうございます:) –

+0

仮想APIC(VMM内)の状態が変わるたびに、仮想APICページの適切なレジスタを更新する必要があります。 – prl

答えて

1

私は@prlの助けを借りてこれを理解することができました。私は各コアごとに仮想APICページを自分で割り当てなければならず、関連するコアのローカルAPIC IDで個々のページを個別に初期化しなければなりませんでした。

次に、ページの物理アドレスをVMCSに追加しました(VMCS内のオフセットを含むVIRTUAL_APIC_PAGE_ADDRというLinuxカーネルで定義された定数があります)。私はそれが自動的に行われていないので、私はページを初期化しなければならないことに気付かなかった。

関連する問題