1.Windows的缓存管理器概述
1.1 缓存管理器介于内存管理器(VMM)和文件系统驱动程序(FS)之间,它包含一组以"Cc"打头的内核模式函数,全局变量,以及一些系统线程.
1.2 缓存管理器(CM)以虚拟块(Virtual Block)为基础来缓存数据,
这使得可以在不涉及文件系统驱动程序的情况下进行智能预读((Read_Ahead)和延迟(Lazy_Write)
1.3 Windows缓存管理器使用一种称为虚拟块缓存(virtual Block caching)的方法,它跟踪,记录了哪些文件的哪些部分位于缓存中.
1.4 在intel x86系统中,系统默认的缓存大小为512MB,地址范围是0xc1000000--0xe100000
2.缓存管理器during read and write operation
2.1 读的操作.
大致的过程如下,从I/O管理器发出一个read的IRP开始,然后是到文件系统驱动程序,然后是缓存管理器,再然后是虚拟内存管理器.
中间需要进行两个判断,1.缓存管理器是否将文件缓存到系统缓存中? 2,是否产生页错误?
2.2 写操作和读操作类似,见下图.
3.Cache Manager Interface
3.1 文件流(File Stream) 操作函数(
使文件映射到系统缓存中.
@ CcInitializeCacheMap()
@ CcSetFileSize()
@ CcFlushCache()
@ CcZeroData()
@ CcGetFileObjectFromSectionPtrs()
@ ......
3.2 文件系统接口
一旦一个文件已经被建立起缓存方式的访问环境,文件系统驱动程序就调用几个函数中的某一个来访问文件中的数据.
要访问被缓存的数据,可以通过下面三种主要的方法:
Copy Interface:在系统空间的缓存缓冲区和用户空间的进程缓存缓冲区之间进行用户数据Copy;
@ CcCopyRead() / CcFastCopyRead()
@ CcCopyWrite() / CcFastCopyWrite()
MDL Interface:通过DMA(直接内存访问),可以直接读写系统缓存的页面,而无需缓冲区的介入.为了描述对这些物理内存的引用,需要用到MDL.(内存描述符)
@ CcMdlRead()
@ CcMdlReadComplete()
@ CcMdlWrite()
@ CcMdlWriteComplete()
Pinning Interface:映射(mapping)和锁定(Pinning)的方法,使用虚拟地址来直接读写数据到缓存缓冲区中.
@ CcMapData()
@ CcPinMappedData()
@ CcPinRead()
@ CcSetDirtyPinnedData()
@ CcUnpinData()
@ ......