Mounting a Volume

Mounting a Volume

卷的加载过程典型地由一个打开逻辑卷(即为一个分区或者动态卷)上的文件的请求触发。此过程如下所示:

1. 

一个用户模式应用程序调用CreateFile 打开(创建)一个文件。或者一个内核模式驱动程序调用ZwCreateFile orIoCreateFileSpecifyDeviceObjectHint.

2. 

I/O Manager确定哪个逻辑卷是请求的目标并检查它的设备对象,看它是否已经加载。如果VPB_MOUNTED标志已经设置,那么这个卷已经被文件系统加载。

3. 

如果自系统启动以来卷尚未被文件系统加载(that is, the VPB_MOUNTED flag is not set)I/O Manager发送一个卷加载请求(IRP_MJ_FILE_SYSTEM_CONTROL, IRP_MN_MOUNT_VOLUME)到每一个可能声明该卷的文件系统中(to each file system that might claim the volume)。

4. 

并非所有内置的文件系统都是需要被加载的,甚至在系统启动后加载后更佳。(What Happens to File Systems During System Boot.)因为内置的文件系统尚未加载,I/O Manager发送卷加载请求到文件系统识别器 (FsRec),它(FsRec))检查代表这些文件系统的卷启动扇区( volume boot sector )

5. 

如果FsRec 确定了卷的格式属于一个尚未加载的文件系统,I/O Manager发送一个加载文件系统的请求(IRP_MJ_FILE_SYSTEM_CONTROL, IRP_MN_LOAD_FILE_SYSTEM) FsRecI/O Manager然后发送原始的卷加载请求到文件系统。

6. 

每一个收到加载卷请求的文件系统检查卷的启动扇区(boot sector)以确定卷的格式和其他(标示卷是否被某种特定的文件系统格式化的)信息,如果格式匹配,那么文件系统加载这个卷。

7. 

以下两节讨论文件系统如何在识别卷后加载卷:

How the Volume Is Mounted

How the Volume Is Mounted

卷如何被加载取决于文件系统和是否它已经加载了这个卷。

当一个文件系统收到为一个新的卷加载请求后,它为这个卷创建一个卷设备对象 (VDO) VDO由一个DEVICE_OBJECT 加上一个可选的文件系统定义的(file-system-defined)设备拓展组成。新创建的VDO为新卷或者重加载的卷组成文件系统卷栈的栈底(the newly created VDO forms the base of the file system volume stack for the new (or remounted) volume.)。

The file system mounts the volume by associating the VDO with the volume parameter block (VPB) for the corresponding storage device object and sets the VPB_MOUNTED flag on the VPB.文件系统通过将VDO与对应储存设备对象的卷参数块(VPB)关联到一起,并设置VPB上的VPB_MOUNTED加载这个卷。 

在卷被文件系统加载后,文件系统过滤器驱动程序可以附加到这个新文件系统卷栈之上。任何发送给这个文件系统的I/O请求将首先被自动发送到在卷栈之上的文件系统过滤器设备对象。然而,当I/O Manager发送一个快速IO分离请求(a fast I/O detach request)以通知在卷栈上的驱动程序该卷将被移除时,文件系统过滤器仅应当从卷上分离。

Note   卷的储存设备对象处于储存设备栈中,但是它并不需要在栈的最顶端。更甚者,在一个卷装载后,储存器过滤驱动程序能依旧附加在(储存设备栈)栈顶上。对于驱动编写者而言必须始终记得,当一个文件系统从一个VDO发送IRP到储存设备栈时,它发送给卷对应的储存设备对象,而不是栈顶的设备对象。(然而当 I/O Manager 直接发送一个IRP到储存栈,通过文件系统IRP将被发送给栈顶的设备对象。)

 

Volume Mount Example

Volume Mount Example

以下图表显示了在CDFS加载任何卷之前看起来可能像是什么样的,在这个例子中,两个过滤器已经附加他们到CDFS控制设备对象。(注:包含CDFS控制设备对象的全局文件系统队列没有显示)


接下来的图显示了一个CD-ROM储存设备典型的驱动栈,尚未加载任何CDFS卷:


The following figure shows what the file system driver stack, volume stack, and CD-ROM storage device stack look like after the CDFS file system has mounted a volume on a CD-ROM device.接下来的图表显示了(在CDFS文件系统已经在CD-ROM设备上加载了一个卷后)文件系统驱动程序栈,卷栈和CD-ROM储存设备栈的情况。


关于上图的一些注意点:

· 

File system control device objects are required to be named. This distinguishes them from file system volume device objects, which are never named.CDFS控制设备对象格式化一个文件系统驱动栈的栈底。这个栈并非在一个存储设备上加载,可以直接接受一个IRP,并且同样可以含有文件系统过滤器设备对象。过滤器附加到文件系统控制设备对象上监视(IRP_MJ_FILE_SYSTEM_CONTROL, IRP_MN_MOUNT_VOLUME) 请求。文件系统控制设备要求被命名。它们同文件系统卷设备对象的区别在于后者从未命名。

· 

如图表所示,尽管在CDFS卷加载之后附加第二个存储过滤器到CD-ROM储存设备栈顶是可以的,但过滤器不会接收任何从文件系统栈发往存储设备栈的IRP。然而它可以接收任何字节发往储存设备栈的IRP

· 

一个要点是,在文件系统加载卷之后,储存设备栈依旧可以直接接收IRP。特别地,电源控制IRP总是直接发送给储存设备栈,从未发送给文件系统栈。(因此,例如,文件系统过滤驱动程序不应在它们的DriverEntry 例程中为IRP_MJ_POWER注册一个派遣例程)。

· 

然而,pnp irp (IRP_MJ_PNP)可以被发送到任一个栈中,在文件系统卷上链接的过滤驱动程序应当总是默认地将这些IRP传递下去给下一层驱动程序,以便于文件系统卷设备可以往下传递IRP给储存设备栈。

· 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值