2012-01-19 6 views
3

Я знаю, что spinlock экспортируется hal.dll в Windows, поэтому я переделал код для блокировки вращения. Результаты приведены ниже.Почему реализация блокировки спина отличается от Windows XP и Windows 7?

Декомпилированная спин-блокировка Windows XP.

unsigned __int32 __thiscall KfAcquireSpinLock(signed __int32 *this) 
{ 
    unsigned __int32 result; // [email protected] 

    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; // [email protected] 
    int v2; // [email protected] 
    unsigned __int32 v3; // [email protected] 
    signed __int32 *v4; // [email protected] 
    int v5; // [email protected] 

    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, улучшает производительность спинблока в виртуализации.

+0

Что заставляет вас думать, что изменения были вызваны служебными соображениями? –

+0

Извините, я имею в виду версию Windows 7, имеющую лучшую производительность в среде Xen. Я этого не сказал. А также я сделал несколько тестов, чтобы подтвердить это. –

+0

Непонятно, какова цель этого вопроса. Вы ищете объяснение, чтобы вы могли использовать ту же технику в своем собственном коде? Вы отлаживаете проблему, связанную с этим изменением? Это просто праздное любопытство? –

ответ

3

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

KeAcquireSpinLockRaiseToSynch является reserved for system use, не предназначенный для использования в качестве интерфейса.

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

+0

Фактически «KeAcquireSpinLockRaiseToSynch» такой же, как «KeAcquireSpinLock». Я могу доказать, что ~ –

+0

стесняйтесь сделать это –

+0

я обратный engneeried код 'KeAcquireSpinLock' из Windows, 7.The код persudo, как показано ниже: ' недействительным __cdecl KfAcquireSpinLock() { __writefsbyte (36, 2u) ; JUMPOUT (loc_8001371E); } ' –