日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

WINCE6.0文件系统及存储管理器

發(fā)布時(shí)間:2025/4/16 windows 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WINCE6.0文件系统及存储管理器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

*******************************LoongEmbedded********************************

作者:LoongEmbedded

時(shí)間:2010.12.03

類(lèi)別:WINCE嵌入式系統(tǒng)

********************************LoongEmbedded********************************

?

?

Filesys.dll由對(duì)象存儲(chǔ),ROM文件系統(tǒng)和存儲(chǔ)管理器組成,其中:

對(duì)象存儲(chǔ):包含RAM注冊(cè)表,數(shù)據(jù)庫(kù)和RAM文件系統(tǒng)。

存儲(chǔ)管理器:其功能由系統(tǒng)中的fsdmgr.dll模塊來(lái)實(shí)現(xiàn),它由塊設(shè)備驅(qū)動(dòng)程序管理器(block driver manager)、分區(qū)管理器(partition managerr)和文件系統(tǒng)驅(qū)動(dòng)程序管理器(file system driver manager,也叫FSD manager),見(jiàn)下圖

1

?

1.對(duì)象存儲(chǔ)

對(duì)象存儲(chǔ)實(shí)質(zhì)是一個(gè)內(nèi)存堆,由filesys.dll控制,只要后備電源有電,則對(duì)象存儲(chǔ)中的信息就能夠得到保持,RAM存儲(chǔ)芯片構(gòu)成了對(duì)象存儲(chǔ)的物理基礎(chǔ),這里的RAM芯片是指SDRAM。對(duì)象存儲(chǔ)最多可達(dá)256MBRAMWINCE6.0為對(duì)象存儲(chǔ)中的每一個(gè)對(duì)象都分配了一個(gè)唯一的對(duì)象標(biāo)識(shí)符(windows CE object identifierCEOID)該標(biāo)識(shí)符的作用就是用于訪問(wèn)對(duì)象存儲(chǔ)中的對(duì)象,那么什么是對(duì)象呢?

下面這些都是對(duì)象:

*** 注冊(cè)表中的一個(gè)鍵

*** 注冊(cè)表中的一個(gè)值

*** 一個(gè)文件

*** 文件數(shù)據(jù)中大小為4-KB的一部分

*** 數(shù)據(jù)庫(kù)中的一條記錄,做多可保存4KB數(shù)據(jù)

*** 數(shù)據(jù)庫(kù)中的一條記錄的擴(kuò)展信息,也可保存4KB數(shù)據(jù)

*** 一個(gè)數(shù)據(jù)庫(kù)

?

1.1?? RAM注冊(cè)表

WINCE6.0的注冊(cè)表是用來(lái)保存應(yīng)用程序,驅(qū)動(dòng)程序和用戶的設(shè)定以及其他一些配置信息的,WINCE6.0支持基于RAM的注冊(cè)表(RAM-Based Registry )和基于Hive的注冊(cè)表(Hive-Based Registry),其中基于RAM的注冊(cè)表把整個(gè)注冊(cè)表作為一個(gè)對(duì)象存儲(chǔ)堆存放在系統(tǒng)的內(nèi)存中。

?

基于RAM的注冊(cè)表,其所有的數(shù)據(jù)保存在對(duì)象存儲(chǔ)中(也即保存在內(nèi)存堆中,更直觀來(lái)說(shuō)是保存在SDRAM),這樣,只要SDRAM保存不停地刷新,那么RAM注冊(cè)表中的數(shù)據(jù)就會(huì)一直保持。但如果SDRAM斷電,數(shù)據(jù)就會(huì)丟失。所以基于RAM的注冊(cè)表用在經(jīng)常熱啟動(dòng)(warm boot)的系統(tǒng)中比較有效率,而如果用在經(jīng)常冷啟動(dòng)(colde boot)的系統(tǒng)的效率就較低。其中有電池作為后備電源為SDRAM供電的單用戶設(shè)備是最適合使用基于RAM的注冊(cè)表的。

?

1.2?? RAM文件系統(tǒng)

WINCE6.0提供3中文件系統(tǒng),分別是RAM文件系統(tǒng)、ROM文件系統(tǒng)和可安裝文件系統(tǒng)。WINCE6.0中使用的文件系統(tǒng),其根目錄為“/”,所有的文件系統(tǒng)都被mount到根目錄“/”下面,ROM文件系統(tǒng)通常直接掛載到/Windows目錄,RAM文件系統(tǒng)通常直接掛載到根目錄下,也就是說(shuō),根目錄下除了掛載的外存目錄和/Windows目錄之外的所有文件都位于RAM文件系統(tǒng)中,見(jiàn)下圖

2

RAM文件系統(tǒng)由FSD(file system driver) Manager管理,WINCE6.0文件系統(tǒng)的配置,由注冊(cè)表實(shí)現(xiàn),一般在[HKLM/System/StorageManager]中,比如:

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH/FATFS]

??? "Flags"=dword:14

???????? "Folder"="ResidentFlash"

??? "FormatExfat"=dword:1

??? "CheckForFormat"=dword:1

??? "EnableWriteBack"=dword:1

IF IMGHIVEREG???

??? "MountAsBootable"=dword:1

ENDIF ;IMGHIVEREG

?

在定制WinCE操作系統(tǒng)時(shí),我們可以選擇ROM-only 的文件系統(tǒng)或RAM and ROM的文件系統(tǒng)。當(dāng)選擇RAM and ROM的文件系統(tǒng)時(shí),根目錄文件系統(tǒng)在內(nèi)存當(dāng)中,掉電即丟失。為了實(shí)現(xiàn)根文件系統(tǒng)和注冊(cè)表的保存,即在冷啟動(dòng)時(shí)不丟失,我們需要選擇ROM and RAM file system的文件系統(tǒng)和HIVE-Based注冊(cè)表,以將存儲(chǔ)空間Mount成根目錄,并配置注冊(cè)表使其支持HIVE-Based注冊(cè)表。

?

1.3?? 屬性數(shù)據(jù)庫(kù)

WINCE6.0提供CEDB(WINCE Database)EDB(Embedded Database)這兩種數(shù)據(jù)庫(kù),其中CEDB在字節(jié)流的基礎(chǔ)上,對(duì)文件進(jìn)行進(jìn)一步的抽象,提供了與關(guān)系型數(shù)據(jù)庫(kù)類(lèi)似的數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)和訪問(wèn)。

?

2. ROM文件系統(tǒng)

WINCE6.0的內(nèi)部文件系統(tǒng)控制對(duì)ROM的訪問(wèn),也提供了對(duì)位于RAM的對(duì)象存儲(chǔ)的文件存儲(chǔ),WINCE6.0支持兩種可用的文件系統(tǒng):RAM and ROM文件系統(tǒng)和ROM文件系統(tǒng)。RAM and ROM文件系統(tǒng)提供了對(duì)象存儲(chǔ)里的文件存儲(chǔ)以及對(duì)ROM的訪問(wèn),而ROM文件系統(tǒng)不允許應(yīng)用程序?qū)⑽募鎯?chǔ)在對(duì)象存儲(chǔ)里,通過(guò)根目錄下的windows目錄可以訪問(wèn)ROM中的數(shù)據(jù)。ROM文件系統(tǒng)連接到統(tǒng)一文件系統(tǒng)中的“/Windows”文件夾,這意味著ROM中的所有文件均可作為“/Windows”文件夾中的只讀文件來(lái)訪問(wèn)。

?

3.存儲(chǔ)管理器(storage manager)

?

存儲(chǔ)管理器負(fù)責(zé)管理系統(tǒng)中所有的外圍存儲(chǔ)設(shè)備,包括管理它們所有的文件系統(tǒng)和塊驅(qū)動(dòng)。所有的文件、數(shù)據(jù)和容量都是通過(guò)存儲(chǔ)管理器來(lái)操作的,存儲(chǔ)管理器的功能由系統(tǒng)中的fsdmgr.dll模塊實(shí)現(xiàn),由下面三部分組成:

文件系統(tǒng)驅(qū)動(dòng)程序管理器(File System Driver ManagerFSD Manager)

分區(qū)管理器(Partition Manager)

塊設(shè)備驅(qū)動(dòng)程序管理器(Block Driver Manager)

存儲(chǔ)管理器的體系結(jié)構(gòu)如下圖所示:

3

從上圖可以知道存儲(chǔ)管理器是一個(gè)分層結(jié)構(gòu),由文件系統(tǒng)過(guò)濾器(File system filters)、文件系統(tǒng)驅(qū)動(dòng)程序(File system dirver)、分區(qū)驅(qū)動(dòng)程序(Partition driver)和存儲(chǔ)驅(qū)動(dòng)程序(Block driver)組成。下面是common.reg總關(guān)于存儲(chǔ)管理器的注冊(cè)表信息

; This tells Filesys to load FSDMGR

[HKEY_LOCAL_MACHINE/System/StorageManager]

??? "Dll"="fsdmgr.dll"

??? "PNPUnloadDelay"=dword:1000

fsdmgr.dll是存儲(chǔ)管理器的表現(xiàn)形式,"PNPUnloadDelay"是指存儲(chǔ)管理器在接收到即插即用設(shè)備的卸載通知后的延時(shí)時(shí)間,具體存儲(chǔ)管理器需要管理的存儲(chǔ)設(shè)備的注冊(cè)表信息在HKEY_LOCAL_MACHINE/System/StorageManager/Profiles下。

?

?

3.1 文件系統(tǒng)過(guò)濾器

?

文件系統(tǒng)過(guò)濾器是一個(gè)導(dǎo)出文件系統(tǒng)入口的DLL,這些入口映射到標(biāo)準(zhǔn)的文件系統(tǒng)函數(shù),比如CreateFile函數(shù)和CreateDriectory函數(shù)。文件系統(tǒng)過(guò)濾器用于處理對(duì)文件系統(tǒng)的調(diào)用,此后文件系統(tǒng)才能獲得這些調(diào)用,也就是說(shuō)存儲(chǔ)管理器在調(diào)用文件系統(tǒng)API之前先調(diào)用文件系統(tǒng)過(guò)濾器的過(guò)濾函數(shù),這樣就允許對(duì)文件訪問(wèn)進(jìn)行某些特殊的處理,因?yàn)槲募到y(tǒng)過(guò)濾器攔截對(duì)文件系統(tǒng)的調(diào)用,所以可以對(duì)文件數(shù)據(jù)的加密、解密、壓縮甚至掃描文件是否存在病毒等。

?

文件系統(tǒng)過(guò)濾器是輕量級(jí)(lightweight)的文件系統(tǒng)驅(qū)動(dòng)(FSDs),它導(dǎo)出鉤子函數(shù)(hook functions)FSD_HookVolume()FSD_UnhookVolume(),而不是磁盤(pán)掛載函數(shù)FSD_MountDisk()FSD_UnmountDisk(),下面介紹介紹這個(gè)幾個(gè)函數(shù):

FSD_HookVolume():在存儲(chǔ)管理器加載文件系統(tǒng)過(guò)濾器的時(shí)候會(huì)調(diào)用這個(gè)入口函數(shù),此函數(shù)是由文件系統(tǒng)的導(dǎo)出函數(shù),并且被文件系統(tǒng)磁盤(pán)管理器(file system disk managerFSDMGR)直接調(diào)用。

FSD_UnhookVolume():在存儲(chǔ)管理器卸載文件系統(tǒng)過(guò)濾器的時(shí)候會(huì)調(diào)用這個(gè)入口函數(shù),此函數(shù)是由文件系統(tǒng)的導(dǎo)出函數(shù),并且被文件系統(tǒng)磁盤(pán)管理器(file system disk managerFSDMGR)直接調(diào)用。

FSD_MountDisk():設(shè)備管理器調(diào)用這個(gè)函數(shù)來(lái)掛載包含具體文件類(lèi)型的指定磁盤(pán),比如可以在根目錄下掛載ResidentFlash盤(pán)符,這個(gè)盤(pán)符是基于FATFS文件系統(tǒng)來(lái)操作nandflash

?

FSD_UnmountDisk():設(shè)備管理器調(diào)用這個(gè)函數(shù)來(lái)卸載指定的盤(pán)符。

?

還有很重要的一點(diǎn)是文件系統(tǒng)驅(qū)動(dòng)管理器(FSD Manager)加載文件系統(tǒng)驅(qū)動(dòng)(FSDsfiles system drivers)和文件系統(tǒng)過(guò)濾器。

?

3.1.1 文件系統(tǒng)過(guò)濾器的注冊(cè)表路徑

?

HKEY_LOCAL_MACHINE/System/StorageManager/Filters

表示文件系統(tǒng)過(guò)濾器對(duì)所有的文件類(lèi)型都有效,也就是說(shuō)沒(méi)有篩選。

?

HKEY_LOCAL_MACHINE/System/StorageManager/ MyFileSystem /Filters

MyFileSystem是指具體的文件系統(tǒng),如FATFSEXFATCD/UDFS等文件系統(tǒng),這個(gè)路徑指文件系統(tǒng)過(guò)濾器對(duì)指定的文件系統(tǒng)有效。

?

HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/ MyFileSystem /Filters

表示文件系統(tǒng)過(guò)濾器對(duì)自動(dòng)加載的指定的文件系統(tǒng)有效,這里的自動(dòng)加載是指由存儲(chǔ)管理器來(lái)直接加載存儲(chǔ)設(shè)備的驅(qū)動(dòng)(block driver)

?

HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/ MyProfileName / MyFileSystem /Filters

MyProfileName是指Profile的名字,這個(gè)路徑指文件系統(tǒng)過(guò)濾器對(duì)指定存儲(chǔ)硬件的文件系統(tǒng)有效,比如我們項(xiàng)目的Platform.reg下相關(guān)內(nèi)容如下:

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFLASH]

??? "Prefix"="DSK"

??? "Dll"="smflash.dll"

??? "Index"=dword:1

??? "Order"=dword:0

??? "Profile"="NANDFLASH"

??? "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

IF IMGHIVEREG

??? "Flags"=dword:00001000

ENDIF ;IMGHIVEREG

…………………….

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH/FATFS/Filters/CacheFilt]

??? "Dll"="cachefilt.dll"

"LockIOBuffers"=dword:1

這里的MyProfileNameNANDFLASHMyFileSystemFATFS,表示文件過(guò)濾器(在此為cache的過(guò)濾器cachefilt.dll,不知是否該這樣理解?)對(duì)加載在NANDFLASH上的文件系統(tǒng)有效,也就是如果要讀寫(xiě)NANDFLASH上的數(shù)據(jù),只有以FATFS文件系統(tǒng)格式才能訪問(wèn),否則被文件過(guò)濾器過(guò)濾掉,這樣就無(wú)法讀寫(xiě)NANDFLASH上的數(shù)據(jù)。

?

3.1.2 文件系統(tǒng)過(guò)濾器注冊(cè)表值

用任何有效的注冊(cè)表鍵值來(lái),比如添加過(guò)濾器的名字,過(guò)濾DLL的值和過(guò)濾器的order的值,通過(guò)這些操作可以建立文件系統(tǒng)過(guò)濾器,比如

?

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

"dll"="filter.dll"

"Order"=dword:x

堆棧上過(guò)濾器的order是由高到低,最高order(0)的過(guò)濾器被首先加載,更低order的過(guò)濾器后面接著加載。如果order的值沒(méi)有指定,那么order的值默認(rèn)被設(shè)置為0xFFFFFFFF,但如果多于一個(gè)的過(guò)濾器沒(méi)有指定order的值,那么這些沒(méi)有指定order的值的過(guò)濾器的加載順序是不明確的。

?

3.1.3 文件系統(tǒng)過(guò)濾器的sample

?

文件系統(tǒng)過(guò)濾器的例子在下面的目錄下

%_WINCEROOT%/Public/Common/Oak/Drivers/FSD/EncFilt

%_WINCEROOT%/Public/Common/Oak/Drivers/FSD/FSDSpy

其相關(guān)的注冊(cè)表信息如下:

[HKEY_LOCAL_MACHINE/System/StorageManager/FATFS/filters/FSDSPY]

?? "Dll"="fsdspy.dll"

?? "Order"=dword:0

[HKEY_LOCAL_MACHINE/System/StorageManager/FATFS/filters/ENCRYPT]

?? "Dll"="fsdenc.dll"

?? "Order"=dword:1

?

3.2 文件系統(tǒng)驅(qū)動(dòng)

?

文件系統(tǒng)驅(qū)動(dòng)是實(shí)現(xiàn)對(duì)應(yīng)的文件系統(tǒng)的DLL,文件驅(qū)動(dòng)將存儲(chǔ)設(shè)備上的數(shù)據(jù)組織為文件和文件夾來(lái)對(duì)設(shè)備進(jìn)行操作。應(yīng)用程序操作文件是通過(guò)wince 文件系統(tǒng)提供的接口進(jìn)行操作,如:可以通過(guò)CreateFile函數(shù),打開(kāi)或創(chuàng)建一個(gè)文件。接下來(lái),系統(tǒng)是如何去完成這個(gè)任務(wù)的呢?比如我們要操作SD卡上的文件,SD卡上也有自己的文件系統(tǒng),用于組織和管理文件,wince文件系統(tǒng)是如果操作這些文件的呢?這時(shí)候,FSD(文件系統(tǒng)驅(qū)動(dòng))就發(fā)揮它的作用了。文件的操作共涉及到六個(gè)層次:

應(yīng)用程序:用戶通過(guò)應(yīng)用程序操作文件。

wince文件系統(tǒng):操作系統(tǒng)的一部分,根據(jù)用戶的請(qǐng)求,判斷操作的是那個(gè)設(shè)備上的文件,以便調(diào)用相應(yīng)的驅(qū)動(dòng)。

文件系統(tǒng)驅(qū)動(dòng):操作系統(tǒng)沒(méi)辦法直接和設(shè)備驅(qū)動(dòng)進(jìn)行交互,需要通過(guò)文件系統(tǒng)驅(qū)動(dòng),實(shí)現(xiàn)與設(shè)備驅(qū)動(dòng)的操作,以實(shí)現(xiàn)文件操作。

分區(qū)驅(qū)動(dòng):主要實(shí)現(xiàn)對(duì)存儲(chǔ)設(shè)備的邏輯劃分。

⑸設(shè)備驅(qū)動(dòng):實(shí)現(xiàn)了設(shè)備上的操作,包括文件操作等。

設(shè)備上的文件系統(tǒng):組織和管理設(shè)備上的文件存儲(chǔ)。

從以上的分析可以知道,文件系統(tǒng)在操作系統(tǒng)和設(shè)備驅(qū)動(dòng)之間起到了一個(gè)連接作用。在實(shí)現(xiàn)的時(shí)候,文件系統(tǒng)驅(qū)動(dòng)基于設(shè)備驅(qū)動(dòng),實(shí)現(xiàn)了wince文件系統(tǒng)中的文件操作函數(shù),如CreateFile等。

?

3.3 分區(qū)驅(qū)動(dòng)

分區(qū)是對(duì)存儲(chǔ)設(shè)備的邏輯劃分,WINCE6.0允許物理磁盤(pán)(我們常用的是nandflash)包含多個(gè)分區(qū),并且每個(gè)分區(qū)可以格式化為不同的文件系統(tǒng),但是每個(gè)設(shè)備只能由一個(gè)分區(qū)驅(qū)動(dòng)程序來(lái)管理。下面是src/bootloader/eboot/nand.cpp文件的WriteOSImageToBootMedia函數(shù)中關(guān)于建立分區(qū)的代碼

?

4

4的代碼主要是通過(guò)分區(qū)驅(qū)動(dòng)在nandflash建立一個(gè)使用BINFS文件系統(tǒng)的分區(qū),這個(gè)分區(qū)用于保存NK映像。

5

5的代碼主要是通過(guò)分區(qū)驅(qū)動(dòng)在nandflash建立一個(gè)使用FAT32文件系統(tǒng)的分區(qū),這個(gè)分區(qū)建立在除去NK映像占用的其余nandflash空間。

?

分區(qū)驅(qū)動(dòng)程序?qū)嶋H上是存儲(chǔ)驅(qū)動(dòng)程序的轉(zhuǎn)換器。它公開(kāi)與存儲(chǔ)驅(qū)動(dòng)程序相同的接口,并將分區(qū)的塊地址(邏輯地址)轉(zhuǎn)換為存儲(chǔ)設(shè)備塊的真實(shí)地址(物理地址)。然后,它將調(diào)用傳遞給存儲(chǔ)驅(qū)動(dòng)程序。分區(qū)驅(qū)動(dòng)程序是一個(gè)DLL(mspart.dll),在common.reg的相關(guān)注冊(cè)表信息如下:

; HIVE BOOT SECTION

; Partition driver key.

[HKEY_LOCAL_MACHINE/System/StorageManager/MSPART]

??? "Dll"="mspart.dll"

; END HIVE BOOT SECTION

?

3.4 存儲(chǔ)驅(qū)動(dòng)程序

存儲(chǔ)驅(qū)動(dòng)程序是用于和存儲(chǔ)設(shè)備直接打交道,可以讀寫(xiě)存儲(chǔ)設(shè)備,存儲(chǔ)驅(qū)動(dòng)程序也稱為“塊驅(qū)動(dòng)程序”,因?yàn)樗鼈兲峁?duì)數(shù)據(jù)存儲(chǔ)的隨即尋址塊的訪問(wèn)。對(duì)于存儲(chǔ)設(shè)備為nand flash的系統(tǒng),其存儲(chǔ)驅(qū)動(dòng)就是nandflash驅(qū)動(dòng)

http://blog.csdn.net/LoongEmbedded/archive/2010/11/26/6036448.aspx

?

?

?

4.存儲(chǔ)管理器加載設(shè)備

?

4.1存儲(chǔ)管理器加載設(shè)備的兩種方式

WINCE里面對(duì)于塊設(shè)備的加載可以有兩種方式,一種就是通過(guò)device manager來(lái)加

載然后通知存儲(chǔ)管理器做后續(xù)的加載工作,而另一種則是直接由存儲(chǔ)管理器來(lái)加載,這種方式可以通過(guò)注冊(cè)表:Autoload鍵值來(lái)實(shí)現(xiàn)。一般是采用第一種加載方式,對(duì)于設(shè)備管理器加載的驅(qū)動(dòng)的話只能靠Flags = 0x1000 來(lái)決定, 這需要通過(guò)platform.reg中下面的注冊(cè)表信息的Flags的值來(lái)決定。

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFLASH]

??? "Prefix"="DSK"

??? "Dll"="smflash.dll"

??? "Index"=dword:1

??? "Order"=dword:0

??? "Profile"="NANDFLASH"

??? "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

IF IMGHIVEREG

??? "Flags"=dword:00001000???????????????? //就是這個(gè)flags

ENDIF ;IMGHIVEREG

關(guān)于FlagsVS2005help的描述如下

6

"Flags"=dword:00001000告訴設(shè)備管理器在hive-base注冊(cè)表初始化的第一個(gè)階段來(lái)加載驅(qū)動(dòng)。

?

那既然是選擇第一種方式來(lái)加載設(shè)備,那么就需要在hive-base注冊(cè)表初始化的第一個(gè)階段來(lái)啟動(dòng)存儲(chǔ)管理器和設(shè)備管理器,這是由platform.reg下面的注冊(cè)表信息的Flags來(lái)決定的

[HKEY_LOCAL_MACHINE/Init/BootVars]

??? "Flags"=dword:3

??? "RegistryFlags"=dword:1

Flags的值有哪些呢?又表示什么意義呢?見(jiàn)下面VS2005help文檔的相關(guān)部分:

7

"Flags"=dword:3就是告訴系統(tǒng)在hive-base注冊(cè)表初始化的第一個(gè)階段來(lái)啟動(dòng)存儲(chǔ)管理器和設(shè)備管理器的。

?

4.2 設(shè)備管理器結(jié)合存儲(chǔ)管理器來(lái)加載設(shè)備

?

Oal.exe加載kernel.dllkernel.dll加載filesys.dllfilesys.dll加載device.dll,到此設(shè)備管理器就加載起來(lái)了,common.reg中設(shè)備管理器的注冊(cè)表信息如下

[HKEY_LOCAL_MACHINE/init]

??????? "Launch20"="device.dll"

因?yàn)榇鎯?chǔ)管理(fsdmgr.dll模塊來(lái)實(shí)現(xiàn))filesys.dll的一部分,所以存儲(chǔ)管理器也在運(yùn)行中,已準(zhǔn)備好。

?

下面就來(lái)看看存儲(chǔ)管理器是如何加載設(shè)備的,見(jiàn)下圖

8

設(shè)備管理器從 HKEY_LOCAL_MACHINE/Driver/BuiltIn 項(xiàng)加載驅(qū)動(dòng)程序。正常情況下,任何內(nèi)置的磁盤(pán)設(shè)備(例如,硬盤(pán),)列在該項(xiàng)下面,所以將加載塊驅(qū)動(dòng)程序。塊驅(qū)動(dòng)程序通告一個(gè)特定的設(shè)備類(lèi)標(biāo)識(shí)符 BLOCK_DRIVER_GUID {A4E7EDDA-E575-4252-9D6B-4195D48BB865},比如下面是我的WINCE6.0+2443系統(tǒng)中platform.reg里關(guān)于塊驅(qū)動(dòng)注冊(cè)表信息:

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFLASH]

??? "Prefix"="DSK"

??? "Dll"="smflash.dll"

??? "Index"=dword:1

??? "Order"=dword:0

??? "Profile"="NANDFLASH"

??? "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

IF IMGHIVEREG

??? "Flags"=dword:00001000

ENDIF ;IMGHIVEREG

?

(The Storage Manager consists of the Block Driver Manager, the Partition Manager, and the File System Driver (FSD) Manager.)存儲(chǔ)管理器中的塊驅(qū)動(dòng)管理器收到并且識(shí)別出這是一個(gè)塊設(shè)備后,塊驅(qū)動(dòng)管理器向存儲(chǔ)管理器索要這個(gè)塊驅(qū)動(dòng)相應(yīng)的profile注冊(cè)表鍵值的信息,

?

Storage Manager looks up the profile information for the device and loads the appropriate partition driver

存儲(chǔ)管理器查詢塊設(shè)備的profile信息并且根據(jù)這個(gè)信息來(lái)加載相稱的分區(qū)驅(qū)動(dòng),比如下面是我的項(xiàng)目的相關(guān)注冊(cè)表信息

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH]

??? "DefaultFileSystem"="BINFS"

??? "PartitionDriver"="mspart.dll"

??? "Name"="Microsoft Flash Disk"

通過(guò)上面的HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH注冊(cè)表信息就找到分區(qū)驅(qū)動(dòng)mspart.dll,這樣存儲(chǔ)管理器就加載分區(qū)驅(qū)動(dòng)了。這里[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH]NANDFLASH要和⑴中的"Profile"="NANDFLASH"保持一致。

?

存儲(chǔ)管理器加載分區(qū)驅(qū)動(dòng)程序后,存儲(chǔ)管理器的分區(qū)管理器(Partition Manager)將請(qǐng)求分區(qū)驅(qū)動(dòng)程序枚舉磁盤(pán)上的分區(qū),并標(biāo)識(shí)每個(gè)分區(qū)上的文件系統(tǒng)。分區(qū)驅(qū)動(dòng)程序?qū)闹鲉?dòng)記錄 (MBR) 中讀取有關(guān)分區(qū)和文件系統(tǒng)的信息,并向存儲(chǔ)管理器中的文件系統(tǒng)管理器(File System Driver (FSD) Manager)提供文件系統(tǒng)信息。圖4和圖5就是分別在nandflash建立BINFS分區(qū)和FATFS分區(qū),其中BINFS分區(qū)用于保存系統(tǒng)映像,而FATFS分區(qū)是基于除去系統(tǒng)映像占用的nandflash空間之外的剩余nandflash空間,見(jiàn)WINCE6.0storage manager下面顯示的分區(qū)及其文件系統(tǒng)的屬性

9

10

11

?

分區(qū)驅(qū)動(dòng)被加載后就會(huì)通過(guò)塊設(shè)備驅(qū)動(dòng)提供的接口來(lái)讀取塊設(shè)備上的分區(qū)信息,這個(gè)信

息一般就是同過(guò)讀取MBR的分區(qū)表得到的,如果分區(qū)類(lèi)型在注冊(cè)表里分區(qū)表中有相應(yīng)的值,分區(qū)驅(qū)動(dòng)就會(huì)根據(jù)這個(gè)來(lái)加載相應(yīng)的文件系統(tǒng)驅(qū)動(dòng)。在這里,注冊(cè)表里分區(qū)表PartitionTableCommon.reg中,如下:

; The partition table contain entries where the volume name is the partition type (in %02X format)

; The value is the name of the filesystem.? This is used to look up the module to load etc.

; Explicitly call out 07 partition type as MSIFS, which means an Microsoft Installable File SYstem,

; such as NTFS or EXFAT.? The actual filesystem name is determined by running the detectors.

?

[HKEY_LOCAL_MACHINE/System/StorageManager/PartitionTable]

??? "01"="FATFS"

??? "04"="FATFS"

??? "06"="FATFS"

??? "07"="MSIFS"

??? "0B"="FATFS"

??? "0C"="FATFS"

??? "0E"="FATFS"

??? "0F"="FATFS"

??? "20"="BOOT"

??? "21"="BINFS"

??? "22"="RAWFS"

??? "23"="RAWFS"

??? "25"="IMGFS"

??? "26"="BINARY"

假如新增加一種文件系統(tǒng),就必須添加到這個(gè)表中,如果我們要加載的文件系統(tǒng)類(lèi)似不在這個(gè)表中,系統(tǒng)將不能正常啟動(dòng),停在下面的串口

-OEMInit

#### FMD_DRIVER:::FMD_OEMIoControl

FMD_OEMIoControl: unrecognized IOCTL (0x71f8c).

#### FMD_DRIVER:::FMD_INIT

?(NAND ID:0xecf1) --> OK.

?NUM_OF_BLOCKS??? = 1024

?PAGES_PER_BLOCK? = 64

?SECTORS_PER_PAGE = 4

NUMBLOCKS : 1024(0x400), SECTORSPERBLOCK = 64(0x40), BYTESPERSECTOR = 2048(0x800)

#### FMD_DRIVER:::FMD_OEMIoControl

FMD_OEMIoControl: unrecognized IOCTL (0x71c24).

?

文件系統(tǒng)起來(lái)后,就會(huì)分析這個(gè)分區(qū)的數(shù)據(jù)是不是有效的,如果是有效的的分區(qū)的,那么文件系統(tǒng)驅(qū)動(dòng)就成功的mount在了這個(gè)塊設(shè)備上了,也就是和塊設(shè)備關(guān)聯(lián)在了一起,而要是數(shù)據(jù)不是有效的話,那么,它會(huì)試著格式化這個(gè)分區(qū),如果能格式化成功,那么mount也就成功了,如果不能格式化的話,那么就mount失敗,這個(gè)分區(qū)就是無(wú)效的了。

?

分區(qū)驅(qū)動(dòng)接著會(huì)去枚舉下一個(gè)分區(qū),直到所有分區(qū)都枚舉完為止,這樣文件系統(tǒng)的加載過(guò)程就算完成了。

?

5.實(shí)現(xiàn)基于hive的注冊(cè)表

5.1 需要選擇的組件

12

5.2 platform.reg中相關(guān)的注冊(cè)表內(nèi)容

; HIVE BOOT SECTION

[HKEY_LOCAL_MACHINE/Drivers/Resources/IRQ]

?? "Identifier"=dword:1

?? "Minimum"=dword:1

?? "Space"=dword:20

?? "Ranges"="1-0x20"

;? "Shared"=""

?

[HKEY_LOCAL_MACHINE/Drivers/Resources/IO]

?? "Identifier"=dword:2

?? "Minimum"=dword:0

?? "Space"=dword:10000

?? "Ranges"="0-0xFFFF"

; END HIVE BOOT SECTION

?

…………………………

;;for hive based registry

; HIVE BOOT SECTION

IF IMGHIVEREG

[HKEY_LOCAL_MACHINE/Init/BootVars]

??? "Flags"=dword:3

??? "RegistryFlags"=dword:1

ENDIF ;IMGHIVEREG

; END HIVE BOOT SECTION

?

; HIVE BOOT SECTION

IF BSP_NONANDFS !

?

???

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFLASH]

??? "Prefix"="DSK"

??? "Dll"="smflash.dll"

??? "Index"=dword:1

??? "Order"=dword:0

??? "Profile"="NANDFLASH"

??? "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

IF IMGHIVEREG

??? "Flags"=dword:00001000

ENDIF ;IMGHIVEREG

???

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH]

??? "DefaultFileSystem"="BINFS"

??? "PartitionDriver"="mspart.dll"

??? "Name"="Microsoft Flash Disk"

?

???

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH/BINFS]

??? "MountHidden"=dword:1

??? "MountAsROM"=dword:1

?

????

[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/NANDFLASH]

??? "DriverPath"="Drivers//BuiltIn//NANDFLASH"

??? ; LoadFlags 0x01 == load synchronously

??? "LoadFlags"=dword:1

??? "BootPhase"=dword:0

IF IMGHIVEREG

??? "MountAsBootable"=dword:1

ENDIF ;IMGHIVEREG

???

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH/FATFS]

??? "Flags"=dword:14

???????? "Folder"="ResidentFlash"

??? "FormatExfat"=dword:1

??? "CheckForFormat"=dword:1

??? "EnableWriteBack"=dword:1

IF IMGHIVEREG???

??? "MountAsBootable"=dword:1

ENDIF ;IMGHIVEREG

?

[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/NANDFLASH/Filters/CacheFilt]

??? "Dll"="cachefilt.dll"

??? "LockIOBuffers"=dword:1

?

[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NANDFLASH/FATFS/Filters/CacheFilt]

??? "Dll"="cachefilt.dll"

??? "LockIOBuffers"=dword:1

?

ENDIF ; BSP_NONANDFS

; END HIVE BOOT SECTION

?

上面注冊(cè)表項(xiàng)的值后面再繼續(xù)詳細(xì)學(xué)習(xí)和實(shí)踐了。

?

5.3 mount在根目錄的盤(pán)符

13

?

?

參考的鏈接:

?

WINCE6.0的啟動(dòng)過(guò)程

http://wenku.baidu.com/view/c95f1211cc7931b765ce1523.html

boot.hv存于ROM中。

?

wince 注冊(cè)表文件 platform.reg 詳解

http://blog.myspace.cn/e/407855258.htm

?

WinCE5的文件系統(tǒng)與注冊(cè)表

http://blog.csdn.net/human0787/archive/2008/04/25/2329491.aspx

?

理解 Windows CE .NET 中的文件系統(tǒng)體系結(jié)構(gòu)

http://hgh123.blog.163.com/blog/static/5980422120093202539718/

?

WinCE定制中的大內(nèi)存支持與永久保存注冊(cè)表

http://www.cn-doc.com/_soft_ect_doc/2005_08_18_23/20050818232114655.htm

?

WINCE如何 實(shí)現(xiàn)永久保存注冊(cè)表數(shù)據(jù)

http://blog.myspace.cn/e/407956383.htm

?

wince文件系統(tǒng)之注冊(cè)表相關(guān)

http://wogoyixikexie.blog.163.com/blog/static/88778624200891354433948/

?

如何在wince下實(shí)現(xiàn)一個(gè)文件系統(tǒng)驅(qū)動(dòng)

http://blog.csdn.net/njuitjf/archive/2010/04/12/5478491.aspx

?

總結(jié)

以上是生活随笔為你收集整理的WINCE6.0文件系统及存储管理器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。