Windows 带MmMapIoSpace的幻数

Windows 带MmMapIoSpace的幻数,windows,memory-management,driver,kernel,Windows,Memory Management,Driver,Kernel,因此,在使用MmMapIoSpace映射内存空间时,我注意到,经过某个点后,数据在写入时被丢弃。没有引发错误、断点甚至错误检查。一切正常,只是没有任何不利影响 我决定做一个写/读测试(驱动程序会将1写入预期大小的每个字节),读卡器(userland)模式会读取并报告1的结束位置 它得出的数字是3208,这似乎是一个不错的整数(/8=401,/256=12,等等) 这是怎么回事?为什么我不能映射完整的缓冲区空间 编辑,在64位时它会下降到2492。我不是专家,但我不知道如何依靠MmMapIoSpa

因此,在使用
MmMapIoSpace
映射内存空间时,我注意到,经过某个点后,数据在写入时被丢弃。没有引发错误、断点甚至错误检查。一切正常,只是没有任何不利影响

我决定做一个写/读测试(驱动程序会将1写入预期大小的每个字节),读卡器(userland)模式会读取并报告1的结束位置

它得出的数字是3208,这似乎是一个不错的整数(/8=401,/256=12,等等)

这是怎么回事?为什么我不能映射完整的缓冲区空间


编辑,在64位时它会下降到2492。

我不是专家,但我不知道如何依靠MmMapIoSpace来完成您要求它做的事情,因为无法保证用户空间缓冲区在物理内存中是连续的

相反,我认为应该使用和来锁定用户缓冲区,然后将其映射到系统地址空间。这一过程非常复杂


如前所述,我认为映射失败的点(缓冲区中的3208/2492字节)可能只是页面的结尾,但这很容易让您验证:让用户空间应用程序报告未写入的第一个字节的(虚拟)地址,而不是偏移量,并检查它是否是4096的倍数。

MmMapIoSpace用于访问内存映射的I/O设备。内存的行为可能取决于所讨论的硬件设备。相反,如果您将它指向物理RAM而不是I/O设备,那么您将以不受支持的方式使用它,并且行为可能未定义。如果这还不能回答您的问题,您需要向我们提供更多的上下文:例如,您的设备驱动程序管理的是哪种设备?它将内存从映射到用户land driver。我刚刚意识到我做了一个derp评论。它将用户陆地内存映射到驱动程序可写缓冲区。根据MmMapIoSpace的文档,我很确定它不支持您尝试执行的操作。您是希望驱动程序访问由用户空间进程分配的内存缓冲区,还是试图让用户空间进程访问由驱动程序分配的缓冲区?PhysicalAddress(传递到MmMapIoSpace)页是否对齐?我不知道映射怎么会在页面末尾的任何地方停止工作,所以我猜您看到的3208/2492完全是由其页面内物理地址的偏移量决定的。(x86和x64系统上的页面是4096字节,或IA64上的页面是8192字节。)是的(40400/9)。有趣!我会玩弄你的方法,看看我是否能做这样的事。我不是要在工作中使用扳手,但40400不是4096的倍数。(请注意,Windows计算器在编程模式下执行除法操作时会截断小数部分。)搞定了!工作得很好!非常感谢你!