深入解析文件系统:缓存、过滤驱动与故障排查
1. 缓存管理器的预读线程
缓存管理器包含一个预读线程,其职责是在应用程序、驱动程序或系统线程明确请求之前,尝试从文件中读取数据。该线程依据文件对象的私有缓存映射中存储的文件读取操作历史,来确定要读取的数据量。当预读线程执行预读操作时,它会将想要读取的文件部分映射到缓存中(必要时分配 VACBs),并访问映射的数据。因内存访问引发的页面错误会调用页面错误处理程序,该程序会将页面读入系统的工作集。
2. 内存管理器的页面错误处理程序
页面错误处理程序不仅在显式文件 I/O 和缓存管理器预读的场景中被使用,当任何应用程序访问作为映射文件视图的虚拟内存,且遇到代表文件部分但不属于应用程序工作集的页面时,也会调用该处理程序。内存管理器的 MmAccessFault 处理程序在处理由 CcCopyRead 或 CcCopyWrite 生成的页面错误时,会通过 IoPageRead 向存储文件的文件系统发送 IRP。
3. 文件系统过滤驱动
覆盖在文件系统驱动之上的过滤驱动被称为文件系统过滤驱动。它能够查看所有文件系统请求,并可选择修改或完成这些请求,这使得它在多个应用场景中发挥作用,包括远程文件复制服务、文件加密、高效备份和许可管理等。例如,每个商业实时病毒扫描器都包含一个文件系统过滤驱动,用于拦截应用程序打开文件时发出的 IRP_MJ_CREATE 命令的 IRP。在将 IRP 传递给目标文件系统驱动之前,病毒扫描器会检查要打开的文件是否感染病毒。若文件干净,病毒扫描器会传递 IRP;若文件感染病毒,它会与关联的 Windows 服务进程通信,对文件进行隔离或清理。若文件无法清理,驱动会使 IRP