2016-11-18 4 views
1

私は、Intel E5-26xx v3プロセッサを搭載したUbuntu(14.04または16.04のいずれかでこれを試しています)を持っています。テストの目的でゲストVMに手動でCPUフラグを公開する

ゲストVMに公開する必要がある特定のフラグがありますが、私のVM libvirt XML定義でcpu mode='host-passthrough'を使用しても、QEMU/libvirtはそれを公開していません。これは、私が公開したいフラグが定義されていないこのファイル/usr/share/libvirt/cpu_map.xmlで定義されているためです。

だから、私はcpu_map.xmlを変更し、手動でCPUフラグの定義を追加できるようにしたいのですが、私はCPUID関数の結果を得ることができるどこか/にポジティブじゃないと、彼らはebxにいるかどうか/ ecxなどです。

免責事項:私はCPUアーキテクチャに干渉していないので、私の知識はこの領域では非常に限られています。 CPUID instructionから結果を取得

答えて

0

は非常に単純である:

  • チェックEFLAGSレジスタのIDフラグ(ビット21)EAXを設定CPUID命令
  • の利用可能性を示しており、設定されている場合そして特定の値にECXレジスタ
  • コールCPUID
  • EAXEBX、の値を解釈します、及びEDXレジスタ

結果の解釈をconvering 多くサイトがあります。それらの1つはLowLevelです。それらの多くは、可能な結果のサブセットのみをカバーしています。

A thread on the specifics of CPUID in VMsは、この基本的な知識を拡張:

UserCPUIDはバイナリ変換を使用するときにネイティブに実行するゲストリング3コードに見えるであろうものです。バイナリ変換では、通常、Ring-0(またはIOPL-3)コードのみがバイナリ変換されます。ほとんどリング3コードは(私たちは通りを参照モードでは、「直接実行。」)でネイティブに動作

CPUID断層運動の導入に、ゲストCPUID命令のゲストの実行を傍受する方法はありませんでした直接実行されていました。一部のCPUは、CPUID命令を傍受しなくても、一部のCPUID葉の結果を(レジスタごとにレジスタごとに)無効にする機能をサポートしています。したがって、userCPUIDhostCPUIDに基づいていますが、上書きできるレジスタはguestCPUIDです。

0

ホストパススルーモデルは、すべてのホストCPU機能をゲストに公開することを目指しますが、このルールにはいくつかの例外があります。 CPU機能が非常に新しい場合、QEMU、KVM、およびlibvirtは、その存在を認識していない可能性があります。 KVMはデフォルトでは保守的なので、わからない機能は公開されません。この場合、cpu_mapを編集するだけです。xmlはlibvirtにしか知らせてくれないので、QEMU & KVMがコード変更が必要なことを知るにはまだ必要です。 2番目のケースは、一部のCPU機能がゲストに公開されるのが安全でないため、KVMが明示的にブロックすることです。

「virshの機能」を使って、libvirtがホストにあると考えるものを確認できます

関連する問題