先說原理:
註冊表類型分爲基於對象存儲的註冊表和基於HIVE的註冊表,在定製內核的時候只能選擇其中一種。
從理論上講這兩種註冊表都能夠實現永久保存註冊表數據,但是採用不同的類型會影響CE的啓動順序和啓動速度,
還會影響內存的使用量。我還是趨向於採用基於HIVE的註冊表來實現永久保存註冊表數據,這也是一個發展趨勢。
在講解之前先簡單描述如果CE採用基於HIVE的註冊表,那麼在啓動時如何加載已經保存的註冊表數據:
nk.exe執行,啓動filesys.exe。
filesys.exe加載引導HIVE,此時引導HIVE位於nk.bin解壓之後的文件中。
filesys.exe啓動device.exe,之後處於等待狀態,等待device.exe將包含系統HIVE的文件系統和存儲設備的驅動程序加載完畢。
而這個文件系統和存儲設備的驅動程序存在於引導HIVE中。
device.exe加載上述所說的文件系統驅動程序和存儲設備驅動程序,使之開始工作。之後device.exe處於等待狀態。
filesys.exe被喚醒,加載並且安裝系統HIVE。之後filesys.exe處於等待狀態。
nk.exe按照系統HIVE的信息開始執行初始化工作。其中包括加載驅動程序和啓動一些應用程序。
其中加載驅動程序一般由device.exe執行,而啓動應用程序由filesys.exe執行。這時device.exe和filesys.exe已經被喚醒。
因爲引導HIVE和系統HIVE肯定有重複的地方,所以可能出現重複加載了驅動程序或者重複啓動了應用程序。
爲此,CE允許在描述驅動程序的註冊表信息中加入防止重複的標誌,而應用程序可以採用事件對象來防止重複啓動,
如device.exe。
下面講述如何設置基於HIVE的註冊表,分基於硬盤和基於flash的2種情況
大家也可以看微軟的幫助.
情況1,基於硬盤的永久保存
在PB中加入"Hive-based Registry",如果是Geode平臺,再加入BSP_ENABLE_FSREGHIVE環境變量。
打開platform.reg,找到如下信息: ; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="Documents and Settings//system.hv"
"PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:0
IF BSP_ENABLE_FSREGHIVE
"Start DevMgr"=dword:1
ENDIF
; END HIVE BOOT SECTION
"SYSTEMHIVE"的值爲系統HIVE文件的路徑。
"Start DevMgr"是一個布爾值,指示是否開始就執行設備管理器device.exe,按照CE幫助文檔的說法,
只有想把系統HIVE存儲在對象存儲中才在此設置爲0,所以一般都要設置爲1。
如果是多用戶,可以在上述的註冊表位置下輸入"DefaultUser"="",指定默認的用戶名。如果是單用戶系統,可以不設置。
保證將包含系統HIVE的文件系統驅動程序的註冊表信息和存儲設備的驅動程序的註冊表信息被包含在
"; HIVE BOOT SECTION"和"; END HIVE BOOT SECTION"之間,在這兩個語句之間的註冊表數據全部屬於引導HIVE。
假如我們將系統HIVE文件system.hv存放在硬盤上,並採用FAT文件系統。
那麼就要將[HKEY_LOCAL_MACHINE/System/StorageManager/FATFS]和
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile]移動到"; HIVE BOOT SECTION"下。
在"; HIVE BOOT SECTION"和"; END HIVE BOOT SECTION"之間的所有驅動程序的註冊表信息中都加入下列一個標誌:
"Flags"=dword:1000
這個標誌是一個位掩碼,它可以和其它已經存在的"Flags"或運算。
值1000表示此驅動程序只加載一次,這樣device.exe就不會把當前驅動程序加載兩次了。
在包含系統HIVE的存儲設備的驅動程序的註冊表信息中,加入如下標誌(假設是硬盤):
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile]
"MountFlags"=dword:2
這個標誌表示這個存儲設備包含系統HIVE文件。
按照如上所述設置後的內核就能實現永久存儲註冊表數據了。對於保存註冊表數據的執行動作在此必須闡述清楚:
正常情況下,CE能夠保證重要的註冊表數據能夠從內存刷到(Flush)永久存儲器上。
但是這並不能完全保證所有數據都能完整地保存而不丟失,所以要保證萬無一失,
應該主動地調用RegFlushKey函數強制將內存中的數據刷到永久存儲器上。
這個函數的參數只有一個,就是註冊表分支。CE還增加一個註冊表項(如下所示),
它的作用是每當函數RegCloseKey被調用時都自動調用RegFlushKey函數。
[HKEY_LOCAL_MACHINE/init/BootVars]
"RegistryFlags"=dword:1
如果CE在啓動過程中發現系統HIVE出現錯誤,它會自動刪除文件並創建一個默認的系統HIVE文件,如果出現下面的註冊表項,說明發生了這種事情。 [HKEY_LOCAL_MACHINE]
"RegPersisted"=dword:1
2,基於Flash的
1.在 "File Systems and Data Store" -- "Registry Storage"內,
選擇 "Hive-based Registry" .然後其它的都不用修改了
fat文件系統也不用加.
2,修改platform.reg的部分
找到下面的,修改
修改地方一:
; @CESYSGEN IF FILESYS_FSREGHIVE
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="system.hv"
; "PROFILEDIR"="Documents and Settings" ;直接去掉了
"Start DevMgr"=dword:1 ;把0修改爲1
; END HIVE BOOT SECTION
; @CESYSGEN ENDIF FILESYS_FSREGHIVE
[HKEY_LOCAL_MACHINE/init/BootVars] ;增加的地方
"DefaultUser"="default" ;增加的地方
修改地方二:
;HIVE BOOT SECTION ;自己加的,不知道有沒有用
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/FlashDrv]
"DriverPath"="Drivers//BlockDevice//FlashDrv"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的
[HKEY_LOCAL_MACHINE/Drivers/BlockDevice/FlashDrv]
"Prefix"="DSK"
"Dll"="FLASHDRV.dll"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="FlashDrv"
"FriendlyName"="MS Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的
; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/FlashDrv]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:2 ;11 -> 2
"Folder"="ResidentFlash"
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:1000 ;自己加的
;END HIVE BOOT SECTION ;自己加的,不知道有沒有用
這樣就能用了,
心裏還有的疑問是:
微軟的幫助文檔說,
Set the following flag bit on each driver that is loaded during the first boot phase.
[HKEY_LOCAL_MACHINE/Drivers/...]
"Flags"=dword:1000
這個我沒有理會,當然在上面有關flash的地方我還是加了,在common.reg裏面很多地方都沒加
但是能用.
還有,我沒試上面的我加的
;HIVE BOOT SECTION
;END HIVE BOOT SECTION
本來的想法是,希望系統在加載註冊表前,先加載必要的驅動,但是我覺得前面加";"分號了,就應該
屏蔽掉了,不知道到底起作用了沒有,
具體在哪裏設置加載自己的註冊表前,應該加載哪些驅動.希望網友指教