作者:ARM-WinCE
在WinCE中支援兩種類型的系統資料庫:RAM-Based和HIVE-Based,預設情況下使用的是RAM-Based系統資料庫。
1. RAM-Based系統資料庫
RAM-Based的系統資料庫是将所有的系統資料庫資料存儲在對象存儲(object store)中,也就是存放在RAM裡面。一般用在有電池備份RAM的系統上面,也就是說,當系統掉電以後,會自動切換成電池供電,此時RAM還有供電,是以上面的資料不會丢失,這樣采用RAM-Based系統資料庫非常有效。
RAM-Based系統資料庫多用于經常熱啟動(Warm Boot)的裝置上面,很少用在冷啟動(Cold Boot)裝置上面。
2. HIVE-Based系統資料庫
HIVE-Based的系統資料庫是将系統資料庫資料存成檔案,也就是存在掉電不會丢失資料的磁盤上面,HIVE系統資料庫被分成兩部分:系統Hive和使用者Hive,也就是system.hv和user.hv。在一個多使用者系統中,會包含多個使用者Hive,不同的使用者Hive(user.hv)會在該使用者登陸的時候被加載,被登出的時候解除安裝。
實際上HIVE-Based的系統資料庫包含三個部分,我稱之為引導Hive,系統Hive和使用者Hive,也就是Boot.hv,system.hv和user.hv。Boot.hv主要用于系統引導時候所需的系統資料庫設定,這部分設定不會被儲存在磁盤上面,也就是說,在系統掉電以後就會丢失。實際上,這部分應該說是屬于RAM-Based系統資料庫,由于這部分資料不需要改動,是以也就無所謂了。System.hv存放關于系統的系統資料庫設定,user.hv存放和使用者相關的系統資料庫設定。
一般在我們編譯WinCE系統的時候,Platform Builder會根據platform.reg檔案中的注釋标簽來判斷哪些系統資料庫設定放入boot.hv中,凡是在注釋标簽”;HIVE BOOT SECTON”和”;END HIVE BOOT SECTION”之間的設定都會被放入boot.hv中,其他的都會放到default.hv和user.hv中。
在WinCE第一次引導的時候,所有的.hv都會被放到RAM中,WinCE系統會首先讀取boot.hv進行相關引導時候的設定,然後把default.hv和user.hv放到磁盤的指定路徑下面,這個路徑也是在系統資料庫中設定的,然後default.hv會被重命名為system.hv。當系統第二次啟動的時候,會比較磁盤上的.hv和記憶體中的.hv是否一緻,如果不一緻,會拷貝磁盤上面的.hv到記憶體中。
我們可以看出,實際上HIVE系統資料庫在運作的時候也是放在RAM中的,這樣速度比較快。啟動的時候會從磁盤上讀出,在使用者更改系統資料庫以後,會被儲存在磁盤上,儲存的時機也是可以設定的,可以選擇在使用者更改後立刻儲存到磁盤上,也可以選擇在reboot的時候儲存。
3 HIVE-Based系統資料庫實作
(1) 添加HIVE-Based系統資料庫項
在系統中支援HIVE-Based系統資料庫要在”Catalog Item View”中選擇”Core OS”->”CEBASE”->”File System and Data Store”->”Registry Storage”->”Hive-based registry”,如圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyRQpkLx8VZ2lGSvwVOxgDM4ADMy8CXzV2Zh1WS5JHduV0LclWdo5WYppmbh52LcRXZu9lbkN3Yfd2bsJ2Xw9CXzV2Zh1WavwFdl5mLuR2cj5yZvxmYtA3Lc9CX6MHc0RHaiojIsJye.jpg)
(2) 添加HIVE注釋标簽
然後需要添加相應的系統資料庫設定,一般我們會在platform.reg中添加HIVE相關的設定,首先需要添加的是HIVE注釋标簽,如下:
;HIVE BOOT SECTION
…
<your registry setting>
…
;END BOOT SECTION
所有與HIVE有關的系統資料庫設定包括HIVE存放的磁盤的驅動的相關設定都要放在HIVE注釋标簽内。
(3) 設定系統資料庫存放的位置:
下面通過一個例子來說明如何設定system.hv和user.hv存放的位置
[HKEY_LOCAL_MACHINE/init/BootVars]
"SystemHive"="//NandFlash//system.hv"
"ProfileDir"="//NandFlash//user.hv"
"Flags"=dword:1
"RegistryFlags"=dword:1
“SystemHive”用來設定system.hv存放的位置,這裡存放在NandFlash磁盤的根目錄下面。
“ProfileDir”用來設定user.hv存放的位置,這裡存放在NandFlash磁盤的根目錄下面。
“Flags”用來設定是否立刻啟動Device Manager,主要是為了啟動Hive-Based所需的儲存設備。
“RegistryFlags”用來設定什麼時候将新的系統資料庫設定寫入磁盤,這裡表示立刻寫入。
(4) 修改磁盤裝置驅動的配置
為相關的磁盤驅動添加支援Hive的設定,如下:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFlash]
"Flags"=dword:1000
由于Hive系統資料庫會被儲存在NandFlash中,是以将”Flags”的設定添加到了NandFlash裝置驅動的系統資料庫設定中。上面的設定隻有在使用HIVE-Based系統資料庫的時候需要,如果不是用Hive系統資料庫,需要注釋掉。
(5) 添加Storage Manager的相關配置
具體添加如下:
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/<ProfileName>/<FileSystemName>]
"MountBootable"=dword:1
同樣,在使用HIVE系統資料庫的時候需要上述設定,如果不是使用HIVE系統資料庫,則注釋掉就可以了。
下面是我曾經基于NandFlash支援Hive系統資料庫的設定,僅供參考: ; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE/init/BootVars] "SystemHive"=" //NANDFlash//system.hv" ;unmask this line to use flash "ProfileDir"=" //NANDFlash//usr.hv" "Start DevMgr"=dword:1 "DefaultUser"="default" "Flags"=dword:1 "RegistryFlags"=dword:1 [HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/NSFlash] "DriverPath"="Drivers//BuiltIn//NANDFlash" "LoadFlags"=dword:1 "Order"=dword:0 [HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFlash] "Dll"="ep94xxnandflash.dll" "Prefix"="DSK" "Order"=dword:0 ;"Ioctl"=dword:4 "Profile"="NSFlash" "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}" "Flags"=dword:1000 ;unmask this line when enable HIVE ;"MemBase"=dword:00000000 ;"MemLen"=dword:00000000 ; Override names in default profile [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash] "Name"="Ep94xx NAND Flash" "Folder"="NANDFlash" "PartitionDriver"="MSPart.dll" "AutoMount"=dword:1 "AutoPart"=dword:1 "AutoFormat"=dword:1 "MountFlags"=dword:2 ;unmask this line when enable HIVE [HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash/FATFS] "MountFlags"=dword:2 ;unmask this line when enable HIVE "EnableCache"=dword:1 "CacheSize"=dword:1000 "MountBootable"=dword:1 "Flags"=dword:00000024 ;"Flags"=dword:00680024 ;"FormatTfat"=dword:1 "CheckForFormat"=dword:1