阅读:1423回复:0
重复建立释放内核buffer的问题
我现在需要在内核中重复建立释放一个buffer,我的方法是这样的,我有2个函数,一个是allocate一个内核buffer,一个是释放这个内核buffer,在allocate内核buffer后我用mdl进行了用户层和kernel层的映射:
CmnBuffSysVirAddr = (*pDevExt->DmaAdapter->DmaOperations->AllocateCommonBuffer)( pDevExt->DmaAdapter, BuffSize, &pDevExt->CmnBuffSysPhyAddr, FALSE ); Mdl= IoAllocateMdl(CmnBuffSysVirAddr, CmnBuffSize, FALSE,FALSE,NULL ); MmBuildMdlForNonPagedPool(Mdl); MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); CmnBuffUserAddr= (PVOID)MmMapLockedPagesSpecifyCache(Mdl,UserMode, MmNonCached, NULL, FALSE, NormalPagePriority ); 在释放这个内核buffer的时候 MmUnmapLockedPages(CmnBuffUserAddr,Mdl); IoFreeMdl(Mdl); if(CmnBuffSysVirAddr ){ (*pDevExt->DmaAdapter->DmaOperations->FreeCommonBuffer)( DmaAdapter, CmnBuffSize, CmnBuffSysPhyAddr, CmnBuffSysVirAddr, FALSE ); 在进行几次测试的时候,这个程序没有问题,如果我做死循环,一直不停的开buffer,释放buffer的话,大概几分钟之后程序就报错,用windebug跟踪发现在allocate内核buffer的函数里面,建立mdl映射的时候出错了,于是我只在内存中开buffer释放buffer的话,程序就没有错误,这几天我一直在想原因,是不是windows的mdl操作有什么限制条件而我没有注意到。 (注:在程序运行的时候,我一直监视任务管理器,没有发现异常情况。nopage内存和handler都很正常) 那位大虾指点一下,让小弟不在郁闷,小弟先谢过了 |
|