tanky
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2332回复:16

物理内存不断减少

楼主#
更多 发布于:2002-05-29 15:20
任务管理器显示驱动程序工作时物理内存不断减少,但verifier显示的分页内存和非分页内存没什么变化,物理内存最少到了3000K,卸载驱动后,物理内存才释放到开始的水平,怎么回事
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-29 15:28
你是否不断申请内存,并且没有释放呀?
如果是这样,那可能需要修改代码,
还有,如果你使用某些调试工具,有可能是调试工具转存信息时申请的,象DebugPrint就需要申请内存来保存Debug信息(使用动态连表),
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
tanky
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-30 15:28
没有申请内存,没有用调试工具
程序运行时的功能就是从本地磁盘拷贝文件到服务器,结果考一个文件物理内存就少一大块,最少到了100k,这时拷贝就停不下来了,然后就是死机。
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-30 15:57
肯定是有内存分配了没释放!
你仔细检查一下
易水
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-30 20:01

内存泄露?!?

 ;)
[color=red]大头鬼! :P[/color]
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-30 20:12
显然是你把文件拷到内存中没释放而且你没写出导致缓冲池不断扩大,所以不断减少可分配内存,到最后很可能产生内存交换文件不断地来回调动而产生内存抖动,一定会当机的拉!
teddy
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-05-31 08:49
没释放,应该是这样
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-31 09:56
没有申请内存,没有用调试工具
程序运行时的功能就是从本地磁盘拷贝文件到服务器,结果考一个文件物理内存就少一大块,最少到了100k,这时拷贝就停不下来了,然后就是死机。


可以确定是你考文件时有写内存没有释放,你没有主动申请内存并不意味作你没有使用,系统有些函数需要申请内存,并且需要你自己去释放,还有系统的使用核心对象的创建都需要删除,引用也需要处理,凡此种种都需要注意,如果不能检查错误,可将这部分代码贴出来,大家看比一个人看更快
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
siteddypig
驱动牛犊
驱动牛犊
  • 注册日期2002-05-23
  • 最后登录2003-07-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-31 14:03
我现在正式怀疑这家伙根本没有写程序,骗我们玩,坏蛋!
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-31 17:16
每次拷贝文件时你是不是都创建了IPR ?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-05-31 19:17
是否用zwcreatefile, zwwritefile, zwreadfile来进行文件拷贝?
如果是这样的话,必须保证处理完之后把handle关掉。zwclose
否则系统的cache memory永远也不会清,结果就是mem不足。

八成没有直接处理irp吧,否则,自己没有分配内存几乎不可能。



tanky
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-06-03 10:55
就直接用的Irp->MdlAddress,
data=(UCHAR *)MmGetSystemAddressForMdlSafe(Irp->MdlAddress,HighPagePriority);
处理过程中需要的内存在初始化时分配了固定单元,处理Irp时不会再用到这部分代码,程序卸载时释放所申请的内存。
处理完成后,调用IoCompleteRequest完成Irp
Irp->IoStatus.status=STATUS_SUCCESS;
Irp->IoStatus.info=transfer_len;
IoCompleteRequest(Irp,IO_NO_INCREMENT);

虚拟的磁盘是一个网络磁盘,我注意到每次写一个文件时,系统的物理内存就少了一大块,再拷贝相同的文件(覆盖),物理内存不变,然后删除,物理内存不变,清空回收站,物理内存就恢复到原来的水平,可能是系统缓存用了这部分内存,但是本地硬盘拷贝,物理内存根本就没变化,为什么向我的磁盘拷的东西都被缓存起来了?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-06-03 14:50
only for guest..

the memory you use(MmGetSystemAddressForMdlSafe) has been MmProbeAndLockPages, because you code, system has no chance to call MmUnlockPages  or MmUnlockPages  failed. then it is keep in memory for ever.

[编辑 -  6/3/02 by  zdhe]
tanky
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-06-03 16:46
终于找到原因了:
我用的是
data=(UCHAR *)MmGetSystemAddressForMdlSafe(Irp->MdlAddress,HighPagePriority);
然后又用这个data指针调用IoAllowcateMdl
现在修改后我分了一个数组data1
memcpy(data1,data,len);
然后用data1来调用IoAllowcateMdl就没有物理内存减少的情况了。
我不直接把Irp->mdladdress传给下一步操作是因为在网络一次不能发送完数据时还要修改数据,重新建立新的MDL。
现在的问题是,为什么不能用从Irp->MdlAddress的来了虚拟地址做参数调用IoAllowcateMdl呢,我调用了AllowcatdMdl分配了mdl,但是使用完后我又释放了呀。采用数组这样拷来拷去毕竟降低了系统的性能呀。

zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2002-06-03 17:02
guess:
for same system memory range, MmProbeAndLockPages called two time.( one by os and one by you(when allocate mdl)).


MmUnlockPages only one time. -> by os.

-> then it will be kept in memory for ever.

you should not allocate mdl use same memory buffer.

if think about performance, you can use mdl pool(mate yourself).
tanky
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-06-04 09:56
你是说我对用IoAllowcateMdl分配的mdl调用MmUnlockPages没起作用?
linyulun
驱动小牛
驱动小牛
  • 注册日期2002-03-18
  • 最后登录2014-05-09
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-06-04 22:14
显然你肯定没有释放分配的内存.看看你在高中断级调用时的内存分配,那部分内存不会自动的被内存管理器收集的.
游客

返回顶部