kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1502回复:15

内存的问题

楼主#
更多 发布于:2004-05-11 10:33
我在驱动中分配了8k的数,分的是非分页内存,可是不知道为什么我在中断下用的时候,老是出错,说什么break due to page fault (0eh),fault=0000,可是我明明分配的是非分页内存亚,怎么会受页的限制呢?如果我在中断处理下用的4k 的话就没有问题,这是怎么回事?急!急!帮帮忙忙!!!

最新喜欢:

SmileWolf9623SmileW...
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-05-11 12:50
在使用前先检测你的页表,确保是否处于内存中
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-11 16:55
能具体点么?怎么检测亚,用什么函数?能告诉么?
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-12 10:20
我是非分页内存,怎么还要检测页表呢?能具体点么?不太明白。谢谢!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2004-05-12 10:42
MmIsAddressValid checks whether a page fault will occur for a read or write operation at a given virtual address.

BOOLEAN
  MmIsAddressValid(
    IN PVOID  VirtualAddress
    );
你在确保有效后再进行读写......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-12 16:52
wowocock:
 我在分配非分页内存后中加入了MmIsAddressValid,返回的是true,这是不是说明我分配的内存无效,还是我用的不对呀。

我的程序如下:
SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1024*9); //allocate memory in driver
status=MmIsAddressValid(SystemVirtualAddress);
Mdl = IoAllocateMdl(SystemVirtualAddress, 1024*9, FALSE, FALSE, NULL);
if(!Mdl)
{
ExFreePool(SystemVirtualAddress);
return(NULL);
}

MmBuildMdlForNonPagedPool(Mdl);

strcpy(SystemVirtualAddress, \"In Driver\");


terrychen
驱动小牛
驱动小牛
  • 注册日期2002-04-15
  • 最后登录2014-03-13
  • 粉丝0
  • 关注0
  • 积分174分
  • 威望68点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-12 17:35
再检查检查你的程序的指针,可能有的指针指错地方了,我是经常发生这样问题的
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2004-05-12 18:29
MmIsAddressValid,返回的是true说明可以访问该地址.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-05-13 08:35

可是在ddk中对MmIsAddressValid又一句说明,如下:Even if MmIsAddressValid returns TRUE, accessing the address can cause page faults unless the memory has been locked down or the address is a valid nonpaged pool address.

是不是我分配的nonpaged pool 是无效的,还有别的方法分配内非分页内存么?有一个MmAllocateContiguousMemory函数,可是我不会用它的第二个参数不知道怎么定义这个类型:PHYSICAL_ADDRESS,有人知道怎么用么?帮帮忙!!!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2004-05-13 10:03
先ExAllocatePool ,IoAllocateMdl,MmBuildMdlForNonPagedPool
然后
MmProbeAndLockPages probes specified pages, makes them resident, and locks the physical pages mapped by the virtual address range in memory; the MDL is updated to describe the physical pages.

VOID
  MmProbeAndLockPages(
    IN OUT PMDL  MemoryDescriptorList,
    IN KPROCESSOR_MODE  AccessMode,
    IN LOCK_OPERATION  Operation
    );
再MmIsAddressValid,然后再进行内存访问
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-17 10:39
wowocock:

你说的那个函数MmProbeAndLockPages,在我这用不了,一用就出错。
我的程序是这样写的
我在driverentry里分配内存的大小程序如下所示:
      SystemVirtualAddress =ExAllocatePool(NonPagedPool, 8192);   //allocate memory in driver
      
Mdl = IoAllocateMdl(SystemVirtualAddress, 8192, FALSE, FALSE, NULL);
      if(!Mdl)
      {
       ExFreePool(SystemVirtualAddress);
       return(NULL);
       }

MmBuildMdlForNonPagedPool(Mdl);
在AMCC5920Dispatch里映射内存:
case IOCTL_AMCC5920_MAP_MEMORY:
 try
 {
              UserVirtualAddress=MmMapLockedPages(Mdl, UserMode);
 DbgPrint(\"IO_GETADD:pUserVirAdd=%d\\n\",UserVirtualAddress);//

 

*((PVOID *)(pIrp->UserBuffer)) = UserVirtualAddress;
if(UserVirtualAddress==0
 {
                    
        Status=(!STATUS_SUCCESS)
                      break;
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        pIrp->IoStatus.Information = sizeof(PVOID);
  }
       except(EXCEPTION_EXECUTE_HANDLER)
      {
       }
       break;
 在MmProbeAndLockPages里有说明The highest-level driver in a chain of layered drivers that use direct I/O calls this routine. Drivers that use buffered I/O never call MmProbeAndLockPages


还有别的函数可以代替么,MmProbeAndLockPages是不是就是锁住页并且搜索页。
以我上面写的程序问题是出在哪呢?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2004-05-17 11:18
在AMCC5920Dispatch里映射内存里,你IRQL是多少????如果高于DPC的话,还是在DPC里进行处理吧
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2004-05-17 11:21
MmAllocateContiguousMemory
MmAllocateContiguousMemory allocates a range of physically contiguous, cache-aligned memory from nonpaged pool.

PVOID
  MmAllocateContiguousMemory(
    IN ULONG  NumberOfBytes,
    IN PHYSICAL_ADDRESS  HighestAcceptableAddress
    );
Parameters
NumberOfBytes
Specifies the size in bytes of the block of contiguous memory to be allocated.
HighestAcceptableAddress
Specifies the highest valid physical address the driver can use. For example, if a device can only reference physical memory in the lower 16MB, this value would be set to 0x00000000FFFFFF.
不是已经说的很清楚了???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-05-17 15:17
我设0x00000000FFFFFF不能用的?提示有错。

kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-05-18 13:19
我感觉在kerneldriver里好像没有dpc,它就一个中断处理,好像没有分什么isr和dpc,AMCC5920Dispatch的irql应该不会高于dpc吧。
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2004-05-18 18:42
建议你先看看《Inside Windows 2000》
游客

返回顶部