这一篇主要想记录下wince下的存储管理器(storage manager),wince的存储管理器用来管理系统的所有外围存储设备,所有的文件、数据和容量都是通过存储管理器来操作的,存储管理器的功能由系统中的fsdmgr.dll模块实现。由下面三部分组成:
⑴文件系统驱动程序管理器(File System Driver Manager,FSD Manager)。
⑵分区管理器(Partition Manager)。
⑶块设备驱动程序管理器(Block Driver Manager)
platform.reg中对于存储管理器的表述是:
[HKEY_LOCAL_MACHINE\System\StorageManager]
"Dll"="fsdmgr.dll"
"PNPUnloadDelay"=dword:100
"PNPWaitIODelay"=dword:300
"PNPThreadPrio256"=dword:64
fsdmgr.dll是存储管理器的表现形式,"PNPUnloadDelay"是指存储管理器在接收到即插即用设备的卸载通知后的延时时间,"PNPWaitIODelay"是指存储管理器等待IO的延时时间,"PNPThreadPrio256”这个值是与线程优先级有关的,具体不清楚。存储管理器(wince7.0)的具体设置在common.reg里面设置:
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles]
"AutoMount"=dword:1
"AutoPart"=dword:0
"AutoFormat"=dword:0
"MountFlags"=dword:0
"DefaultFileSystem"=""
"PartitionDriverName"="MSPART"
"Folder"="已装入的卷"
关于文件系统的挂载这里就不做过多介绍了,具体在转载的这篇文章里有详解,http://blog.youkuaiyun.com/gaoyang610/article/details/8927613
1.文件系统驱动程序管理器(File System Driver Manager,FSD Manager)。
文件系统驱动程序管理器:主要功能是设置系统加载的文件系统、以及这些文件系统使用什么样的文件过滤器。
文件系统过滤器:是一个导出文件系统入口的DLL,这些入口映射到标准的文件系统函数,比如CreateFile函数和CreateDriectory函数。文件系统过滤器用于处理对文件系统的调用,此后文件系统才能获得这些调用,也就是说存储管理器在调用文件系统API之前先调用文件系统过滤器的过滤函数,这样就允许对文件访问进行某些特殊的处理,因为文件系统过滤器拦截对文件系统的调用,所以可以对文件数据的加密、解密、压缩甚至扫描文件是否存在病毒等。
文件系统过滤器的注册表路径:
wince所有的注册文件在编译的最后阶段MAKEIMG都会打包生成一个reginit,ini的配置文件,所以所有的注册表选项都能在这个问价里面找到对应的设置。
HKEY_LOCAL_MACHINE\System\StorageManager\Filters\
这表示不过滤筛选任何文件,所有的文件都有效。我自己定制的wince7.0这一键值的设置是:
[HKEY_LOCAL_MACHINE\System\StorageManager\Filters\fsdspy]
"dll"="fsdspy.dll"
表明使用的是fsdspy的文件过滤器,这个过滤器的源码在%WINCEROOT\public\common\oak\fsd\fsdspy目录下,包括file.c、find.c、path.c等文件。我们可以修改这些代码,达到我们想要的筛选文件的目的。
详细介绍参考:http://blog.youkuaiyun.com/constantine/article/details/3299932
HKEY_LOCAL_MACHINE/System/StorageManager/ MyFileSystem /Filters
MyFileSystem是指具体的文件系统,如FATFS、EXFAT、CD/UDFS等文件系统,这个路径指文件系统过滤器对指定的文件系统有效。
我自己定制的wince7.0这一键值的设置是:
HKEY_LOCAL_MACHINE\System\StorageManager\FATFS,表示对于FATFS的文件系统不做任何过滤。
HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/ MyFileSystem /Filters
表示文件系统过滤器对自动加载的指定的文件系统有效,这里的自动加载是指由存储管理器来直接加载存储设备的驱动(block driver)。这一键值在我们的wince7.0系统中没有设置。
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MyProfileName\MyFileSystem\Filers]
MyProfileName是指Profile的名字,这个路径指文件系统过滤器对指定存储硬件的文件系统有效,我们项目的reginit.ini下相关内容如下:
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\Nand]
"FileSystem"="fatfsd.dll"
"PartitionDriver"="mspart.dll"
"AutoPart"=dword:0
"AutoFormat"=dword:0
"AutoMount"=dword:1
"MountHidden"=dword:1
"Folder"="NAND"
"Name"="NAND FLASH"
"DefaultFileSystem"="FATFS"
表明我们的项目在nand上使用的是FATFS文件系统,并且对于nand上的文件没有使用文件过滤器,所有文件有效。同时如果要读写nand上的数据,只有以FATFS文件系统格式才能访问,否则被文件过滤器过滤掉,这样就无法读写nand上的数据。
总结一下文件系统驱动程序管理器的功能,举个形象的例子,文件系统驱动程序管理器就像档案科,负责档案管理的工作人员就像文件系统过滤器,如果你要存入和调出某一份档案,就必须经过他,档案在档案科里可以按各种方式存放,比如可以按部门存放,可以按籍贯等,这就相当于文件系统。(这个例子貌似有些牵强)。
关于文件系统驱动管理器的源码都存放在:
%_WINCEROOT%/Public/Common/Oak/Drivers/FSD/EncFilt
%_WINCEROOT%/Public/Common/Oak/Drivers/FSD/FSDSpy
2 .文件系统驱动
文件系统驱动是实现对应的文件系统的DLL,文件驱动将存储设备上的数据组织为文件和文件夹来对设备进行操作。应用程序操作文件是通过wince 文件系统提供的接口进行操作,如:可以通过CreateFile函数,打开或创建一个文件。接下来,系统是如何去完成这个任务的呢?比如我们要操作SD卡上的文件,SD卡上也有自己的文件系统,用于组织和管理文件,wince文件系统是如果操作这些文件的呢?这时候,FSD(文件系统驱动)就发挥它的作用了。文件的操作共涉及到六个层次:
⑴应用程序:用户通过应用程序操作文件。
⑵wince文件系统:操作系统的一部分,根据用户的请求,判断操作的是那个设备上的文件,以便调用相应的驱动。
⑶文件系统驱动:操作系统没办法直接和设备驱动进行交互,需要通过文件系统驱动,实现与设备驱动的操作,以实现文件操作。
⑷分区驱动:主要实现对存储设备的逻辑划分。
⑸设备驱动:实现了设备上的操作,包括文件操作等。
⑹设备上的文件系统:组织和管理设备上的文件存储。
从以上的分析可以知道,文件系统在操作系统和设备驱动之间起到了一个连接作用。在实现的时候,文件系统驱动基于设备驱动,实现了wince文件系统中的文件操作函数,如CreateFile等。
3.分区管理器(Partition Manager)
分区管理器是对存储设备的逻辑划分,WINCE6.0及以上版本允许物理磁盘(我们常用的是nandflash)包含多个分区,并且每个分区可以格式化为不同的文件系统,但是每个设备只能由一个分区驱动程序来管理。
我们项目里原厂提供的烧录工具有flash分区功能,可以直接通过这个工具划分并格式化flash。
4.块设备驱动程序管理器(Block Driver Manager)
块设备驱动程序是用于和存储设备直接打交道,可以读写存储设备,块设备驱动程序也称为“存储驱动程序”(linux称为块设备驱动程序),因为它们提供对数据存储的随即寻址块的访问。对于存储设备为nand flash的系统,其存储驱动就是nandflash驱动。
http://blog.youkuaiyun.com/LoongEmbedded/archive/2010/11/26/6036448.aspx
先记录这么多,以后再修改补充。