因此,在使用MmMapIoSpace
映射内存空间时,我注意到超过某一点时,数据在写入时才被丢弃。没有错误,断点,甚至错误检查。一切都正常,没有任何不利影响。
我决定进行一次写入/读取测试(驱动程序会在预期的大小的长度上为每个字节写入1)并且读取器(用户态)模式将读取并报告1的位置结束。
它提出的数字是3208,这是一个看似不错的圆形数字(/ 8 = 401,/ 256 = 12等)
这是怎么回事?为什么我无法映射完整的缓冲空间?
编辑在64位中,它降至2492。
答案 0 :(得分:2)
我不是专家,但我不知道如何依赖MmMapIoSpace来做你要求的事情,因为无法保证用户空间缓冲区在物理内存中是连续的。
相反,我认为您应该使用IoAllocateMdl
和MmProbeAndLockPages
锁定用户缓冲区,然后MmGetSystemAddressForMdlSafe
将其映射到系统地址空间。此过程为described here。
如前所述,我认为映射失败的点(3208/2492字节进入缓冲区)可能只是页面的结尾,但这很容易验证:获取用户空间应用程序报告未写入的第一个字节的(虚拟)地址而不是偏移量,并检查它是否是4096的倍数。