WINCE6.0文件系统及存储管理器
*******************************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á)256MB的RAM,WINCE6.0為對(duì)象存儲(chǔ)中的每一個(gè)對(duì)象都分配了一個(gè)唯一的對(duì)象標(biāo)識(shí)符(windows CE object identifier,CEOID)該標(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 Manager,FSD 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 manager,FSDMGR)直接調(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 manager,FSDMGR)直接調(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)(FSDs,files 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),如FATFS、EXFAT、CD/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
這里的MyProfileName是NANDFLASH,MyFileSystem是FATFS,表示文件過(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)于Flags在VS2005中help的描述如下
圖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)下面VS2005中help文檔的相關(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.dll,kernel.dll加載filesys.dll,filesys.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.0中storage 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ū)表PartitionTable在Common.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)題。
- 上一篇: 我的9年IT路
- 下一篇: WINCE系统启动时是否clean bo