阅读:3014回复:12
非分页内存的访问问题
我用共享内存在应用程序和驱动程序间传递数据,我在驱动程序中分配了9k的非分页内存,然后再中断处理中从板卡中读8k的数据,可是却出现下面的问题:
break due to page fault (0eh),fault=0000 若是在中断处理中从板卡中读4k的数据,就没问题,不知道为何难道在中断处理下对非分页内存的访问有限制么? 我的程序如下: 分配内存: SystemVirtualAddress = ExAllocatePool(NonPagedPool, 1024*9); //allocate memory in driver Mdl = IoAllocateMdl(SystemVirtualAddress, 1024*9, FALSE, FALSE, NULL); if(!Mdl) { ExFreePool(SystemVirtualAddress); return(NULL); } MmBuildMdlForNonPagedPool(Mdl); strcpy(SystemVirtualAddress, \"In Driver\"); 映射内存: case IOCTL_AMCC5920_MAP_MEMORY: try { UserVirtualAddress = MmMapLockedPagesSpecifyCache(Mdl, UserMode,NULL,NULL,FALSE,NULL); // Priority DbgPrint(\"IO_GETADD:pUserVirAdd=%d\\n\",UserVirtualAddress);// *((PVOID *)(pIrp->UserBuffer)) = UserVirtualAddress; if(UserVirtualAddress==0) { DbgPrint(\"UserVirtualAddress==0\\n\");// Status=(!STATUS_SUCCESS); break; } pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = sizeof(PVOID); } 中断处理: AMCC5920_ReadWriteBlock(hAMCC5920,AMCC5920_AD_BAR3,0x0,1,SystemVirtualAddress,2048*2,AMCC5920_MODE_DWORD); 帮帮忙? |
|
最新喜欢:![]() |
沙发#
发布于:2004-04-29 15:16
从驱动中映射到App时,需要在那个App的上下文中进行映射才可以。比如你的App给驱动法了一个IOctrl,那个这个Ioctrl的处理一般就是在你的App的上下文中,那么这是就可以进行映射。
|
|
板凳#
发布于:2004-04-29 15:12
分配内存和构造MDL时,先把你要的长度页对齐一下。
|
|
地板#
发布于:2004-04-23 13:13
juventus:
// 你需要参考section的那个例子 那个section的例子,实在ddk中么,能详细点么? |
|
地下室#
发布于:2004-04-23 12:31
对呀我是想把驱动分配的9K内存映射到用户空间,我这样做为什么不能映射成功呢?我看共享内存的文章确实是这么做的亚。
// 你需要参考section的那个例子 我用连续分配内存的函数式了试可是却提示说该函数用不了,不知道什么原因。 // 直接用,在使用的文件里前向声明它 |
|
5楼#
发布于:2004-04-22 13:47
/**********************************************************/
看你的意思好像是想把驱动分配的9K内存映射到用户空间,不知道是不是这样? 如果是这样,你这样做是不会映射成功的。 在中断中的问题,怀疑是在做dma时,出现问题。 dma需要的连续的物理地址,一定要搞清楚 /****************************************************/ juventus: 对呀我是想把驱动分配的9K内存映射到用户空间,我这样做为什么不能映射成功呢?我看共享内存的文章确实是这么做的亚。 我在中断中没有用dma 亚。也不知道问题出在那里? 我用连续分配内存的函数式了试可是却提示说该函数用不了,不知道什么原因。 |
|
6楼#
发布于:2004-04-21 17:04
看你的意思好像是想把驱动分配的9K内存映射到用户空间,不知道是不是这样?
如果是这样,你这样做是不会映射成功的。 在中断中的问题,怀疑是在做dma时,出现问题。 dma需要的连续的物理地址,一定要搞清楚 |
|
7楼#
发布于:2004-04-21 16:32
wowocock:
我在驱动中分配的就是非分页内存亚不是分页内存ExAllocatePool(NonPagedPool, 1024*9) ,可是怎么在中断处理中就会出错呢? 而且在应用中也映射不过来不知道为什么? hoosyman: 我按照你的方法试了,内存分配和内存映射都在DispatchIoctl()函数中做的,可是还是映射不过来呀,帮帮忙好么? 我在应用程序映射代码如下: DWORD databuf[1024]; if(!DeviceIoControl(hAMCC5920, IOCTL_AMCC5920_MAP_MEMORY, NULL, 0, (PDWORD)&DataBuf, sizeof(1024), &dwReturnedLength, NULL)) { printf(\"Ioctl mapmemory failed x%\\n \",GetLastError()); } |
|
8楼#
发布于:2004-04-21 14:34
一页4K,其他的页可能影射到另外的非连续空间,所以最好一次不要超过4K
|
|
|
9楼#
发布于:2004-04-21 13:25
wowocock
我用的是非分页内存亚,舍近求远是什么意思亚? hoosyman 我看以前的贴子说申请内存在driverentry中来实现,而分配内存在DispatchIoctl()中来实现?难道不对么,这两个步骤都应该在DispatchIoctl()中来实现么? |
|
10楼#
发布于:2004-04-21 11:19
9k又不大,完全可以用非分页内存,何必舍近求远???
|
|
|
11楼#
发布于:2004-04-21 10:43
在共享内存的操作时,有两个步骤:
1。申请内存空间 2。映射内存 上述两个步骤一定要在同一个进程的上下文中实现,譬如把这两步都放在驱动程序的DispatchIoctl()函数中实现。 |
|
12楼#
发布于:2004-04-21 10:23
怎么有人回答亚。
|
|