5331797
驱动牛犊
驱动牛犊
  • 注册日期2005-07-20
  • 最后登录2007-10-10
  • 粉丝0
  • 关注0
  • 积分107分
  • 威望13点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1423回复:0

重复建立释放内核buffer的问题

楼主#
更多 发布于:2007-06-20 13:32
我现在需要在内核中重复建立释放一个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都很正常)
那位大虾指点一下,让小弟不在郁闷,小弟先谢过了
游客

返回顶部