首页
社区
课程
招聘
[笔记]自旋锁
发表于: 2015-8-11 13:39 3758

[笔记]自旋锁

2015-8-11 13:39
3758
#include <stdio.h>

__declspec(naked)
void AcquireSpinLock(long *pSpinLock)
{
    _asm
    {
        mov     ecx, [esp+4]
L_try:
        lock bts dword ptr [ecx], 0
        jb      L_spin
        retn

L_spin:
        test    dword ptr [ecx], 1
        jz      L_try
        pause
        jmp     L_spin
    }
}

int main()
{
    long SpinLock = 0;  // SpinLock为0,表示没有人持有SpinLock,反之为1
    //printf("%p\n", &SpinLock);
    AcquireSpinLock(&SpinLock);

    return 0;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
为啥要用汇编写?

void KeAcquireSpinLock (PSPIN_LOCK lock)
{
        USHORT cpunr = KeGetCurrentProcessorNumber();
        if (lock) {
                while (InterlockedCompareExchange (&lock->flag, 1, 0) == 1) {
                        //已持有锁时,不能递归申请
                        if (lock->owner == cpunr) {
                                ASSERT(FALSE);
                        }
                        _mm_pause();
                }
                lock->owner = cpunr;
        }
}
2015-8-11 18:17
0
雪    币: 284
活跃值: (3824)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
3
你这是泄露的源码里的?
用裸函数没有ebp框架,这是用IDA扒出来的,略改使可编译做原理演示,备忘;
为什么不能用汇编?

PS确实没考虑递归申请~
2015-8-11 19:21
0
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我也是逆别的东西时扒的,用C的好处是支持64位
2015-8-11 21:26
0
游客
登录 | 注册 方可回帖
返回