天天看點

WinCE中的RAM-Based Registry與HIVE-Based Registry

作者: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”,如圖:

WinCE中的RAM-Based Registry與HIVE-Based Registry

       (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