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

非分页内存的访问问题

楼主#
更多 发布于:2004-04-20 16:29
我用共享内存在应用程序和驱动程序间传递数据,我在驱动程序中分配了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);

帮帮忙?

最新喜欢:

flyingflying
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-21 10:23
怎么有人回答亚。
hoosyman
驱动小牛
驱动小牛
  • 注册日期2002-10-31
  • 最后登录2006-07-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-21 10:43
在共享内存的操作时,有两个步骤:
1。申请内存空间
2。映射内存
上述两个步骤一定要在同一个进程的上下文中实现,譬如把这两步都放在驱动程序的DispatchIoctl()函数中实现。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-04-21 11:19
9k又不大,完全可以用非分页内存,何必舍近求远???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-21 13:25
wowocock
我用的是非分页内存亚,舍近求远是什么意思亚?
hoosyman
我看以前的贴子说申请内存在driverentry中来实现,而分配内存在DispatchIoctl()中来实现?难道不对么,这两个步骤都应该在DispatchIoctl()中来实现么?
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2004-04-21 14:34
一页4K,其他的页可能影射到另外的非连续空间,所以最好一次不要超过4K
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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());
}



juventus
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-21 17:04
看你的意思好像是想把驱动分配的9K内存映射到用户空间,不知道是不是这样?
如果是这样,你这样做是不会映射成功的。
在中断中的问题,怀疑是在做dma时,出现问题。
dma需要的连续的物理地址,一定要搞清楚
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-22 13:47
/**********************************************************/

看你的意思好像是想把驱动分配的9K内存映射到用户空间,不知道是不是这样?
如果是这样,你这样做是不会映射成功的。
在中断中的问题,怀疑是在做dma时,出现问题。
dma需要的连续的物理地址,一定要搞清楚
/****************************************************/
juventus:
对呀我是想把驱动分配的9K内存映射到用户空间,我这样做为什么不能映射成功呢?我看共享内存的文章确实是这么做的亚。
我在中断中没有用dma 亚。也不知道问题出在那里?
我用连续分配内存的函数式了试可是却提示说该函数用不了,不知道什么原因。






juventus
驱动牛犊
驱动牛犊
  • 注册日期2003-06-23
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-23 12:31
对呀我是想把驱动分配的9K内存映射到用户空间,我这样做为什么不能映射成功呢?我看共享内存的文章确实是这么做的亚。
// 你需要参考section的那个例子

我用连续分配内存的函数式了试可是却提示说该函数用不了,不知道什么原因。
// 直接用,在使用的文件里前向声明它
kucy_zhou@163.c
驱动牛犊
驱动牛犊
  • 注册日期2003-11-26
  • 最后登录2005-11-04
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-23 13:13
juventus:
// 你需要参考section的那个例子

那个section的例子,实在ddk中么,能详细点么?
ddong
驱动牛犊
驱动牛犊
  • 注册日期2002-11-23
  • 最后登录2012-02-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望11点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-29 15:12
分配内存和构造MDL时,先把你要的长度页对齐一下。
ddong
驱动牛犊
驱动牛犊
  • 注册日期2002-11-23
  • 最后登录2012-02-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望11点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-29 15:16
从驱动中映射到App时,需要在那个App的上下文中进行映射才可以。比如你的App给驱动法了一个IOctrl,那个这个Ioctrl的处理一般就是在你的App的上下文中,那么这是就可以进行映射。
游客

返回顶部