Pourquoi les implémentations du verrou de spin sont-elles différentes entre Windows XP et Windows 7?
Question
Je sais que le Spinlock est exporté par Hal.dll sous Windows, j'ai donc inversé le code pour le verrouillage de spin. Les résultats sont ci-dessous.
Spinlock décompilé de Windows XP.
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;
}
Spinlock décompilé de Windows 7.
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;
}
Pourquoi le code est-il différent entre les versions? En particulier, je ne vois pas comment le code ajouté dans la version Windows 7 améliore les performances de Spinlock dans la virtualisation.
Pas de solution correcte
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow