MmMapIoSpace的幻数

时间:2012-06-14 17:46:21

标签: windows memory-management driver kernel

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

我决定进行一次写入/读取测试(驱动程序会在预期的大小的长度上为每个字节写入1)并且读取器(用户态)模式将读取并报告1的位置结束。

它提出的数字是3208,这是一个看似不错的圆形数字(/ 8 = 401,/ 256 = 12等)

这是怎么回事?为什么我无法映射完整的缓冲空间?

编辑在64位中,它降至2492。

1 个答案:

答案 0 :(得分:2)

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

相反,我认为您应该使用IoAllocateMdlMmProbeAndLockPages锁定用户缓冲区,然后MmGetSystemAddressForMdlSafe将其映射到系统地址空间。此过程为described here

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