活用註冊表讓Windows CE如虎添翼

來源:互聯網
上載者:User

文章轉自:http://space.itpub.net/12325938/viewspace-512072

Windows CE是微軟嵌入式裝置打造的作業系統,而嵌入式裝置可謂多種多樣,這就要求CE作業系統必須是可定製的,所以微軟將Windows CE設計為模組化的作業系統。說簡單點,我們可以把Windows CE想像成一盒積木,你可以用積木搭建出任何物體,但不一定要把所有的積木都用上。

  Windows CE介面長得很像普通PC上使用的Windows系統,讓人誤以為基於Windows CE的開發和普通Windows開發區別不大。很不幸,它們還是有非常多的區別,因為Windows CE是針對小型行動裝置,而這類裝置是千差萬別的。由於微軟只提供Windows CE 核心,它並不直接支援PC 的硬體,因此幾乎所有外部的硬體驅動都需要使用者根據所選擇的晶片來寫驅動程式,這給開發人員帶來了很大的麻煩。所以,開發人員必須瞭解目標裝置和部署應用程式的方式,例如註冊表是如何工作的就是其中之一。

1.什麼是Windows CE註冊表

  (1)什麼是Windows CE註冊表

在微軟的嵌入式作業系統Windows CE中,註冊表扮演著非常重要的角色。與案頭Windows一樣,Windows CE註冊表(Registry)也是一個系統資料庫,用來儲存應用程式、驅動程式、使用者的設定以及其它一些系統的配置資訊,通常還儲存著作業系統運作和調用程式的狀態資訊。它的結構與磁碟的邏輯結構相似,是採用樹形結構來管理配置資訊。例如,每個使用者的設定檔、安裝的應用程式以及每個應用程式可以建立的文件類型、檔案夾和應用程式圖示的屬性工作表設定、系統上存在哪些硬體以及正在使用哪些連接埠等。

  (2)註冊表的作用
  一般來說,註冊表控制所有應用程式和硬體外設的驅動,控制的方法是基於使用者和電腦的,而不依賴於應用程式或驅動本身。例如,每個註冊表的參數項控制一個使用者的功能或者電腦功能。在沒有註冊表的情況下,作業系統是不能獲得足夠的資訊來運行和控制外設、應用程式及正確響應使用者的輸入。

  對於外設來說,註冊表是一個記錄驅動設定和位置的資料庫。當作業系統需要存取硬體裝置時,它就需要使用外設驅動程式。但在Windows CE中這個外設驅動是獨立於作業系統的,所以作業系統需要知道從哪裡找到它們,例如檔案名稱、版本號碼、其它設定和資訊。因此,註冊表上沒有此裝置的記錄時,它們就不能被使用。

  對於應用程式來說,當一個使用者準備運行一個應用程式時,註冊表提供應用程式的資訊給作業系統,這樣應用程式就可以被找到。因為註冊表儲存了應用程式的預設資料和輔助檔案的位置資訊和其它可選項,同樣也儲存了其它的安裝資訊,安裝軟體的版本號碼,序號等。

  (3)註冊表的根鍵和函數
     Windows CE註冊表和其它Windows作業系統的註冊表概念和結構基本相同。例如Windows CE的註冊表限制有:鍵名最大長度255個字元、資料最大 4KB、子鍵深度最大值 16層。Windows CE支援四個根鍵,描述如下:HKEY_LOCAL_MACHINE,硬體和驅動配置資料;HKEY_CURRENT_USER,使用者配置資料;HKEY_CLASSES_ROOT,OLE和檔案類型匹配配置資料;HKEY_USERS,適用於所有使用者的資料。

  另外,Windows CE操作註冊表的函數有:開啟RegOpenKeyEx 和建立RegCreateKeyEx;讀RegQueryValueEx寫RegSetValueEx;枚舉入口或子鍵RegEnumValue、RegEnumKeyEx;刪除入口或子鍵RegDeleteValue、RegDeleteKey;關閉RegCloseKey等。

2.Windows CE註冊表的實現方式
       嵌入式系統的特點是小型化,因此一些嵌入式裝置是沒有外存的。為此Windows CE註冊表提供了兩種實現方式:基於RAM的註冊表(RAM-Based Registry)和基於Hive的註冊表(Hive-Based Registry)。在定製核心的時候只能選擇其中一種,從理論上講這兩種註冊表都能夠實現永久儲存註冊表資料。註冊表實作類別型對於使用者和應用程式來說是透明的,但是採用不同的類型會影響Windows CE的啟動順序和啟動速度,還會影響記憶體的使用量。

  (1)基於RAM的註冊表

     基於RAM的註冊表,也叫基於Object Storage Service(Object Storage)的註冊表。正如其名,基於RAM的註冊表把整個註冊表作為一個Object Storage Service堆存放在系統的記憶體中。這意味著如果對系統進行冷啟動或者系統斷電,對註冊表的所有改動都會丟失。優點是使用基於RAM的註冊表,對註冊表的讀寫訪問操作會變得非常高效。因此,基於RAM的註冊表比較適用於沒有外部儲存,而且有電池儲存記憶體資料(battery-backed RAM)的裝置,它適合頻繁暖開機而不冷啟動的裝置。

  如果有外存且經常冷啟動的裝置採用基於RAM的註冊表,則需要在系統斷電的時候對註冊表進行儲存,等系統再次啟動時再對儲存的註冊表進行還原。為此,Windows CE提供了兩種方法用來斷電儲存基於RAM的註冊表:

  ①第一種方式是在裝置關閉前調用RegCopyFile函數,將整個註冊表資料以檔案形式儲存到永久儲存空間上。Windows CE提供了兩個系統API用來儲存和還原整個註冊表。當要儲存和恢複註冊表時,先在系統斷電的時候調用RegCopyFile函數將整個註冊表儲存為外存上的一個檔案;當系統重新啟動時再調用RegRestoreFile函數將檔案全部讀出RAM中,然後再暖開機系統,先前儲存的註冊表就可以生效了。

  需要注意的是,這時必須多一次暖開機才能使恢複的註冊表有效。因為只有在系統啟動的時候才會去檢測RegRestoreFile放在RAM裡的註冊表資訊。但是此方法的缺點是需要兩次啟動,因此效率相對比較低。

  ②第二種方式是利用OEM函數。這一種方式可以避免前一種方式需要兩次啟動的缺點。OEM可以在BSP的OAL層中實現WriteRegistryToOEM和ReadRegistryFromOEM兩個函數。Windows CE會在系統啟動和關閉的時候自動調用這兩個函數來儲存和恢複註冊表。當應用程式調用RegFlushKey函數時,這個函數會調用WriteRegistryToOEM函數寫註冊表資料到永久儲存空間上。

  此種方法雖然可以避免兩次啟動的缺陷,但問題是在核心啟動時,調用ReadRegistryFromOEM之前檔案系統驅動程式還沒載入,因此無法使用CreateFile,ReadFile API來開啟、讀取檔案,而只能使用一些更底層的操作來實現。因此,建議如果要採用基於RAM的註冊表儲存機制,而且要求永久儲存註冊表資料,使用第一種方式比較容易實現。

  (2)基於Hive的註冊表
    基於Hive的註冊表是把註冊表資料存放在檔案系統的檔案上,這種檔案被稱作蜂箱Hive。這就意味著不再需要在系統斷電和啟動時進行儲存恢複註冊表操作。Hive是註冊表中的一組鍵,包括子鍵、索引值、資料,它是儲存或者載入註冊表資料的單位。

  Hive在檔案系統上表現為單個檔案,分為:①Boot Hive,包括HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有資料,一般只在啟動時使用。②System Hive,包括OEM的HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS的所有資料,是指裝置範圍內不隨著使用者改變而改變的資料。③User Hive,包括HKEY_CURRENT_USER的所有資料,是指使用者特有的設定,每個使用者都有一個單獨的User.hv。

  基於Hive的Windows CE註冊表載入過程可分為兩部分:boot.hv和system.hv。前者是啟動時的登錄機碼,後者是系統登錄機碼。所謂Hive註冊表就是先載入boot.hv,把註冊表儲存所在的儲存驅動和檔案系統先載入;然後再載入system.hv,也就是從磁碟上去讀系統的登錄機碼。在啟動時載入boot.hv的標籤是HIVE BOOT SECTION 和END BOOT SECTION。

  基於Hive的註冊表適用於有永久儲存並且需要經常冷啟動的裝置。因為基於Hive的註冊表把系統資料和使用者資料分開存放,這就意味著基於Hive的註冊表可以提供多使用者支援。例如,為對每個使用者提供不同的User.hv,當使用者登入時載入相應的User.hv,從而達到多使用者目的。ITPUB個人空間p reg.SW%_s3|
 

3.Windows CE載入註冊表的步驟

 Windows CE採用新的註冊表儲存技術,基於Hive的註冊表是讓人很興奮的事情。在這之前基於Windows CE的裝置,大多數採用給RAM供電方式來儲存註冊表資料,雖然也可以通過RegCopyFile函數永久儲存,但畢竟啟動時還要再暖開機一次。有了基於Hive的技術,啟動系統會自動載入資料,免去了暖開機的麻煩。而且當核心更新升級時,不用再擔心儲存在永久儲存空間上的系統HIVE檔案影響新的核心,因為系統會自動判斷並刪除過時的系統HIVE檔案。

  實際上,也可以認為只有擁有了這樣的技術,基於Windows CE的產品才算是一個真正的電腦。現在以基於Hive的註冊表為例,簡述Windows CE在啟動時是如何載入已儲存的註冊表資料:

  (1)nk.exe執行,啟動filesys.exe。filesys.exe首先載入Boot Hive,此時Boot Hive位於nk.bin解壓之後的文檔中。然後,filesys.exe啟動device.exe後處於等待狀態,等待device.exe將包含System Hive的文檔系統和存放裝置的驅動程式載入完畢,而這個文檔系統和存放裝置的驅動程式存在於Boot Hive中。

  (2)device.exe載入上述所說的文檔系統驅動和存放裝置驅動,使之開始工作。之後device.exe處於等待狀態。然後,filesys.exe再被喚醒,載入並且安裝System Hive,然後filesys.exe再次處於等待狀態。

  (3)nk.exe按照System Hive的資訊開始執行初始化工作,包括載入驅動和啟動一些應用程式。其中載入驅動一般由device.exe執行,而啟動應用程式由filesys.exe執行。這時device.exe和filesys.exe都被喚醒。

  因為Boot Hive和System Hive可能有重複的地方,所以可能重複載入了驅動或重複啟動了應用程式。為此,Windows CE允許在描述驅動程式的註冊表資訊中加入防止重複的標誌,而應用程式是採用事件對象來防止重複啟動。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.