2

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

我决定做一个写/读测试(驱动程序会在每个字节写入 1 以达到预期大小的长度),阅读器(用户态)模式将读取并报告 1 的结束位置。

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

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

编辑在 64 位中它下降到 2492。

4

1 回答 1

2

我不是专家,但我不明白如何依赖 MmMapIoSpace 来完成您要求的操作,因为无法保证用户空间缓冲区在物理内存中是连续的。

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

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

于 2012-06-15T08:52:18.863 回答