簡介基于Windows CE下的注冊表
出處:互聯(lián)網(wǎng) 發(fā)布于:2011-09-04 14:37:31
引言:
Windows CE作為一種嵌入式的操作系統(tǒng),已經(jīng)有了10多年的歷史,從早的1.0版本到如今的的6.0版本。Windows CE已經(jīng)在嵌入式操作系統(tǒng)領域占據(jù)了非常重要的地位,同時還派生出了很多不同的版本,應用到不同的領域,Windows Mobilej就是其中非常成功的一個版本。
作為一種嵌入式操作系統(tǒng),我們有必要了解它的啟動過程和加載機制,特別是其中的注冊表加載是系統(tǒng)加載的。Windows CE內核創(chuàng)建過程用的REG文件幾乎和其他桌面版本W(wǎng)indows操作系統(tǒng)就有相同的格式,只是去掉了文件頂部的版本標記,防止開發(fā)者錯誤的將Windows CE的注冊表信息添加到主機的注冊表系統(tǒng)里,造成系統(tǒng)的故障。
1、 Windows CE注冊表簡介:
與其他桌面版本W(wǎng)indows一樣,Windows CE也使用注冊表(Registry)來保存應用程序、驅動程序和用戶的設定以及其他一些配置信息。 Windows CE注冊表也采用樹形結構來管理配置信息。
Windows CE支持四個根鍵,描述如下:
鍵名描述
HKEY_LOCAL_MACHINE 硬件和驅動配置數(shù)據(jù)
HKEY_CURRENT_USER 用戶配置數(shù)據(jù)
HKEY_CLASSES_ROOT OLE 文件類型匹配配置數(shù)據(jù)
HKEY_USERS 適用于所有用戶的數(shù)據(jù)
由于嵌入式系統(tǒng)的特點,一些嵌入式設備是沒有外存的。因此Windows CE的注冊表提供了兩種實現(xiàn)方式:基于RAM的注冊表(RAM-Based Registry)和基于Hive的注冊表(Hive-Based Registry)。我們可以選擇在Windows CE中使用任何一種注冊表,注冊表類型對于用戶和應用程序來說是透明的。
2、 Windows CE注冊表的類型和加載過程
由于嵌入式系統(tǒng)的特點,一些嵌入式設備是沒有外部存存儲設備。因此Windows CE的注冊表提供了兩種實現(xiàn)方式:基于RAM的注冊表(RAM- Based Registry)和基于Hive的注冊表(Hive-Based Registry)。我們可以選擇在Windows CE中使用任何一種注冊表,通常在我們的ARM嵌入式系統(tǒng)中會選擇Flash作為外部存儲設備,所以我們選擇基于Hive的注冊表類型。下面我們分析一下Windows CE注冊表的加載過程:
如圖
nk.exe執(zhí)行,啟動filesys.exe。
filesys.exe加載引導HIVE,此時引導HIVE位于nk.bin解壓之后的文件中。
filesys.exe啟動device.exe,之后處于等待狀態(tài),等待device.exe將包含系統(tǒng)HIVE的文件系統(tǒng)和存儲設備的驅動程序加載完畢。而這個文件系統(tǒng)和存儲設備的驅動程序存在于引導HIVE中。device.exe加載上述所說的文件系統(tǒng)驅動程序和存儲設備驅動程序,使之開始工作。之后device.exe處于等待狀態(tài)。filesys.exe被喚醒,加載并且安裝系統(tǒng)HIVE。之后filesys.exe處于等待狀態(tài)。nk.exe按照系統(tǒng)HIVE的信息開始執(zhí)行初始化工作。其中包括加載驅動程序和啟動一些應用程序。其中加載驅動程序一般由device.exe執(zhí)行,而啟動應用程序由filesys.exe執(zhí)行。這時device.exe和filesys.exe已經(jīng)被喚醒。
3 基于RAM的注冊表
正如其名,基于RAM的注冊表把整個注冊表作為一個對象存儲堆存放在系統(tǒng)的內存中。這意味著如果對系統(tǒng)進行冷啟動或者系統(tǒng)斷電,對注冊表的所有改動都會丟失。
如果使用基于RAM的注冊表,對注冊表的讀寫訪問操作會變得非常高效。因此基于RAM的注冊表比較適用于沒有外部存儲,而且有電池保存內存數(shù)據(jù)(battery-backed RAM)的設備。如果有外存且經(jīng)常冷啟動的設備采用基于RAM的注冊表,則需要在系統(tǒng)斷電的時候對注冊表進行保存,等系統(tǒng)再次啟動時對保存的注冊表進行還原。
Windows CE提供了兩種方法用來斷電保存基于RAM的注冊表:
1. Windows CE提供了兩個系統(tǒng)API用來保存和還原整個注冊表,它們的原形如下:
BOOL RegCopyFile(
LPCWSTR lpszFile // 保存注冊表信息的文件的名字
?。?;
BOOL RegRestoreFile(
LPCWSTR lpszFile // 保存注冊表信息的文件的名字
);
如果要保存和恢復注冊表,我們只需要在系統(tǒng)斷電的時候調用RegCopyFile函數(shù)將整個注冊表保存為外存上的一個文件。當系統(tǒng)重新啟動時,我們再調用RegRestoreFile函數(shù)將文件全部讀出RAM中,然后再熱啟動系統(tǒng),我們保存得注冊表就可以生效了。值得注意的是這次熱啟動是必須的,因為只有在系統(tǒng)啟動的時候才會去檢測RegRestoreFile放在RAM里的注冊表信息。這種方法的優(yōu)點是完全可以使用應用程序來實現(xiàn)基于RAM的注冊表的保存,而且這種方法相對簡單。但是此方法的缺點是需要兩次啟動。因此效率相對比較低。
2. 第二種方法需要OEM的參與,OEM可以在BSP的OAL層中實現(xiàn)WriteRegistryToOEM和ReadRegistryFromOEM兩個函數(shù),它們的聲明為:
DWORD ReadRegistryFromOEM(
DWORD dwFlags, // 參數(shù), REG_READ_BYTES_START表示讀新的注冊表
LPBYTE lpData, // 指向注冊表數(shù)據(jù)的緩沖區(qū),由OS分配
DWORD cbData // 緩沖區(qū)的大小
);
BOOL WriteRegistryToOEM(
DWORD dwFlags, // 參數(shù),REG_WRITE_BYTES_START表示寫新的注冊表
LPBYTE lpData, // 指向注冊表數(shù)據(jù)的緩沖區(qū),由OS分配
DWORD cbData // 緩沖區(qū)的大小,0表示到達注冊表尾部
?。?;
Windows CE會在系統(tǒng)啟動和關閉的時候調用這兩個函數(shù)來保存和恢復注冊表。此種方法雖然可以避免兩次啟動,但是困難的地方是ReadRegistryFromOEM函數(shù)的實現(xiàn)比較困難,因為在系統(tǒng)啟動的時候,塊設備驅動和文件系統(tǒng)的驅動都還沒有加載,因此不能使用CreateFile,ReadFile這樣的文件系統(tǒng)API來實現(xiàn)ReadRegistryFromOEM函數(shù),只能使用一些更底層的操作來實現(xiàn)。
3 設置基于HIVE的注冊表
在PB中加入"Hive-based Registry",實驗平臺:CPU:S3C2410;外部存儲設備(Flash)K9F1208UOM 打開%BSP%/Files/platform.reg,找到如下信息:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
"SystemHIVE"="system.hv"
; "PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:1
"RegistryFlags"=dword:1
[HKEY_LOCAL_MACHINE\init\BootVars]
"DefaultUser"="default" "SYSTEMHIVE"的值為系統(tǒng)HIVE文件的路徑。"Start DevMgr"是一個布爾值,指示是否開始就執(zhí)行設備管理器device.exe,只有想把系統(tǒng)HIVE存儲在對象存儲中才在此設置為0,所以這里我們要設置為1??梢栽谏鲜龅淖员砦恢孟螺斎?DefaultUser"="",指定默認的用戶名。如果是單用戶系統(tǒng),可以不設置在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間的所有驅動程序的注冊表信息中都加入下列一個標志:
"Flags"=dword:1000
這個標志是一個位掩碼,它可以和其它已經(jīng)存在的"Flags"或運算。值1000表示此驅動程序只加載,這樣device.exe就不會把當前驅動程序加載兩次了。
保證將包含系統(tǒng)HIVE的文件系統(tǒng)驅動程序的注冊表信息和存儲設備的驅動程序的注冊表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間,在這兩個語句之間的注冊表數(shù)據(jù)全部屬于引導HIVE。
[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" //調用Flash驅動
"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" //建立BINFS文件系統(tǒng)
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:2
"Folder"="MYFlashDisk" //實現(xiàn)可以讀寫的文件夾
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:1000
上面的信息添加到platform.reg的“HIVE BOOT SECTION”和“END HIVE BOOT SECTION”之間, 其中"Folder"="MYFlashDisk"文件實現(xiàn)可以讀寫文件目錄MYFlashDisk
注冊表信息被保存到此文件夾,系統(tǒng)冷啟動后會到此文件夾下讀取上次用戶基于注冊表的設置。
需要源碼可以訪問www.bluemcu.com
結語:
本文討論了Windows CE基于HIVE的注冊表的在線修改和保存,分析了Windows CE注冊表的加載過程,完善了嵌入式系統(tǒng)實際應用中的問題,使得目前的Windows CE運行版本更加接近與桌面版Windows系統(tǒng)。希望能帶給讀者一些幫助。
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://www.udpf.com.cn,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內容、版權等問題,請在作品發(fā)表之日起一周內與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎知識2025/7/14 16:59:04
- 獨立 ADC 優(yōu)勢大揭秘:為何不可替代?2025/7/7 16:21:04
- 深入剖析:嵌入式中 RS485、RS422 和 RS232 的特點差異2025/7/5 15:07:54
- 揭秘嵌入式 MCU:浮點數(shù)據(jù)處理難點及應對策略2025/6/20 15:19:07









