私はスピンロックがWindowsのhal.dllによってエクスポートされていることを知っています。そのため、スピンロックのコードをリバースエンジニアリングしました。結果は次のとおりです。Windows XPとWindows 7のスピンロックの実装が異なるのはなぜですか?
Windows XPの逆コンパイルされたスピンロック。
unsigned __int32 __thiscall KfAcquireSpinLock(signed __int32 *this)
{
unsigned __int32 result; // [email protected]
result = __readfsdword(36);
__writefsdword(36, 2u);
while (_interlockedbittestandset(this, 0))
{
while (*this & 1)
_mm_pause();
}
return result;
}
Windows 7のデコンパイルされたスピンロック。
unsigned __int32 __fastcall KeAcquireSpinLockRaiseToSynch(signed __int32 *a1)
{
unsigned __int32 result; // [email protected]
int v2; // [email protected]
unsigned __int32 v3; // [email protected]
signed __int32 *v4; // [email protected]
int v5; // [email protected]
result = __readfsdword(36);
__writefsbyte(36, 0x1Bu);
while (_interlockedbittestandset(a1, 0))
{
v2 = 0;
do
{
++v2;
if (!(v2 & dword_8002D1B0))
{
if (dword_8002D19C & 0x40)
{
v3 = result;
v4 = a1;
v5 = v2;
dword_8002D1B4(v2);
v2 = v5;
a1 = v4;
result = v3;
}
}
_mm_pause();
}
while (*a1 & 1);
}
return result;
}
バージョンによってコードが異なるのはなぜですか?特に、Windows 7バージョンで追加されたコードが、仮想化におけるスピンロックのパフォーマンスをどのように向上させるかはわかりません。
変更がパフォーマンス上の理由からだと思いますか? –
申し訳ありませんが、Windows 7のバージョンがXen環境でより優れたパフォーマンスを持つことを意味します。私はそれをはっきり言っていませんでした。また、私はそれを証明するためにいくつかのテストを行った。 –
この質問の目的が何であるかは不明です。あなた自身のコードで同じテクニックを使用できるように説明を探していますか?この変更を追跡した問題をデバッグしていますか?これはちょうどアイドルな好奇心ですか? –