Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Windows XP和Windows 7的自旋锁实现不同?_Windows_Kernel_Spinlock - Fatal编程技术网

为什么Windows XP和Windows 7的自旋锁实现不同?

为什么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

我知道自旋锁是由Windows中的hal.dll导出的,所以我对自旋锁的代码进行了反向工程。结果如下

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;
}
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
的地址。