而且,在一些情况下,MDL 中的位置不会引用内存管理器保留的相同物理页。当 Microsoft Windows 内存管理器构建一个用于设备读取的 MDL 时,它锁定传输目标使用的物理页。但是,只由内存管理器来确定保留哪些页面和丢弃哪些页面(如果存在的话)。为什么内存管理器将数据读入这些页,然后丢弃它们?因为在更大的群集中进行 I/O 能够提供更好的性能。
例如,在下图中,对应于页 A、Y、Z 和 B 的文件偏移和虚拟地址都是逻辑上相邻的(虽然物理页本身不必相邻)。页 A 和 B 没有驻留在内存中,因此内存管理器必须读取它们。页 Y 和 Z 已经驻留在内存中,所以不必读取它们。(事实上,自从最近一次从备份存储区读入以来它们可能已经被修改,在这种情况下,覆盖它们的内容将会发生严重错误。)但是,在单个操作中读取页 A 和 B 比为页 A 进行一次读取并为页 B 进行第二次读取更有效。因此,内存管理器发出一个包含所有 4 个页(A、Y、Z 和 B)的单个从备份存储区读取的请求。这种读取请求包含对于读取有意义的任意多页(依赖于可用内存的量、当前系统使用情况等)。
当内存管理器构建描述请求的内存描述符列表 (MDL) 时,它提供页 A 和 B 的有效指针。但是,页 Y 和 Z 的条目指向单个系统范围的虚拟页 X。内存管理器可能会使用来自备份存储区的潜在的过时数据填充虚拟页 X(因为它使得 X 不可见)。但是,如果组件访问 MDL 中的 Y 和 Z 偏移,那么它看到的是虚拟页 X 而不是 Y 和 Z。