首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Windows XP和Windows 7的旋转锁实现方式不同?

为什么Windows XP和Windows 7的旋转锁实现方式不同?
EN

Stack Overflow用户
提问于 2012-01-19 17:59:28
回答 1查看 1.2K关注 0票数 3

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

Windows XP的反编译自旋锁。

代码语言:javascript
运行
复制
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的反编译自旋锁。

代码语言:javascript
运行
复制
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版本中添加的代码如何提高spinlock在虚拟化方面的性能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-28 08:23:59

KeAcquireSpinLockRaiseToSynchKeAcquireSpinLock不同。

KeAcquireSpinLockRaiseToSynchreserved for system use,不能由接口驱动程序使用。

这就是区别所在。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8924069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档