`
wodamazi
  • 浏览: 1420184 次
文章分类
社区版块
存档分类
最新评论

Windows 文件系统(1)

 
阅读更多

在现代操作系统中,文件系统为存储设备提供了流方式的数据管理,允许应用程序共享卷的存储空间,同时又可以独享不同的数据流。在Windows中,文件系统提供了一个层次状的名字空间,并集成了系统的全局名字空间中;文件对象既是设备对象的已打开实例的抽象,也代表了文件系统中一个已打开的数据流实例。Windows 的文件系统以卷设备对象为存储基础,不同种类的文件系统定义了不同的存储格式。文件系统格式的描述能力也决定了它的数据管理能力,比如文件的访问权限管理、是否压缩、单个文件的最大尺寸,等等。文件系统在windows的存储管理结构中只是一个环节,其驱动程序位于存储栈的上部,它们通常依赖于缓存管理器来实现文件数据的缓存。

Windows支持的原生文件系统式NTFS (NT File System), 其驱动程序为ntfs.sys;另一种常用的文件系统是FAT(FileAllocation Table), 这是从DOS时代遗留下来的,它的格式相对比较简单,目前仍被广泛用于移动介质,以方便数据交换,除了NTFS和FAT文件系统,Microsoft还为windows提供了其他一些文件系统驱动程序,包括CDFS和UDFS。CDFS即CD-ROM文件系统,这是一种只读文件系统,其驱动程序为cdfs.sys;UDFS即UDF文件系统,主要针对DVD-ROM, 它比CDFS更灵活,其驱动程序为udfs.sys。

在Windows的全局名字空间中,文件系统驱动程序对象被指定存放在“\Filesystem”目录下,例如,“\FileSystem\ntfs”和“\FileSystem\cdfs”等。当windows加载这些驱动程序时,如果看到在驱动程序的注册表键(HKLM\SYSTEM\CurrentControlSet\Service\<DriverName>)中,type值为2(宏SERVICE_FILE_SYSTEM_DRIVER)或8(宏SERVICE_RECOGNIZER_DRIVER),那么,IopGetDriverNameFromKeyNode函数将返回以“\FileSystem”为前缀的名称,否则返回以“\Driver”为前缀的名称。IopLoadDriver函数调用lopGetDriverNameFromKeyNode函数来决定驱动程序对象的名称。

(注:lopLoadDriver与lopGetDriverNameFromKeyNode都是NTDLL中未公开的函数)。

Windows DDK提供了CDFS和FAT文件系统的源代码,读者可以编译这两个驱动程序,然后替换原文件,利用这种方法可以跟踪和观察windows文件系统的运行。

从驱动程序的结构来看,文件系统驱动程序除了提供标准的分发例程,更倾向于提供快速I/O入口,因为经过快速I/O入口可避免“构造IRP”的开销。其次,文件系统驱动程序通常使用缓存管理器来提供文件一级的缓存能力,虽然这不是必需的,但是缓存管理器本质上为文件系统提供了一套公共的缓存机制。只要文件系统驱动程序恰当地使用缓存管理器的缓存功能,就可以以相对较小的代价获得性能、内存使用效率等方面的优势。文件系统驱动程序除了为每个打开的文件使用缓存管理器的缓存能力,还可以利用缓存管理器的CcMapData, CcPinRead, CcPreparePinWrite等接口函数,将卷上的元数据映射或锁定到系统地址空间,然后方便地操作这些数据。下图显示了一个文件系统驱动程序的结构,以及它与I/O管理器和缓存管理器之间的紧密关系。

为了有效地管理一个卷,文件系统驱动程序通常使用一些内部数据结构来维护卷,目录和文件的状态。一个最基本的数据结构师VCB ( Volume Control Block), VCB通常包含了一个文件系统实例所对应的卷设备对象。

在文件系统中,通常有两种类型的对象:目录(directory)和文件(file)。文件代表了一个数据流,应用程序可以从文件中读写数据。目录是文件系统中用于将多个文件有效组织起来的容器对象,其本身并不包含用户数据流。目录和文件既有卷上的数据结构表示,称为磁盘上的表示(on-disk representation),也可能在内存中的表示(in-memory representation)。在磁盘上,最基本的管理数据单元是扇区,支持Intel x86系统的磁盘的扇区大小通常为512字节,而文件系统可以以更大的粒度来管理磁盘上的数据,此粒度称为簇(cluster),是扇区的整数倍的大小。因此,从文件系统的管理角度,一个文件是由一组簇构成的,这些簇形成了文件数据流的存储空间,目录也包含了一个或多个簇,这些簇中的数据描述了该目录中的文件,包括了他们的文件属性和所属的簇的位置信息。不同的文件系统可以定义不同的磁盘结构。对于再系统运行过程中被引用的文件或目录,文件系统驱动程序必须使用恰当的内存数据结构来描述他们。分别称为FCB(File Control Block)和DCB(Directroy Control Block)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics