EWF 全称 Enhanced Write Filter (增强型写入过滤)
所有热衷于XPE开发的人都知道,基于Compact Flash Cards(CF)EWF开发是一个热点问题。我整理了一些关于这方面的相关问题,让我们把这个问题划分为两大方面:如何设置EWF和如何使EWF工作在CF卡上。
首先我们来了解一下,什么是Enhanced Write Filter
如果你非常熟悉Windows NT Embedded 4.0下的Write Filter功能,那么你需要完全放掉对这个功能的理解,虽然从功能和命名上看Enhanced Write Filter Write Filter 很相似,但是如果你用相同的思维方式理解Enhanced Write FilterWindows NT Embedded 4.0下的Write Filter功能,你会感到很困惑。
要正确地理解EWF,我需要先介绍一下覆盖层的概念。一个覆盖层理论上是置于被保护卷的上方,所有对保护卷的读写操作都要先经过覆盖层。开启过滤功能后,被保护卷将不能被写入,但是可以读取信息。如果目标信息不在覆盖层上,那么覆盖层可以通过读保护卷的操作,但是将会过滤写入的操作,所有的针对保护卷的写入操作都将记录在覆盖层上。写入数据流程如下图所示:
读取数据流程如下图所示:
因此,覆盖层究竟在哪里呢?在Windows NT Embedded 4.0中,Write Filter隐藏在所有的可用内存中,如果它需要,它会消耗掉很多的内存空间。当内存空间耗尽,出现内存溢出的情况,系统将停止运行(俗称死机)。而EWF则允许它的覆盖层开辟在内存或者磁盘的第二个分区(扩展分区或者自由分区)。这个区别在小的磁盘空间上有明显的作用,覆盖层可以存在于内存上。
基于RAM(内存模式)创建的EWF覆盖层是临时的,它的创建是在每次机器启动的时候,同样,在每次机器重新启动的时候它也会自动消亡,覆盖层上操作也会全部丢失。基于RAM的覆盖层的访问速度是非常快的,这取决于内存和硬盘的读写速度原因。然而,基于RAM的覆盖层的尺寸是受限于内存中的未使用页面的尺寸,这点区别于基于DISK模式。当对保护卷的读写操作非常频繁的时候,内存也会因为覆盖层的不断膨胀而消耗殆尽。
基于DISK(磁盘模式)创建的EWF覆盖层位于物理磁盘的空间上,所以静态信息可以被保存在覆盖层上,即使断电也不会丢失。写入的信息可以从覆盖层提交到被保护卷。DISK模式建立的覆盖层读写速度要比RAM模式建立的覆盖层慢。覆盖层尺寸的设置应该等于被保护分区尺寸的大小,该设置在构建XPE工程的过程中完成(目标设计器Enhanced Write Filter组件的Setting中)。
这两种类型的覆盖层有着一些共性,它们在开启状态下都不允许把信息直接写入到被保护磁盘内。无论EWF的开启或者关闭状态,都允许将更新后的信息提交到被保护分区。你还可以设置多个覆盖层对应每一个分区卷标,同时每一个覆盖层都可以在运行时独立控制。
为什么要使用EWF呢?
如果你想从El Torito CD-ROM引导操作系统的话,你没有选择-你必须用它来提供系统的正常运行(一个正常的Windows操作系统在启动的时候需要简单的写入注册码)。你也可以使用该功能来保证你的引导分区避免不必要的写入,增强系统的健壮性,或者保护你的引导分区避免异常断电带来的损耗!
接下来我们将探讨以下内容,CF卡设备是如何在EWF功能中获得保护的?CF卡具有以下特性-由于频繁的读写操作会使之性能快速降低和坏块急剧增加,使用EWF将过滤所有向Flash存储介质的写操作,以延长CF卡的使用寿命。
如何配置Enhanced Write Filter
如果要使用EWF,你需要添加"Enhanced Write Filter" 组件到你的工程配置中去,并且确认在添加该组件后你重新进行了依赖性检查 - 该组件需要EWFLDR组件支持,EWFLDR相当于NTLDR。一旦你添加了Enhanced Write Filter组件,就需要点击该组件下的Settings对他进行设置。如下图所示:
 
在Settings的设置项中,顶部一半的设置实际上是在设置覆盖层的相关信息,这些包括被保护卷的数量,覆盖层的级别和EWF分区的尺寸。
在Settings的设置项中,底部一半的设置实际上是显示每一个被保护分区的详细信息。你可以在指定的分区上开启或者关闭EWF功能,并且开启缓存写入模式(Enable Lazy Write,EWF缓冲存到磁盘中的一种优化的方式,指定是否受保护卷映射数据写入缓存,以提高性能)。磁盘号、分区号和磁盘类型是非常重要的 - 因为我们需要通过这些设定来确认哪一个磁盘分区将被保护。你也可以指定被保护分区的覆盖层是基于RAM模式的还是DISK模式的。你也可以在Optimization Option中指定EWF的优化方式(各项具体设置请参看XP Embedded开发指南)。
如何在CF卡上实现EWF?
很多人都有这样的问题:他们开发的XPE部署在硬盘上,就能运行的非常完美,但是当他们把相同的XPE重新部署到Flash设备后,EWF功能就不能正常地启用。这是什么原因导致的呢?
除了EI Torito volumes以外,无论覆盖层使用RAM模式或者DISK模式,EWF会希望找到某种基于固定磁盘的分区来储存信息。在基于RAM的覆盖层中,这个EWF分区可以最小到32KB,但是这个分区必须存在。这个EWF分区用于存储开启,关闭或者其他需要重启以后才能生效的命令。在一个操作系统中,只能有一个EWF分区存在。如果在FBA(First Boot Agent )的过程中EWF找到一个已存在的EWF分区,那么它将删除这个EWF分区并且创建一个新的分区。这个EWF卷是一种0x45类型的分区,它是正常运行EWF的必要条件。你应该在引导盘上留出足够的磁盘空间以适应EWF分区的要求。
通过以上段落的介绍我们要记住,虽然你可能有足够的磁盘空间用于EWF分区的分配,但是你可能没有自由分区用于创建EWF分区。我们必须有一部份未分区空间或者自由空间在扩展分区上,以用于EWF分区的创建。而对于可移动磁盘类型的CF卡来说,在NT系统下是不能够划分出自由分区或者扩展分区的。
第二点我们要记住的是,EWF只保护固定磁盘。你不能够在可以动磁盘上启用EWF功能,虽然有些CF卡是固定磁盘,但是大多数CF卡是被标识为可移动磁盘的。EWF不能控制可以动设备产生的添加和删除事件,不能够成功创建EWF分区,不能保护目标分区。如果系统认为你的CF卡是可以动设备,那么EWF也同样会认为你的CF卡是可移动设备,同时不能正确地加载EWF。这是一个硬件设备问题,我们不能够回避。如果你发现EWF不能够被正常加载,请检查你的CF卡设备是没有被标识为可移动设备的。
经过上述的推论可得,你的CF卡设备已经被配置为一个正常的IDE设备而并非可移动磁盘。所有的可移动设备都不能使EWF正常的工作。
当然,现在针对可移动设备的CF卡已经有了完善的EWF解决方案。我们知道了EWF不能够在CF卡上创建的原因是因为CF卡没有可用的自由空间或者扩展分区来创建必须的EWF分区,那么我们可以将需要储存在EWF分区上的信息储存在注册表中,即EWF的RAM-REG模式,从而使该问题得到圆满的解决。
具体的实现方式请参看:CF卡上实现基于RAM的EWF模式