WindowsCEnet的存储管理文档格式.docx

上传人:b****7 文档编号:21828901 上传时间:2023-02-01 格式:DOCX 页数:49 大小:284.02KB
下载 相关 举报
WindowsCEnet的存储管理文档格式.docx_第1页
第1页 / 共49页
WindowsCEnet的存储管理文档格式.docx_第2页
第2页 / 共49页
WindowsCEnet的存储管理文档格式.docx_第3页
第3页 / 共49页
WindowsCEnet的存储管理文档格式.docx_第4页
第4页 / 共49页
WindowsCEnet的存储管理文档格式.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

WindowsCEnet的存储管理文档格式.docx

《WindowsCEnet的存储管理文档格式.docx》由会员分享,可在线阅读,更多相关《WindowsCEnet的存储管理文档格式.docx(49页珍藏版)》请在冰豆网上搜索。

WindowsCEnet的存储管理文档格式.docx

如前所述,对象空间的数据分为三部分-文件系统、系统注册信息及数据库。

然而,文件系统、数据库以及注册信息都不一定要储存在对象空间中,它们也可以被存放ROM或是外围储存装置中。

数据的建立和使用,与实际的储存装置无关,只是依赖于储存的类型。

操作系统负责管理内存堆,在必要的时候会对档案进行压缩和解压缩。

对象空间使用基于事务的数据管理机制。

如果当数据写入对象空间时,发生了电源中断的情况,CE.NET会透过各种手段保证对象空间不被破坏,例如在系统重启后继续完成该写操作,或是恢复到电源中断前的状态。

在早期的WindowsCE版本中,RAM文件系统和档案大小最大皆只能达16MB。

到了WindowsCE3.0这个版本,RAM文件系统最大可达256MB,而档案大小最大也能达32MB。

另外,对象空间中的对象数目也由原本的65,536增加到4,000,000左右。

最新的CE.NET允许档案最大可达4GB。

CE.NET为对象空间中的每个对象,都分配了一个唯一的对象标识符(WindowsCEobjectidentifier,简称CEOID)。

对象标识符的作用就是用于存取对象空间中的对象。

在对象空间中,以下列出的各项都可以被定义为一个对象:

∙注册信息中的一个键

∙注册信息中的一个值

∙一个档案

∙档案数据中大小为4KB的一部分(意即一个12KB的档案本身会对应一个档案对象,另外其所含的三个4KB的数据块也分别对应着一个对象)

∙数据库中的一项记录(最多可达4KB数据)

∙数据库中一项记录的扩展信息(也可达4KB数据)

∙一个数据库

∙数据库的一个volume(adatabasevolume)

需要说明的一点是,CE.NET仅仅保证对象标识符在同一个volume中是唯一的,当有多个volume,可能在不同volume中发现相同对象标识符的对象。

因此,CE.NET为每个数据库volume(databasevolume)都分配了一个唯一的数据库标识符(CEGUID)。

数据库标识符和对象标识符的结合,就可以表示数据库volume中的某个对象了。

要对对象空间中的对象进行存取,第一步就是获得该对象的对象标识符。

根据不同的对象类型,CE.NET提供了相对应的函式以获得该对象的对象标识符,参考表5.1。

表5.1获得对象标识符函式

对象类型

获得对象标识符的方法

目录或档案

FindFirstFile和FindNextFile函式回传的WIN32_FIND_DATA结构的dwOID字段。

GetFileInformationByHandle函式回传的BY_HANDLE_FILE_INFORMATION结构的dwOID字段。

数据库

CeCreateDatabaseEx2或CeFindNextDatabaseEx函式的回传值

数据库记录

CeSeekDatabaseEx、CeReadRecordPropsEx以及CeWriteRecordProps函式的回传值。

已加载的数据库volume

CeMountDBVol和CeEnumDBVolumes函式可以回传已挂载数据库volume中的数据库标识符。

有了对象标识符,就可以使用CeOidGetInfoEx函式得到该对象内的数据。

CeOidGetInfoEx函式会回传一个CEOIDINFO结构(结构原型列于程序代码5.1)。

CEOIDINFO结构有一个wObjType字段说明了对象的类型。

假如该字段的值为OBJTYPE_DATABASE,就指这是一个数据库对象。

由wObjType可得知该对象是档案、目录、数据库还是数据库记录,同时也得知该对象的数据地址。

例如,如果对一个数据库对象使用CeOidGetInfoEx的话,那么回传的类型值为OBJTYPE_DATABASE,而与之相关的数据库名称、类型标识符、记录的数目、数据库的大小以及排序方式等信息,都将保存在一个CEDBASEINFO结构中。

程序代码5.1CEOIDINFO数据结构

typedefstruct_CEOIDINFO{

WORDwObjType;

//Typeofobject

//OBJTYPE_INVALID|Therewasnovalidobject

//withthisCEOID

//OBJTYPE_FILE|Theobjectisafile

//OBJTYPE_DIRECTORY|Theobjectisadirectory

//OBJTYPE_DATABASE|Theobjectisadatabase

//OBJTYPE_RECORD|Theobjectisarecordinside

//adatabase

WORDwPad;

//dwordalignment

union{//Thisisaunion

CEFILEINFOinfFile;

//Validforfileobjects

CEDIRINFOinfDirectory;

//Validfordirectoryobjects

//@CESYSGENIFFILESYS_FSDBASE

CEDBASEINFOinfDatabase;

//Validfordatabaseobjects

CERECORDINFOinfRecord;

//Validforrecordobjects

//@CESYSGENENDIF

};

}CEOIDINFO,PCEOIDINFO;

5.1.3储存管理程序

储存管理程序(StorageManager)负责管理外围储存装置所使用的文件系统和成组设备驱动程序(BlockDeviceDriver)。

储存管理程序的功能实作位在fsdmgr.dll模块,它由三部分组成,包括成组设备管理程序(BlockDriverManager)、分割区管理程序(PartitionManager)以及文件系统管理程序(FileSystemDriverManager,或简称FSDManager)。

所有对档案和volume的处理,都是经由储存管理程序完成的,储存管理程序在永久性储存介质的存取过程中,扮演了很重要的角色。

图5.1储存管理程序结构图

CE.NET的储存管理程序是一个分层结构,其结构如图5.1所示,因此做DiskI/O必需经过储存管理程序的各个阶层。

首先是过滤器层(FileSystemFilter),在将I/O请求交由文件系统驱动程序处理之前,在过滤器这一层可以完成一些加密、压缩和病毒扫描等性质的额外工作。

接下来是文件系统驱动程序(FileSystemDriver),在这里对参数进行格式化,将文件名转换为成组设备驱动程序可以识别的物理地址。

在这之后,就可以经分割区管理程序,或直接交由成组设备驱动程序,完成实体的I/O操作了。

在储存管理程序的启动过程中,有很多信息是从系统的注册信息中得到的。

例如,下面的注册信息会告知系统加载储存管理程序模块:

[HKEY_LOCAL_MACHINE\System\StorageManager]

"

Dll"

="

fsdmgr.dll"

另外,每当系统检测到新的外围储存装置时,装置管理程序会自动加载支持该装置的成组设备驱动程序,之后向储存管理程序报告,该装置的配置信息在注册信息中的位置。

储存管理程序就是根据这些信息,决定如何加载适当的分割区驱动程序(partitiondriver)和文件系统驱动程序。

下面是所有装置都可使用的默认配置信息:

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles]

"

AutoMount"

=dword:

1

AutoPart"

AutoFormat"

MountFlags"

DefaultFileSystem"

FATFS"

PartitionDriver"

mspart.dll"

Folder"

MountedVolume"

其中AutoFormat表明是否对该装置进行自动格式化,AutoPart表明是否用该装置上的最大可用空间自动建立分割区,AutoMount表明是否自动挂载每个检测到的分割区,而MountFlags则指出了应如何对分割区进行挂载。

如果装置管理程序向储存管理程序,指定新装置的配置信息所在的位置,那么储存管理程序会使用该装置的指定配置信息。

例如,硬盘的配置信息可能如下:

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]

Name"

IDEHardDiskDrive"

HardDisk"

对于未提供一些配置信息,比如AutoFormat、AutoPart和AutoMount,则要使用系统提供的默认值。

当系统发现新的外围储存装置时,储存管理程序为其加载分割区驱动程序和文件系统驱动程序的程序如下:

1.装置管理程序负责加载成组设备的驱动程序,

2.由该装置发出一个通知,告知储存管理程序该装置的装置名称及其GUID,

3.储存管理程序根据注册信息中的配置信息,为该装置加载分割区驱动程序,

4.储存管理程序行举该装置上的所有分割区,

5.储存管理程序为每个分割区,加载文件系统驱动程序。

5.1.3.1文件系统过滤器

文件系统过滤器和文件系统驱动程序类似,它们都有一组输出函式被CreateFile和CreateDirectory这类的标准文件系统API映射到。

二者不同之处在于,文件系统过滤器要提供HookVolume和UnhookVolume这两个函式,而文件系统驱动程序必须提供的是MountDisk和UnmountDisk这两个函式。

文件系统驱动程序和文件系统过滤器的加载,都是透过文件系统管理程序完成的。

有关文件系统过滤器的信息,也是保存在注册信息中。

文件系统管理程序需要到以下各处搜寻应加载的文件系统过滤器:

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FileSystem

\Filters]

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\ProfileName

\FileSystem\Filters]

[HKEY_LOCAL_MACHINE\System\StorageManager\FileSystem\Filters]

[HKEY_LOCAL_MACHINE\System\StorageManager\Filters]

此处,FileSystem代表文件系统在注册信息中所使用的名称,例如FATFS、UDFS等等。

如果在

中出现了一个过滤器的话,那么所有使用该配置信息的文件系统,都将使用该过滤器。

[HKEY_LOCAL_MACHINE\System\StorageManager\FileSystem\Filters]

中出现了一个过滤器的话,那么名为FileSystem的文件系统将使用该过滤器。

如果一个过滤器出现在

[HKEY_LOCAL_MACHINE\System\StorageManager\Filters]

中,那么所有的文件系统都将使用该过滤器。

下面是一个注册信息中有关过滤器信息的例子:

[HKEY_LOCAL_MACHINE\System\StorageManager\...\Filters\FilterName]

dll"

filter.dll"

Order"

x

其中dll的值,是该过滤器所对应的动态链接库,Order的值,则是建造过滤器堆栈时各过滤器之间的顺序。

5.1.3.2文件系统管理程序与文件系统驱动程序

首先来看一下文件系统驱动程序(FileSystemDriver-FSD)。

文件系统驱动程序只适用于成组设备。

我们知道,任何装置加载系统后,都需要对应的设备驱动器的配合才能得以工作,对于成组设备而言,自然也少不了成组设备驱动程序。

但是与其他装置不同的是,成组设备除了需要直接和硬件沟通的成组设备驱动程序之外,还需要一个文件系统驱动程序,这是因为,虽然成组设备驱动程序已经向上层提供了各种函式接口,透过这些接口就可以对成组设备进行初始化、读写数据区块等等各种操作了,但是这种接口的操作对象却是数据区块,如果直接将这种接口提供给用户使用的话,使用者所见到的成组设备就是一个杂乱无章、毫无规律的数据区块集合,这对用户而言非常地不方便。

因此必需将这些散乱的数据区块,组织成档案的形式,并向使用者提供一个按名存取的文件系统接口,这就是文件系统驱动程序的主要功能。

意即文件系统驱动程序建立在成组设备驱动程序模块之上,负责对成组设备的进一步抽象,把毫无规律的数据区块,组织成对用户来说,更为方便易用的档案,并向上提供了档案操作的函式接口。

文件系统程序与成组设备驱动程序间的关系如图5.2所示。

图5.2文件系统驱动程序和成组设备驱动程序关系图

CE.NET支持大多数WindowsXP或WindowsME使用的档案I/O函式,例如CreateFile、ReadFile、WriteFile和CloseHandle等Win32API呼叫。

同时,CE.NET仍然遵循使用句柄对档案进行存取的传统方法。

由CreateFile函式回传,新建立或打开的档案句柄,之后的读写操作,都使用该句柄来决定档案操作的对象。

当然,对读写操作来说,还需要一个指标,来指出在档案中进行读写的位置。

系统中所有的可安装文件系统,都是由文件系统管理程序负责管理的。

每个可安装文件系统,都对应着一个文件系统驱动程序,并且以动态链接库(DynamicLinkLibrary)的形式提供,它有一组输出函式被映射到标准的文件系统Win32API上。

像CreateFile、ReadFile、WriteFile和CloseHandle这些文件系统API的功能,最后都是呼叫某个文件系统驱动程序的函式MyFSD_CreateFileW、MyFSD_ReadFile、MyFSD_WriteFile和MyFSD_CloseFile完成的。

另外值得注意的一点是,文件系统驱动程序的动态链接库的名字,与该文件系统驱动程序的输出函式的前缀(prefix)是相同的。

例如,如果文件系统名为MyFSD,那么对应的动态链接库就是MyFSD.dll,其输出函式的前缀为MyFSD_*。

在应用程序中存取可安装文件系统,使用的是标准的文件系统Win32API。

例如,当应用程序想要在某个储存装置上建立一个目录时,可以呼叫CreateDirectory。

之后由文件系统管理程序对CreateDirectory中指明的路径加以识别,如果发现该路径指向一个使用可安装文件系统的装置,便会呼叫相对应的文件系统驱动程序-MyFSD.dll内的建立目录函式MyFSD_CreateDirectoryW。

也就是说,应用程序呼叫CreateDirectory的结果,是导致文件系统管理程序,呼叫相对应文件系统驱动程序的函式MyFSD_CreateDirectoryW。

在CE.NET中,负责管理文件系统驱动程序的模块,称为文件系统管理程序(FileSystemDriverManager)。

由于现代操作系统一般都支持多个文件系统并存,因此需要对系统中用到的各个文件系统加以管理,这就是文件系统管理程序的作用。

从功能上讲,CE.NET中的文件系统管理程序与Linux中的虚拟文件系统VFS类似,如图5.3所示。

首先,作为不同的文件系统,它们向上层提供的函式接口必然也是不同的。

但是,如果为了使用系统中不同的文件系统,就必须记忆多套不同的函式接口,这对用户来说是难以接受的。

我们所希望的是向使用者提供一套CreateFile、ReadFile、WriteFile和CloseHandle这样的标准接口,为用户隐藏掉不同的文件系统间的差异。

这个任务就是由文件系统管理程序来完成的。

在CE.NET中,使用者见到的并不是文件系统驱动程序所提供的接口,而是经过文件系统管理程序统一包装过的Win32API函式接口。

这种统一接口的作法虽方便了使用者,但另一方面却又不可避免的带来了系统复杂性。

对使用者而言,使用者根本不用关心,他所使用的档案所在的volume到底使用何种文件系统,因为文件系统管理程序已经为用户隐藏了其中的细节,但是在进行的实际的档案操作时,我们又必须要能够找出对应的文件系统,这也是由文件系统管理程序来完成的。

在CE.NET中没有目前目录(currentdirectory)的概念,所有对档案的存取都必需提供完整路径名称。

在为外围储存装置安装文件系统驱动程序的同时,文件系统管理程序会为其注册一个标识性的目录名称。

如此一来,当用户对外围储存装置上的档案进行存取时,文件系统管理程序就可以根据用户提供的完整目录名称,分析出该档案所在的volume、使用的文件系统等。

图5.3文件系统管理程序与文件系统驱动程序关系图

5.1.3.3分割区管理程序与分割区驱动程序

一个储存装置是由多个扇区(sector)组成的,每个扇区包含了一组连续的字节,所有扇区的大小都是相同的。

储存装置可能被划分为多个逻辑分割区,每个分割区由一组连续的扇区组成。

分割区之间不能相互重迭,否则操作系统将停止响应。

没有被划分到任何分割区中的储存空间属于未分割区空间。

分割区管理程序是储存管理程序的一部分,它透过呼叫分割区驱动程序来完成对这些分割区的管理、挂载(mount)与卸除(unmount)。

同一储存装置上的不同分割区可以使用不同的文件系统,每个分割区所使用的文件系统类型是在建立或格式化时就确定了。

在对该分割区进行挂载时,分割区管理程序会通知储存管理程序启动对应的文件系统。

CE.NET可以同时支持多个分割区驱动程序,但是对于一个指定的储存装置来讲只能使用一个分割区驱动程序,由它为分割区管理程序解释该装置上的所有分割区。

如前所述,分割区是对储存装置进行逻辑划分的结果。

在CE.NET中,多个分割区既可以使用相同的文件系统,也可以使用不同的文件系统。

分割区管理程序透过呼叫分割区驱动程序完成对分割区的操作。

分割区驱动程序也是以动态链接库的形式提供的,在CE.NET中预设的分割区驱动程序是MSPart.dll,它输出了一组API。

使用者也可以编写自己的分割区驱动程序,只要该分割区驱动程序支持与MSPart.dll相同的API即可。

为了使自己编写的分割区驱动程序MyPart.dll生效,还需要在注册信息的配置信息中填写"

MyPart.dll"

,这样就可以使用自己的分割区驱动程序了。

表5.2说明了一个分割区驱动程序应该提供的所有函式。

表5.2分割区驱动程序提供的函式

函式名

功能

PD_ClosePartition

结束I/O操作,关闭分割区

PD_CloseStore

关闭储存装置上的volume

PD_CreatePartition

在储存装置的volume上建立分割区

PD_DeletePartition

从储存装置的volume上删除分割区

PD_DeviceIoControl

向指定的设备驱动器直接发送句柄,完成相对应的操作

PD_FindPartitionClose

关闭列举分割区时使用的搜寻句柄

PD_FindPartitionNext

在列举分割区时得到下一个分割区的信息。

PD_FindPartitionStart

开始列举分割区。

PD_FormatPartition

在储存装置的volume上格式化一个分割区

PD_FormatStore

对储存装置进行格式化操作

PD_GetPartitionInfo

得到指定分割区的属性信息

PD_GetStoreInfo

得到储存装置的信息

PD_IsStoreFormatted

查询储存装置是否已被格式化

PD_OpenPartition

打开分割区以进行I/O操作

PD_OpenStore

打开储存装置上的volume

PD_RenamePartition

重新命名储存装置上的一个分割区

PD_SetPartit

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1