Почему реализации спин-блокировки отличаются в Windows XP и Windows 7? - PullRequest
3 голосов
/ 19 января 2012

Я знаю, что спин-блокировка экспортируется с помощью hal.dll в Windows, поэтому я реверс-инжиниринг кода для спин-блокировки.Ниже приведены результаты.

Декомпилированный спинлок 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;
}

Декомпилированный спинлок 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;
}

Почему код отличается в разных версиях?В частности, я не вижу, как код, добавленный в версии для Windows 7, улучшает производительность спин-блокировки в виртуализации.

1 Ответ

3 голосов
/ 28 января 2012

KeAcquireSpinLockRaiseToSynch - это не то же самое, что KeAcquireSpinLock.

KeAcquireSpinLockRaiseToSynch - зарезервировано для системного использования , не предназначено для использования интерфейсными драйверами.

Таким образом, разница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...