导言:理解一本原版精典是我们每一个刚进入IT行业人员的梦想,今天这里将见证一位初哥的心历路程.需要中文原版的同志<Windows nt 文件系统内幕1-6>网上有.全部中文版可能马上就要面市了.大家可以在网上各大书店搜搜.....下面是我7章以后的译文....不好勿拍 ...也希望我能坚持下去.
谢谢支持!
Windows NT File System Internals第七章
NT缓存管理器II
本章主要介绍:
1.NT缓存管理器构造
2.模块间交互(文件系统和网络重定向器)
3.NT缓存管理器接口
上一章,我们介绍了NT缓存管理器怎样给文件流分配全局缓存,还有预读和延迟写功能.这一章我们要理解这样的问题,NT缓存管理器自身并不提供那样的功能,它必须和虚拟内存管理器,I/O管理器,文件系统还有网络重定向驱动一起偕同工作才能达到增加吞吐效率和提升系统性能的目的.
在这一章甚至还有下一章,我们会对NT缓存管理器当前的接口有个详细的说明.我指出个大概,接口中有些是NT缓存管理器为文件流缓存保留在内部使用的数据结构.其中的有些数据结构在我们以前的章节中也提到过.在本章你将会看到,NT缓存管理器怎样使文件流缓存在内存中的全部相关信息保持一致.
下面,我来描述一下,NT缓存管理器和文件系统驱动还有网络重定向器之间的相互关系.其中包括他们为获取资源而相互竞争,以及在为文件流启用前进行缓存部件检查的详细过程.在我们提供的示例代码基础上,可以在你自己的现实开发环境下开发并扩展出更多具体的功能.
虽然NT缓存管理器给文件系统驱动输出的例程非常简单,当前调用NT缓存管理器的模块仍然会发送自己的回调函数.我会在本章列出一些这样的例程给大家.在第十一章我们会更深入的介绍文件系统驱动的回调输出例程,Writing a File System Driver III 详细的说明和例子见附件.注消接口和MDL接口我们会在本章结尾论述.
NT缓存管理器结构
NT缓存管理器为每个文件流维护高速缓存的运行状态,在检查和NT缓存管理器相关的其它部件之前.这些信息可以被我们利用,用来描述NT缓存管理器内部给文件流缓存提供的状态信息的数据结构.给一点小提示,当前公开的在NT缓存管理器上使用的数据结构,有一部分会持续更新,在新一版的Windows NT操作系统会包括这些更新的信息.
I/O管理器为每一个成功打的文件流创建一个文件对象结构.为每个被启动的文件对象维护缓存相关状态信息:
.一个专用的文件对象缓存映像结构
.一个共享的文件对象缓存映像结构,表示全部打开文件中相同的文件流.
NT缓存管理器为每个刚打开的文件对象分配一个专用的缓存映像结构,这对每一个文件对象来说都是唯一的,因此多个专用缓存映像结构可以在一个打开的文件流中同时存在.另一方面,在一个文件流被启用并通过一些文件对象的时候,NT缓存管理器仅分配一个共享缓存映像.共享映像被打开这个文件流的例程使用.通过文件对象结构的SectionObjectPointer字段可以间接的存取这个映像.
来回忆下以前我们介绍过的,NT缓存管理器通过映像视图为文件流提供缓存服务.每个文件映像视图通过NT缓存管理器在一个叫做虚拟地址控制块(VACB)中描述.这个映像的粒度或者说每个文件流的映像视图大小是固定的,它们通过NT缓存管理器设置,虚拟地址控制块(VACB)也是同样的.这个固定的值规定了NT缓存管理器许可每个窗口最大的文件流.管理器也提供一个全局的VACB结构数组,分配VACB到指定文件流需要的地方.
共享缓存映像结构是文件流缓存信息中的主要部分,它由NT缓存管理器维护.
在同一个文件流中相关的所有VACB通过NT缓存管理器管理的共享缓存映像结构进行存取,每个VACB块中包括相关视图的虚拟地址及文件流的开始偏移地址.它帮助NT缓存管理器确定用户请求的范围是否在己经存在的视图映像中.如果不在视图映像里.NT缓存映像管理器创建一个新的视图并分配一个VACB来表示它.包涵文件流的VACB块列表我们使用一个指向共享缓存映像的VACB指针数组来存取.自从VACB结构在一个全局的VACB池中被分配了一个固定大小后,有可能发生这种情况,当一个文件流的视图被创建的时候NT缓存管理器没有足够的VACB空间.那么,NT缓存管理器就需要释放一个以前的视图映像,并把VACB从文件流VACB列表中移出,重新给这个新来的文件流分配VACB.甚至这个操作不是必须的,自从VACB被释放后文件件关闭操作也会完成,一个空闲的VACB无论在什么时候都是有用的.
像图7-1所示的那样,一个文件流缓存的全部私有缓存映像结构被链接到一起,这些通过共享缓存映像结构中的一个字段指出.
文件系统和网络重定向器之间的互相关系.
文件系统驱动和网络重定向器驱动之间的相互关系对NT缓存管理器非常重要;它们为每一个文件流启动需要缓存映射的全部文件对象.通过适当的缓存管理接口例程在系统缓存之间传输数据,虚拟内存管理器发出页面请求失败后(由缓存管理器引起),在缓存中的属于这个文件流的数据被刷新或者清除,最后,当这个文件流不存在访问的时候终止缓存.
为了执行上面这些操作,文件系统和网络重定向器提供的接口例程需要在NT缓存管理器上可用.几乎所有对文件系统驱动和网络重定向器驱动进行操作的接口例程,执行结果总会在对应的文件流缓存信息中体现出来.多个线程试图同时操作一个文件流上的数据时,任何一个文件系统通过使用NT缓存管理器提供的服务必须保证数据的同步操作.同步操作被定义描述为共有的数据无论何时被修改都是可维护性的.同时.当没有别的线程修改数据的时候,充许应用软件对共有数据的进行并发的读操作.正因为如此,在同一个文件流上进行多线程读操作.许多NT缓存管理器接口例程可以被同步的调用.
资源获取
大家都知道,文件控制块(FCB)这个结构在内存中为每一个文件流构造唯一的描述信息.在以前的章节中,我们看到每个FCB块被一个特别的结构结合到一起,这个结构就是FSRTL_COMMON_FCB_HEADER.这个结构是包涵两个重要的成员:
.主资源
.内存分页资源.
这两个成员都包涵一个指向ERESOURCE目标对象的指针.
为了在NT缓存管理器和虚拟内存管理器之间进行同步,所有对文件流的I/O操作,包括读写文件数据或者改变文件大小,都必须同步的使用这些资源.
(对一些第三方文件系统和网络驱动设备来说,它们可能添加同步原语到需要获取的文件流资源上.在NT环境下也不禁止这样类型的添加原语的存在,NT缓存管理器为两个ERESOURCE类型的对象分配空间的时候通过一些适当的方法获取和释放.例如,当文件流被修改的时候,一些文件系统需要在线程间互斥的获取一个第三方资源.在这种情况下,除去一些己定义的资源外,这个第三方资源会被获取)
在每一个多线程和多处理器环境里,同一时间多个线程或处理器访问共享设备,共享设备通过一个同步原语保护起来.使发生在这个共享设备上的一个操作,不会因为多个访问而产生不可预料的改变.
类型ERESOURCE的共享原语(我们在第三章,驱动开发结构中有描述)通过读写锁为多个访问者提供服务,其中同一时刻只有一个修改者.同步原语被独占性的获取,只允许一个线程存取共享设备的数据,另一方面,多个线程可以同时读取共享设备中的数据,这种情况下没有线程可以独占的获取同步原语并进行修改操作.
最后一点:我们的目的是确保数据的完整性和一致性.所有的线程访问共享对象数据都必须遵守资源获取规则.当单个线程潜在的使数据错误,其后每一个同步操作自动不遵守这个规则.因此,文件系统驱动的职责是.线程请求I/O缓存操作的时候要确保资源被正确的获取.
NT缓存管理器的每个输出接口例程,明确定义了如何获取文件流:
.文件流资源应该被独占性的获取.
.资源应该能被共享的获取.
.资源不能被获取(无主的资源).
.NT缓存管理器不受资源状态的影响.
尽管NT缓存管理器需要在两个与FCB相关联的资源之间同步的执行,他们没有一个被清除,具体的有什么规则控制这些资源,我们过去习惯于提供同步需求.例如,为一个文件流独占性的获取一个FCB块,由一个下面的操作组成:
.独占性的获取主资源.
.独占性的获取分页I/O资源.
.独占性的获取主资源和分页I/O资源.
在这种情况下,为避免死锁,必须在两个资源之间定义一个锁.特别指出一点.大部分的文件系统定义这个主资源的获取操作在分页I/O资源之前进行.
同样的,NT缓存管理模块为共享访问分配一个FCB块,就象分配一个或两个资源共享一样.每个文件系统和网络重定向器基于各种驱动的特殊需求,明确了这些资源的详细用法.
通常,一个分页I/O资源的获取只发生在分页读操作或者延迟写操作期间.例如,当一个页面请求错误发生的时候,文件系统驱动提供相关的读例程被启用.这个文件流的FCB块通过分页I/O资源被共享的获取.主资源,在另一方面,通常NT缓存管理器模块在用户线程环境响应请求(或者做为用户请求的说明返回).例如,用户线程环境开始响应一个写操作会和一个独占性的拥有主资源的文件同步.
注意:每个FSD都有一个独特的需求这个影响到什么时候怎么和FSD数据结构正确的同步获取资源.总之,不管用什么方法,当主资源主要用来在用户初始化请求之间同步的时候Windows NT环境通常用分页I/O资源来同步文件状态之间的改变(包括文件大小的改变).
一些时候,NT缓存管理器模块可以在执行文件流操作前获取这两个资源.例如,截取一个文件流操作刚好发生在主资源和分页I/O资源被独占性的获取后.这种情况用来预防任何有害的边效应的发生,自从文件大小改变后我们不需要特别的另外同步后台延迟写或预读活动.就象以前讲的那样,无论什么时候这两个资源需要被同时获取,一个定义明确的锁能使这两个资源被有序的获取.在这本书的余下部分,我们会有详细的定义使主资源在分页资源获取操作前面被得到.
在第三部分,控制文件流获取资源我们将进行详细的论述.
今天到这里.明天继续.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: