为什么Windows XP和Windows 7的自旋锁实现不同?
我知道自旋锁是由Windows中的hal.dll导出的,所以我对自旋锁的代码进行了反向工程。结果如下 Windows XP的反编译自旋锁为什么Windows XP和Windows 7的自旋锁实现不同?,windows,kernel,spinlock,Windows,Kernel,Spinlock,我知道自旋锁是由Windows中的hal.dll导出的,所以我对自旋锁的代码进行了反向工程。结果如下 Windows XP的反编译自旋锁 unsigned __int32 __thiscall KfAcquireSpinLock(signed __int32 *this) { unsigned __int32 result; // eax@1 result = __readfsdword(36); __writefsdword(36, 2u); while ( _interlo
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;
}
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;
}
Windows7的反编译自旋锁
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;
}
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版本中添加的代码如何提高自旋锁在虚拟化中的性能。
KeAcquireSpinLockRaiseToSynch
与之不同
KeAcquireSpinLockRaiseToSynch
是,不用于接口驱动程序
这就是区别。您为什么认为这些更改是出于性能原因?对不起,我指的是Windows 7版本在Xen环境下具有更好的性能。我没有说清楚。我也做了一些测试来证明这一点。现在还不清楚这个问题的目的是什么。您是否在寻找解释,以便在自己的代码中使用相同的技术?您是否正在调试跟踪到此更改的问题?这只是无聊的好奇心吗?无聊的好奇心与堆栈溢出无关。常见问题解答说:“你应该只根据你面临的实际问题提出实际的、可回答的问题。”@Raymond Chen:“无聊的好奇心与堆栈溢出无关。”愚蠢的评论和同样的操纵让op承认摆在她面前的话。考虑到op投入的工作,“空闲”显然不是一个公平的描述——这是你的形容词,而不是她。这个行业需要更多好奇的人,可能用更少的人做得更好。实际上,
KeAcquireSpinLockRaiseToSynch
与KeAcquireSpinLock
一样。我可以证明我反向工程了Windows 7的KeAcquireSpinLock
的代码。persudo代码如下:void\u cdecl kFaquireSpinLock(){uu writefsbyte(36,2u);JUMPOUT(loc\u 8001371E)}
loc\u 8001371E
是KeAcquireSpinLockRaiseToSynch
的地址。