6

私は RDTSC を研究しており、VirtualBox や VMWare などの仮想マシンのために RDTSC を仮想化する方法について学んでいます。Intel/AMD がこの命令の仮想化に苦労したのはなぜですか?

トラップを使用して簡単にシミュレートできるように感じますが、非常に一般的な命令ではありません (テストしたところ、ハードウェア RDTSC 仮想化が無効になっている仮想マシンでの一般的な使用では、顕著な速度低下はありません)。

ただし、非常に高速に実行できることが重要でない限り、Intel/AMD がこの命令を仮想化ハードウェアに追加するのに苦労することはなかったことを私は知っています。

誰かが理由を知っていますか?

4

2 に答える 2

7

RDTSCを使用して、仮想化トラップのオーバーヘッドが非常に大きくなる、きめ細かいタイミング情報を取得するのが一般的です。最も一般的な使用法は、2つのRDTSC命令の間に少量のコードを置き、時間の差をコードシーケンスの経過時間(サイクル数)として取得することです。したがって、パイプラインの排水/フラッシュのオーバーヘッドでさえ非常に重要です。

また、命令は継続的に実行されるカウンターを読み取るだけなので、仮想化は非常に簡単です。ハードウェアは、VMコンテキストスイッチでカウンター値の保存/再読み込みを許可するだけでよく、RDTSC命令自体に特別なことは何もありません。

于 2011-10-12T19:58:09.687 に答える
2

VM は異なる時間に起動するため、個別の TSC を持つことができる必要があります。物理 CPU には 1 つしかないため、少なくとも VM ごとの個々の TSC オフセットを取得するには何かが必要です。

また、VM は基礎となる物理 CPU を完全に所有しているわけではないため、つまり、VM で常に実行できるわけではないため、TSC も何らかの形で「オン/オフ」期間を反映する必要があり、そうしないことが望ましいです。仮想化の準備ができておらず、数値がずれすぎると壊れる可能性のあるソフトウェアがたくさんあるため、VMはホストOSから正しく取得する必要があります。

これらがRDTSCが仮想化されている理由だと思います。しかし、何をするにしても、相反する要件を満たすことは難しく、問題を複雑にします。仮想化を非表示にして、同時にネイティブに近い速度で VM を実行することはできません。トレードオフがあり、譲らなければならないものもあります。

于 2011-10-12T20:35:05.413 に答える