阅读:1502回复:15
内存的问题
我在驱动中分配了8k的数,分的是非分页内存,可是不知道为什么我在中断下用的时候,老是出错,说什么break due to page fault (0eh),fault=0000,可是我明明分配的是非分页内存亚,怎么会受页的限制呢?如果我在中断处理下用的4k 的话就没有问题,这是怎么回事?急!急!帮帮忙忙!!!
|
|
最新喜欢:![]() |
沙发#
发布于:2004-05-11 12:50
在使用前先检测你的页表,确保是否处于内存中
|
|
|
板凳#
发布于:2004-05-11 16:55
能具体点么?怎么检测亚,用什么函数?能告诉么?
|
|
地板#
发布于:2004-05-12 10:20
我是非分页内存,怎么还要检测页表呢?能具体点么?不太明白。谢谢!
|
|
地下室#
发布于: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 ); 你在确保有效后再进行读写...... |
|
|
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\"); |
|
6楼#
发布于:2004-05-12 17:35
再检查检查你的程序的指针,可能有的指针指错地方了,我是经常发生这样问题的
|
|
7楼#
发布于:2004-05-12 18:29
MmIsAddressValid,返回的是true说明可以访问该地址.
|
|
|
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,有人知道怎么用么?帮帮忙!!! |
|
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,然后再进行内存访问 |
|
|
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是不是就是锁住页并且搜索页。 以我上面写的程序问题是出在哪呢? |
|
11楼#
发布于:2004-05-17 11:18
在AMCC5920Dispatch里映射内存里,你IRQL是多少????如果高于DPC的话,还是在DPC里进行处理吧
|
|
|
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. 不是已经说的很清楚了??? |
|
|
13楼#
发布于:2004-05-17 15:17
我设0x00000000FFFFFF不能用的?提示有错。
|
|
14楼#
发布于:2004-05-18 13:19
我感觉在kerneldriver里好像没有dpc,它就一个中断处理,好像没有分什么isr和dpc,AMCC5920Dispatch的irql应该不会高于dpc吧。
|
|
15楼#
发布于:2004-05-18 18:42
建议你先看看《Inside Windows 2000》
|
|