【问题标题】:Equivalent API to MmGetPhysicalAddress in WEC7WEC7 中 MmGetPhysicalAddress 的等效 API
【发布时间】:2017-07-26 09:29:43
【问题描述】:

我正在将 Windows 7 网络驱动程序代码移植到 WEC7。我被 API MmGetPhysicalAddress 卡住了。我在 WEC7 中没有找到与此等效的 API。任何人都可以帮助进一步进行..

谢谢。

【问题讨论】:

    标签: windows windows-ce network-driver


    【解决方案1】:

    MmGetPhysicalAddress 在 Windows CE 中不可用,但您可能也不需要它。

    InitializeHandlerEx 回调中的某个位置,驱动程序应该调用NdisMAllocateSharedMemory 来分配RX/TX 缓冲区。

    NdisMAllocateSharedMemory 返回分配缓冲区的虚拟地址和物理地址,因此您可以保留物理地址,然后就不需要向操作系统请求它。

    通常,物理地址与虚拟缓冲区地址一起保存在特定于驱动程序的每个缓冲区结构中。

    您可以在C:\WINCE700\public\COMMON\oak\drivers\netcard\e100bex\60 中找到此示例实现。在mp_init.c 中,注意NICAllocAdapterMemory 如何调用NdisMAllocateSharedMemory 并将每个缓冲区的物理地址存储在pMpTxbuf->BufferPa 中。

    【讨论】:

    • 我的要求是向固件发送一些命令,为此我在较低层分配了一个缓冲区。我没有使用 InitializeHandlerEx 中分配的缓冲区(tx/rx)向 FW 发送命令。由于我的网络适配器是 PCI,我需要将虚拟地址映射到 MDL 的物理地址。如何获取已分配 MDL 的物理地址?
    • 您可能会按照 Valter 的建议使用 LockPages,但如果使用非 NDIS 函数分配缓冲区,您需要确保它在物理上是连续的,假设您要去进行 DMA 传输
    【解决方案2】:

    你可以看看 LockPages: https://msdn.microsoft.com/en-us/library/ee482989.aspx 但是如果缓冲区不是使用 NDIS 函数分配的,它在物理内存中可能不是完全连续的,所以你可能需要检查一下。

    【讨论】:

    • 我用下面的代码替换了Windows 7的代码:DWORD pfn, offset_addr; if(!LockPages(data, length, &pfn, (LOCKFLAG_READ | LOCKFLAG_WRITE))){ printk("LockPages failed for block buffer\r\n");} offset_addr = pfn wb_mapped_pa​​ddr_lo[0] = offset_addr + ((DWORD)NET_BUFFER_DATA_OFFSET(os_buf));我不确定它是否正确?你能检查一下吗?
    • 我不明白你的代码,缺少一些变量的含义并且格式不正确。调用 LockPages 时是否出错?
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多