chelalv
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2010-04-15
  • 粉丝1
  • 关注0
  • 积分22分
  • 威望146点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1668回复:2

windows server 2003下分配内存

楼主#
更多 发布于:2009-05-18 10:30
我用的是Xilinx的ML505这块开发板,Xilinx提供的硬件代码、驱动和应用软件PCI_express_DMA_Freeware_Virtex。
这个驱动要分配一段连续的内存来读写。下面两个函数是在EvtDeviceAdd调用。 EvtDeviceAdd is called by the framework in response to AddDevice call from the PnP manager

devExt->BufferLogicalAddress  = MmAllocateContiguousMemory(devExt->BufferSize, physicalAddress);

devExt->physicalAddress = MmGetPhysicalAddress((PVOID)devExt->BufferLogicalAddress);

下面的函数是在PCIEIOCtrlCode调用。
case IOCTL_GET_BUFFERADDRESS:
{
  phyAddress.HighPart = 0;
  phyAddress.LowPart  = (ULONG)devExt->BufferPhysicalAddress;

  devExt->BufferSystemVirtualAddress = MmMapIoSpace(phyAddress, PCIE_BUFFER_SIZE, MmNonCached);
  
devExt->BufferMdl = IoAllocateMdl(devExt->BufferSystemVirtualAddress, PCIE_BUFFER_SIZE, FALSE, FALSE, NULL);

    MmBuildMdlForNonPagedPool(devExt->BufferMdl);

devExt->BufferUserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(devExt->BufferMdl, UserMode))) + MmGetMdlByteOffset(devExt->BufferMdl));

}


这个驱动在windows xp下可以正常使用,但是在windows server 2003下就会出现蓝屏,错误的地方是这样一个函数:
MmMapLockedPages(devExt->Buffer2Mdl, UserMode),我用windbg调试,显示:MmMapLockedPages called when not at APC_LEVEL or below.

我把usermode改为kernelmode就可以,我还用MmMapLockedPagesSpecifyCache(devExt->BufferMdl, UserMode,MmNonCached,NULL,FALSE,NormalPagePriority)
来代替,也是usermode的问题,为什么一样的函数在xp下可以用,在server下就不能用呢?

但是改为kernelmode后函数返回的地址是内核地址,用户态不能用,所以不知道该怎么办啊。
chelalv
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2010-04-15
  • 粉丝1
  • 关注0
  • 积分22分
  • 威望146点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-05-18 10:47
我还用了另外一种方法:
physicalAddress.LowPart  = 0x80000000;
physicalAddress.HighPart = 0x0;

SkipBytes.LowPart=0x00001000;
SkipBytes.LowPart=0x0;
DevExt->BufferMdl = MmAllocatePagesForMdl(LowAddress,
                physicalAddress,
                SkipBytes,
                DevExt->BufferSize);
if(!DevExt->BufferMdl)
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
 DevExt->BufferPhysicalAddress   =    MmGetSystemAddressForMdlSafe(
                                                                                           DevExt->BufferMdl,
                                                                                           NormalPagePriority);

DevExt->BufferUserVirtualAddress= MmMapLockedPagesSpecifyCache(DevExt->BufferMdl,
                        UserMode,
                        MmNonCached,
                        NULL,
                        FALSE,
                        NormalPagePriority);

还是在MmMapLockedPagesSpecifyCache这个函数处出现蓝屏。
chelalv
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2010-04-15
  • 粉丝1
  • 关注0
  • 积分22分
  • 威望146点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-05-18 11:03
另外MmAllocatePagesForMdl分配的是否是物理上连续的内存,像MmAllocateContiguousMemory一样?
游客

返回顶部