關於登錄檔在前面的文章中已經介紹過了,這裡只講述如何實現永久儲存登錄檔資料。
登錄檔型別分為基於物件儲存的登錄檔和基於hive的登錄檔,在定製核心的時候只能選擇其中一種。從理論上講這兩種登錄檔都能夠實現永久儲存登錄檔數 據,但是採用不同的型別會影響ce的啟動順序和啟動速度,還會影響記憶體的使用量。我還是趨向於採用基於hive的登錄檔來實現永久儲存登錄檔資料,這也是 乙個發展趨勢。在講解之前先簡單描述如果ce採用基於hive的登錄檔,那麼在啟動時如何載入已經儲存的登錄檔資料:
1、nk.exe執行,啟動filesys.exe。
2、filesys.exe載入引導hive,此時引導hive位於nk.bin解壓之後的檔案中。
3、filesys.exe啟動device.exe,之後處於等待狀態,等待device.exe將包含系統hive的檔案系統和儲存裝置的驅動程式載入完畢。而這個檔案系統和儲存裝置的驅動程式存在於引導hive中。
4、device.exe載入上述所說的檔案系統驅動程式和儲存裝置驅動程式,使之開始工作。之後device.exe處於等待狀態。
5、filesys.exe被喚醒,載入並且安裝系統hive。之後filesys.exe處於等待狀態。
6、nk.exe按照系統hive的資訊開始執行初始化工作。其中包括載入驅動程式和啟動一些應用程式。其中載入驅動程式一般由device.exe執行,而啟動應用程式由filesys.exe執行。這時device.exe和filesys.exe已經被喚醒。
因為引導hive和系統hive肯定有重複的地方,所以可能出現重複載入了驅動程式或者重複啟動了應用程式。為此,ce允許在描述驅動程式的登錄檔資訊中加入防止重複的標誌,而應用程式可以採用事件物件來防止重複啟動,如device.exe。
下面講述如何設定基於hive的登錄檔(假如儲存系統hive的是fat檔案系統):
1、在pb中加入"hive-based registry",如果是geode平台,再加入bsp_enable_fsreghive環境變數。
2、開啟platform.reg,找到如下資訊:
; hive boot section
[hkey_local_machineinitbootvars]
"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。
3、如果是多使用者,可以在上述的登錄檔位置下輸入"defaultuser"="",指定預設的使用者名稱。如果是單使用者系統,可以不設定。
4、保證將包含系統hive的檔案系統驅動程式的登錄檔資訊和儲存裝置的驅動程式的登錄檔資訊被包含在「; hive boot section」和「; end hive boot section」之間,在這兩個語句之間的登錄檔資料全部屬於引導hive。假如我們將系統hive檔案system.hv存放在硬碟上,並採用fat文 件系統。那麼就要將[hkey_local_machinesystemstoragemanage***tfs]和 [hkey_local_machinesystemstoragemanagerprofileshdprofile]移動到「; hive boot section」下。
5、在「; hive boot section」和「; end hive boot section」之間的所有驅動程式的登錄檔資訊中都加入下列乙個標誌:
"flags"=dword:1000
這個標誌是乙個位掩碼,它可以和其它已經存在的"flags"或運算。值1000表示此驅動程式只載入一次,這樣device.exe就不會把當前驅動程式載入兩次了。
6、在包含系統hive的儲存裝置的驅動程式的登錄檔資訊中,加入如下標誌(假設是硬碟):
[hkey_local_machinesystemstoragemanagerprofileshdprofile]
"mountflags"=dword:2
這個標誌表示這個儲存裝置包含系統hive檔案。
按照如上所述設定後的核心就能實現永久儲存登錄檔資料了。對於儲存登錄檔資料的執行動作在此必須闡述清楚:
正常情況下,ce能夠保證重要的登錄檔資料能夠從記憶體刷到(flush)永久儲存器上。但是這並不能完全保證所有資料都能完整地儲存而不丟失,所以要 保證萬無一失,應該主動地呼叫regflushkey函式強制將記憶體中的資料刷到永久儲存器上。這個函式的引數只有乙個,就是登錄檔分支。ce還增加乙個 登錄檔項(如下所示),它的作用是每當函式regclosekey被呼叫時都自動呼叫regflushkey函式。
[hkey_local_machineinitbootvars]
"registryflags"=dword:1
如果ce在啟動過程中發現系統hive出現錯誤,它會自動刪除檔案並建立乙個預設的系統hive檔案,如果出現下面的登錄檔項,說明發生了這種事情。
[hkey_local_machine]
"regpersisted"=dword:1
Platform Builder實踐之檔案系統方案
隨著ce的發展,物件儲存 object store 的作用越來越小,而大容量的永久儲存裝置被越來越多地採用,這一章將針對ce的檔案系統闡述相關的知識,讓pb開發者除了能夠加入對永久儲存裝置的支援,還能做一些優化。記得在以前講過的文章中提到了如何在pb中向定製的核心加入對硬碟 光碟機的支援 包括ata...
Platform Builder實踐之編譯
接上一章所說,當用pb的 定製平台嚮導 選取了乙個平台的所有特徵 feature 後,接下來的工作就是編譯了。即使你從來未曾編譯過,你也能想象得到編譯的時間一定很長。因為pb是在編譯乙個作業系統,而非乙個應用程式。當然,越快的硬體環境編譯的速度就越快。一般我編譯乙個核心需要5分鐘到10分鐘之間。在編...
Platform Builder實踐之檔案系統
隨著ce的發展,物件儲存 object store 的作用越來越小,而大容量的永久儲存裝置被越來越多地採用,這一章將針對ce的檔案系統闡述相關的知識,讓pb開發者除了能夠加入對永久儲存裝置的支援,還能做一些優化。記得在以前講過的文章中提到了如何在pb中向定製的核心加入對硬碟 光碟機的支援 包括ata...