【翻译WINDOWS NT FILE SYSTEM INTERNAL】NT缓存管理器一(6)

缓存读操作

       考虑由一个用户应用程序发起的读操作。这个读操作通过NT I/O管理器被传递到文件系统。图6-3指示,满足读请求(使用缓存管理器提供的拷贝接口)的操作顺序。

       下面的列表给出了对于这个图中每个步骤的解释。注意图中的箭头表示了控制流。

1.     应用程序执行一个读操作,这个操作导致系统控制传递给内核中的I/O管理器。

2.      I/O管理器通过IRP把读请求导向到适当的文件系统驱动。用户缓冲区可能被映射进系统虚拟地址空间,或者I/O管理器分配一个内存描述符(MDL)来表示缓冲区,并锁定与这个MDL有关的页内存,再或者I/O管理器不做修改直接传递缓冲区的虚拟地址空间。第三部分中,你将看到文件系统驱动控制 那些I/O管理器执行的操作。

3.      文件系统驱动接受将读操作导向到被缓冲打开的文件的读请求和通知。如果文件缓存尚不存在,文件系统驱动调用缓存管理器来初始化文件缓存。依次,缓存管理器请求虚拟内存管理器为将要被缓存的文件创建文件映射(段对象)。

4.      文件系统驱动使用CcCopyRead()缓存管理调用将读请求传递到NT缓存管理器。缓存管理器负责执行所有必要的步骤,将数据转移到用户缓冲区。

5.      缓存管理器测试数据结构来决定那里是否有包含用户请求字节范围的映射视图。如果没有存在的映射视图,缓存管理器会创建一个。

6.      缓存管理器简单的执行内存拷贝操作,从被映射试图到用户缓冲区。

7.      如果文件映射视图不被包含所需数据的物理页支持,一个页错误将发生,然后控制被传递给虚拟内存管理器。

8.      虚拟内存管理器分配用来存储被请求数据的物理页,页错误发生,然后通过NT I/O管理器发出一个非缓存IO(noncachedpaging I/O)读操作到文件系统驱动。注意,尽管上图没有指出分页I/O请求经过I/O管理器,但这是很确定的。

9.      上面所述收到非缓存读请求时,文件系统驱动创建一个对应的I/O请求来从二级存储设备获取数据,并发送这个I/O请求到底层驱动。

10.  文件系统驱动下面的设备驱动从二级存储设备(或者通过网络)获取数据,并完成请求。

11.  文件系统驱动完成来自NT虚拟内存管理器测的分页I/O请求。

12.  导致页错误的指令重新执行。

13.  缓存管理器完成从文件映射视图到用户缓冲区的拷贝操作。这时候,拷贝将完成,除非招致一个页错误,(尽管理论上说,在一个刚刚出想过页错误的页上重复发生一个页错误是可能的,但是实际上这不会发生)。

14.  缓存数据被拷贝到用户缓冲区中之后,缓存管理器返回控制给文件系统驱动。注意,这些数据将仅仅在预留给缓存管理器的虚拟地址空间中被缓存下来(无论如何,这些数据可能在任意时刻,被NT缓存管理器从系统内存中丢弃)。

15.  文件系统驱动完成I/O管理器发送来的原始IRP。

16.  I/O管理器完成原始的用户读请求。



缓存写操作


       现在,考虑一个有用户程序发起的写操作。图6-4描述了执行满足写操作的步骤顺序(使用缓存管理器提供的拷贝接口)。如你将要看见的一样,这些操作步骤与前面描述的读操作的步骤很相似。对于每一个步骤的解释被罗列在下面:

1.      一个用户应用程序执行写操作,导致控制被转移给内核中的I/O管理器。

2.      I/O管理器通过使用一个IRP将这个写操作导向到合适的文件系统驱动。像在读操作中一样,缓冲区可能被映射进系统虚拟地址空间,或者一个MDL被创建,再或者缓冲区的虚拟地址不作任何改变直接传递给文件系统驱动。

3.      文件系统驱动注意到写操作是导向到一个以缓存访问方式打开的文件。想读操作例子中描述的那样,如果这个文件的缓存尚没有被初始化,文件系统驱动将调用缓存管理器来初始化这个文件的缓存。虚拟内存管理器位要被缓存的文件创建一个文件映射(段对象)。

4.      文件系统驱动通过CcCopyWrite()缓存管理器调用简单的下发写请求到NT缓存管理器,CcCopyWrite()是缓存管理器提供的可用的拷贝接口中的一个。

5.      缓存管理器测试数据结构,决定是否存在包含被用户修改字节范围的文件映射视图,如果没有找到已存在的映射视图,缓存管理器会创建一个文件映射视图。

6.      缓存管理器执行从(用户缓冲区)到(与文件映射视图相关的虚拟地址范围)的内存拷贝操作。

7.      如果虚拟地址范围不被物理内存页支持,一个页错误将发生,而后控制转移到虚拟内存管理器。

8.      虚拟内存管理器分配物理内存页,这些页用来存储被请求数据(发生页错误)。图6-4中,假定所有页正在被用户写满。在一个场景中,既不是缓存管理器也不是虚拟内存管理器(在数据修改之前)把已经存在的数据从磁盘读出来。无论如何,如果部分页正在被修改,在页被允许修改之前,页错误将导致虚拟内存管理器发起分页I/O读操作。这个导致页错误的指令被重新执行。

9.      缓存管理器完成从用户缓冲区到与文件映射视图相关的虚拟地址范围的拷贝操作。

10.  缓存管理器将控制权返回给文件系统驱动。注意,用户数据现在归于系统内存,并且不会立即写回到二级存储介质。真正的到二级存储设备的数据转移,将被缓存管理器延迟执行。

11.  缓存管理器完成请求。

12.  文件系统驱动完成NT I/O管理器发来的原始IRP。

13.  I/O管理器完成早先的用户写请求。   


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页