本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 3584|回复: 11

求助牛人,关于自旋锁导致BSOD的问题 [复制链接]

Rank: 2

发表于 2010-5-7 11:56:04 |显示全部楼层
小弟是入门级别的人,编写了一个关于链表操作的自旋锁
可是一加载驱动就蓝屏
麻烦无聊的大牛们看一下(PS:我WINDBG的调试平台正在搭建)

代码如下:

VOID LinkListTest()

{
    LIST_ENTRY linkListHead; //链表
    PMYDATASTRUCT pData; //节点数据
    ULONG i=0; // calculate
    KSPIN_LOCK spin_lock; //自旋锁
    KIRQL irql; //中断级别


    //初始化
    InitializeListHead(&linkListHead); //初始化链表
    KeInitializeSpinLock(&spin_lock);//初始化自旋锁
   
    //向链表插入10个元素
    KdPrint(("[Test] Begin insert to link list"));

    //锁定,注意这里的 irql是个指针 某一在对某一个链表操作时候必须禁止其他进程对该链表的修改

    KeAcquireSpinLock(&spin_lock,&irql);
    for (i = 0; i<10 ;i++)
    {
        pData = (PMYDATASTRUCT)ExAllocatePool(PagedPool,sizeof(MYDATASTRUCT));
        pData->number = i;
        InsertHeadList(&linkListHead,&pData->ListEntry);
    }
    //解锁,注意这里的irql不是指针
    KeReleaseSpinLock(&spin_lock,irql);
   
    //从链表中抽取所有数据并显示
    KdPrint(("[Test] Begin remove from link list\n"));

    //锁定  某一在对某一个链表操作时候必须禁止其他进程对该链表的修改

    KeAcquireSpinLock(&spin_lock,&irql);

    while(!IsListEmpty(&linkListHead))
    {
        PLIST_ENTRY pEntry = RemoveTailList(&linkListHead);
        //获取节点地址
        pData = CONTAINING_RECORD(pEntry,MYDATASTRUCT,ListEntry);
        //读取节点数据
        KdPrint(("[Test] %d\n",pData->number));
        ExFreePool(pData);
    }
    //操作完成,解锁
    KeReleaseSpinLock(&spin_lock,irql);
}

Rank: 2

发表于 2010-5-7 12:29:33 |显示全部楼层
蓝屏提示什么?你cpu几核?

Rank: 2

发表于 2010-5-7 14:59:15 |显示全部楼层
在KeAcquireSpinLock的情况下循环RemoveTailList貌似会出现问题,以前调试的情况

Rank: 2

发表于 2010-5-7 15:00:59 |显示全部楼层
以前我用的是RemoveHeadList,不过估计也是这个结果吧

Rank: 1

发表于 2010-5-7 16:00:54 |显示全部楼层


pData = (PMYDATASTRUCT)ExAllocatePool(PagedPool,sizeof(MYDATASTRUCT));

Rank: 2

发表于 2010-5-7 20:05:29 |显示全部楼层
试了下,楼上正解。
不过RemoveHeadList,用的是NonPagedPool还是会蓝,
不使用循环就没得问题。。。

Rank: 2

发表于 2010-5-8 03:49:45 |显示全部楼层
感谢各位大牛的解答

Rank: 2

发表于 2010-5-8 03:51:09 |显示全部楼层
要使用removeheadlist  对链表进行删除的话, 内存分配要进入 页?

Rank: 2

发表于 2010-5-10 13:47:27 |显示全部楼层
我尝试过了,去除循环和改变内存分配方式为非页面后,还是继续的BSOD

Rank: 1

发表于 2010-5-21 10:13:46 |显示全部楼层
linklist, spinlock 要分配在 nonpaged pool, 或者是全局的nonpaged 变量。stack 上肯定是要bugcheck的。

Rank: 1

发表于 2010-5-21 10:51:34 |显示全部楼层
The code within a critical region guarded by an spin lock must neither be pageable nor make any references to pageable data.
The code within a critical region guarded by a spin lock can neither call any external function that might access pageable data or raise an exception, nor can it generate any exceptions.
The caller should release the spin lock with KeReleaseSpinLock as quickly as possible

Rank: 2

发表于 2010-5-22 22:24:43 |显示全部楼层
0 0自旋锁不是要global的么?
= =不过看楼上众神无此回答,
估计我要被喷了。。。
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-16 11:56 , Processed in 0.032289 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部