スピンロックはWindowsのhal.dllによってエクスポートされることがわかっているので、スピンロックのコードをリバースエンジニアリングしました。結果は以下のとおりです。
WindowsXPの逆コンパイルされたスピンロック。
unsigned __int32 __thiscall KfAcquireSpinLock(signed __int32 *this)
{
unsigned __int32 result; // eax@1
result = __readfsdword(36);
__writefsdword(36, 2u);
while ( _interlockedbittestandset(this, 0) )
{
while ( *this & 1 )
_mm_pause();
}
return result;
}
Windows7の逆コンパイルされたスピンロック。
unsigned __int32 __fastcall KeAcquireSpinLockRaiseToSynch(signed __int32 *a1)
{
unsigned __int32 result; // eax@1
int v2; // edx@4
unsigned __int32 v3; // ST0C_4@7
signed __int32 *v4; // ST08_4@7
int v5; // ST04_4@7
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バージョンで追加されたコードが、仮想化におけるスピンロックのパフォーマンスをどのように改善するかはわかりません。