Windows CE是微軟針對嵌入式領域推出的一款全新的操作系統(tǒng)。之所以說它是一款全新的操作系統(tǒng),是因為盡管Windows CE的UI非常接近其它的桌面版Windows操作系統(tǒng),但是它的內核完全是重新寫的,并不是任何一款桌面版Windows的精簡版本。 Windows CE是一種支持多種CPU架構的操作系統(tǒng),這其中包括ARM、x86、MIPS和SHx,極大地減輕了0EM開發(fā)過程中移植操作系統(tǒng)的工作量。
操作系統(tǒng)移植包含兩個層面上的工作:一個層面是CPU級的,另一個層面是板級的。CPU級的移植通常由微軟或芯片制造商來完成;板級移植則是由OEM來完成的。0AL正是0EM完成這一系統(tǒng)移植的工作核心!
1 OAL
OAL的全稱是OEM Adaption Layer,即原始設備制造商適配層。從邏輯結構上看,它位于操作系統(tǒng)的內核與硬件之間,是連接系統(tǒng)與硬件的樞紐;從功能上看,OAL頗似桌面機上的BIOS,具有初始化設備、引導操作系統(tǒng)以及抽象硬件功能等作用。與B10S不同的是,0AL隸屬于操作系統(tǒng),是操作系統(tǒng)的一部分。從存在方式上,講OAL是一組函數(shù)的集合體,這些函數(shù)體現(xiàn)出0AL的功能,如圖1所示。
2 最小化的OAL
OAL層的首要任務是加載內核。OAL層中為內核的啟動作種種鋪墊的函數(shù)的集合構成最小OAL層。我們可以由此深入0AL層,如圖2所示。
首先來看一下OS的啟動順序。
①CPU執(zhí)行引導向量,跳轉到硬件初始化代碼,即Startup函數(shù);
②在start up函數(shù)完成最小硬件環(huán)境初始化后跳轉到KernelStart函數(shù)(當CPU為x86架構時為Kernel Initial-ize函數(shù)),來對內核進行初始化;
③Kernelstart函數(shù)調用OEMInitDebugSerial完成對調試串口的初始化,調用0EMInit函數(shù)來完成硬件初始化工作以及設置時鐘、中斷,調用OEMGetExtensionDRAM函數(shù)來判斷是否還有另外一塊DRAM。
至此,內核加載完畢。由此可見,OS啟動的重中之重是Startup函數(shù)的正確加載。
2.1 Startup
Startup階段的特點是Kernel還沒有加載起來,調試工作比較困難。StartuP函數(shù)的兩大核心任務分別是把CPU初始化到一已知狀態(tài)和調用內核初始化函數(shù)來初始化內核。以下是Startup函數(shù)中通常包含的內容:①把處理器置為監(jiān)控模式;②禁止CPU的IRQ和FIQ輸入:③禁止內存管理單元MMU和指令、數(shù)據(jù)Cache;④刷新指令和數(shù)據(jù)Cache、TLB、清空寫buffr;⑤確定啟動的原因一hard reset,wake from sleep,GPIO reset,Watchdog reset,eboot handoff;⑥根據(jù)目標板需要配置GPIO,比如連接LED的GPIO;⑦配置內存管理器,設置刷新頻率,使能時鐘;⑧配置中斷控制器;⑨初始化實時時鐘(RTC)為0,使能實時時鐘:⑩設置電源管理寄存器;⑾打開所有板級時鐘和片內外部時鐘;⑿取得OEMAddressTable的物理基地址并把它存在r0中;⒀跳轉到KernelStart。
Bootloader和OAL中均包含Startup函數(shù)。它的功能大致相同,都是要初始化最小硬件環(huán)境。Bootloader是在為自己的執(zhí)行準備硬件環(huán)境,OAL則是為kernel的執(zhí)行準備硬件環(huán)境。由于這兩種硬件環(huán)境要求基本相同,所以它們的代碼也有很大部分可以相互借鑒。但應該明白,Bootloader與OAL在物理上是獨立的,它們并不是同一段代碼。而且,如果可以確定這一硬件部分Bootloader已經初始化過,則在OAL中不必重復。當然,前提是每次加載都要經過Bootloader這一環(huán)節(jié)。最典型的例子就是x86 OAL中的Startup,見例程:
2.2 Kernel Start
Kernel Start主要完成內核的最小初始化并且通過調用OEMInit函數(shù)來完成板級硬件初始化。以下是ARM內核初始化過程:① 初始化一級頁表;②使能MMU和cache;③為每種工作模式使能棧(stack); ④重新定位內核;⑤執(zhí)行串口調試函數(shù);⑥調用OEMInit;⑦初始化內存;⑧執(zhí)行其它初始化。
KernelStart中用到的三個函數(shù)OEMInit ()、OEMInitDebugSerial()和OEMGetExtensionDRAM()中,OEMInit()硬件相關性較大,也最重要。(1)OEMlnit() 0EMInit的最小任務是初始化其它硬件和注冊系統(tǒng)時鐘。通常OEMInit應該完成以下工作。①通過設置以下值來設置中斷映射表一SYSINTR→IRQ和IRQ→SYSINTR。②在中斷映射表中設置靜態(tài)中斷映射。③設置KITL,但在最小化的OAL層中通常不包括KITL。④用Init Clock配置系統(tǒng)定時器、實時時鐘、時鐘。⑤確定系統(tǒng)時鐘的中斷源。⑥初始化內核時間粒度為1ms。⑦配置中斷控制器或可編程中斷控制器(PICS)。⑧提供調試用LED指示燈。⑨置pWriteDedugLED=OEMWriteDedugLED。⑩調用HookInterrupt函數(shù)來注冊中斷服務例程ISRs,以下示例說明如何處理TIMERISR硬件中斷5的中斷服務例程:
(2)串口調試函數(shù)
有限的調試手段是0S移植人員經常遇到的難題。串口調試函數(shù)雖然不像以太網口調試函數(shù)那樣功能強大,但仍然要比LED指示燈或數(shù)碼管要直觀得多,是調試OAL層代碼不可或缺的一組工具。這個函數(shù)組由四個函數(shù)組成,分別是0 E M I n i t D e b u g S e r i a l()、OEMReadDebugByte()、OEMWriteDebugByte()和OEMWriteDebugString()。
◇OEMInitDebugSerial()用于配置串口;
◇OEMReadDebugByte0和OEMWriteDebugByte()用于向串口讀寫一個字節(jié);
◇OEMWriteDebugString()用于向串口寫一個調試用字符串。
KernelStart中調用的是OEMInitDebugSerial(),完成串口初始化,為串口調試工作作好準備。
(3)OEMGetExtensionDRAM()
在最簡最小化OAL層函數(shù)中,OEMGetExtensionDRAM()并不是一個必需的函數(shù)。OEMGetExtensionDRAM()的主要功能是查詢是否存在另外一片DRAM.如果目標板上只有一片DRAM,則該函數(shù)返回FALSE。但在KernelStart通常都包含此函數(shù)。至此,最小的OAL層已經完畢,kernel的最基本的功能可以正常使用。骨架搭起,第一階段的任務告一段落,但是很多非常重要的功能還不完整,還不能做到物盡其用。于是需要進一步加強OAL層的功能。這種做法也是OAL層開發(fā)通常使用的方法。先完成基本功能,在基本功能確保正確無誤后,逐漸加入其它功能。循序漸進,即使出錯也很容易找到出錯的地方,便于排查。
3 加強OAL
第二階段主要目的是充分利用板上硬件資源和加強調試手段。主要包括中斷、KITL、以太網口調試函數(shù)和OEMIOControl四方面內容。我們把包含這四方面內容的OAL層稱為加強OAL。
3.1 中 斷
外設硬件與CPU的數(shù)據(jù)交換基本上是異步進行的、最常用的中斷形式。CE的中斷處理順序如圖3所示。由圖3可知,CE的中斷實際上是由兩部分ISR和IST組成的。其中IST包含在驅動程序中,而ISR包含在OAL層中。所以,要想支持一個硬件,首先必須從0AL層為其作好準備。這個準備用兩步完成。
①創(chuàng)建中斷標識符。下面代碼節(jié)選自SAMSUNG2410的oalintr.h。中斷映射表通常位于\Platform\\INC。#define SYSINTR USB (SYSlNTR FIRMWARE+11)#define SYSINTR USBD (SYSlNTR_FIRMWARE+12)
② 創(chuàng)建并注冊ISR。ISR的主要任務是返回中斷標識符。ISR代碼通常位于\Platform\\KERNEL\HAL下。下面代碼節(jié)選自SAMSUNG2410的armint.c。
在中斷處理中,還有三個函數(shù)也起著至關重要的作用。它是OEMInterruptEnable()、OEMInterruptDisable()和OEMInterruptDone()。
◇OEMInterruptEnable()用于執(zhí)行允許設備產生中斷的硬件操作;
◇OEMInterruptDisable()禁止設備發(fā)出中斷申請;
◇OEMInterruptDone()中斷處理結束。
3.2 以太網口調試函數(shù)
以太網口調試函數(shù)與串口調試函數(shù)相比,具有更快的速度。
◇OEMEthInit 初始化以太網調試口;
◇OEMEthEnableInts開以太網適配器中斷;
◇OEMEthDisableInts關以太網適配器中斷;
◇OEMEthISR 以太網適配器中斷服務例程;
◇OEMEthGetFrame從以太網調試口收數(shù)據(jù);
◇OEMEthSendFrame從以太網調試口發(fā)數(shù)據(jù);
◇OEMEthQueryClientlnfo獲取平臺相關信息;
◇OEMEthGetSecs 返回從某一特定時間開始的計時值。本函數(shù)用于處理超時。
3.3 KITL
KITL全稱為Kernel Independent TransportLayer。它的主要用途是提供更方便的調試手段,如圖4所示。KITL出現(xiàn)在Windows CE.net之后,把軟件傳輸協(xié)議與硬件傳輸層隔離開。KITL使得開發(fā)者不必了解硬件傳輸層如何與軟件協(xié)議層接口。
以下是應該在OEMInit函數(shù)中加入的KITL初始化代碼。
①初始化所有PCI橋和設備,枚舉它們并且給它們分配資源,然后使能,使他們能正常工作。注:此條適于有KITL網絡接口卡(NIC)和NIC橋的情況。
② 對相關總線進行初始化,使得CPU能夠正確識別NIC。
③通過調用KitlInit函數(shù)來初始化KITL。這部分代碼可參照其它平臺,代碼文件為Halkitl.c。
④執(zhí)行0EMKitlInit函數(shù),進行相關的硬件初始化工作。搜索是否存在KITL 網口、串口或并口連接。
⑤執(zhí)行完OEMKitlInit后,把Kitl.1ib和Kitleth.1ib包含入平臺資源文件\\Kernel\Buildexe\Kernkitl,以便把KITL打包進內核。有關KITL的其它函數(shù)請參考微軟MSDN。
3.4 OEMIOControl
OEMIOContr01在OAL層是一個非常重要的函數(shù),應用程序是通過調用KernelIoContrOI來調用OEMl0Control的。內核對許多硬件平臺信息的獲得都要通過對它的調用來實現(xiàn)。此外,0EMl0Contr0I還是用戶模式應用代碼到內核模式OAL代碼之間的轉換入口。這就是說,用在用戶模式下通過調用0EMl0Control可以獲得內核模式的權力。0EMIOControl函數(shù)原型如下:
硬件資源利用和調試手段的加強大大豐富了OAL的功能,但是嵌入式系統(tǒng)通常會面臨的功耗問題和由于網絡功能的日益普及而帶來的安全性問題并沒有涉及到。
4 完整OAL
完整OAL是指在加強OAL的基礎上擴充了功耗和安全性驗證的OAL。所以這一階段的主要工作集中在電源管理與模塊認證兩部分。
4.1 電源管理
OAL層的電源管理與驅動程序的電源管理頗為不同。一種設備驅動程序僅負責某種特定的設備,如果可能,則把這種設備置為省電模式,當形勢需要時再把設備置為滿載荷模式。OAL層的電源管理則是負責整個系統(tǒng)功耗管理。例如,調度器在下一個25ms沒有線程要運行時,系統(tǒng)將被置為省電模式。
電源管理函數(shù)響應關閉系統(tǒng)和使系統(tǒng)空閑的系統(tǒng)調用。這些系統(tǒng)調用可能是軟觸發(fā)也可能是硬觸發(fā)。以下兩個函數(shù)是須在OAL層中實現(xiàn)的電源管理函數(shù):
◇0EMIdle一一把設備置為空閑狀態(tài),此時系統(tǒng)處于低功耗狀態(tài);
◇0EMPoweroff一一把設備置為斷電狀態(tài);
◇OEMPowerOff和OEMIdle的程序代碼可在如下目錄中參照例程%_WINCER00T%\Platform\\Kerlael\Hal。
4.2 模塊認證
自從Windows CE 3.0以來,在RAM中加載和運行模塊前,內核可以對其進行授權核查。對于在ROM中運行的模塊則不需要此過程。模塊認證實際上是在被加載的模塊后添加一數(shù)字簽名,只有當系統(tǒng)用公開密鑰驗證數(shù)字簽名通過后,該模塊才可以被加載到RAM中運行。這樣系統(tǒng)可以阻止或限制一些模塊的運行,達到系統(tǒng)安全的目的。要達到以上目的須完成以下兩個函數(shù):
◇OEMCertifyModuleInit,用于初始化驗證過程,每驗 證一個模塊調用一次;
◇OEMCertifyM0dule,用于驗證數(shù)字簽名。
為了支持這兩個函數(shù),在OEMInit函數(shù)中須分配兩個全局變量pOEMLoadInit和p0EMLoadModule,用來存放這兩個函數(shù)的地址。
結語
Windows CE的OAL層是一個復雜的函數(shù)集。它的復雜性不但體現(xiàn)在包含函數(shù)數(shù)目繁多,而且體現(xiàn)在很多函數(shù)的硬件相關性非常大。本文并沒有詳細講解每個OAL層函數(shù),而是就一些通常會遇到的OAL層函數(shù)進行層層劃分;在說明OAL層的功能和結構的同時,提出開發(fā)OAL的一種方法和思路。
責任編輯:gt
-
WINDOWS
+關注
關注
4文章
3610瀏覽量
91197 -
操作系統(tǒng)
+關注
關注
37文章
7122瀏覽量
125290
發(fā)布評論請先 登錄
嵌入式操作系統(tǒng)Windows CE研究
Windows Embedded 操作系統(tǒng)
Windows CE模塊和組件概述
高端ARM開發(fā)平臺在Windows CE操作系統(tǒng)能實現(xiàn)什么功能?
Windows XP操作系統(tǒng) ppt課件
Windows CE OAL 層的結構與開發(fā)
嵌入式操作系統(tǒng)Windows CE的研究
什么是Windows CE,LynxOS是什么操作系統(tǒng)
Windows CE的OAL層開發(fā)

Windows CE OAL層的結構與開發(fā)
Windows CENET操作系統(tǒng)的架構
Windows CE操作系統(tǒng)體系結構及功能介紹

Windows CE操作系統(tǒng)在工業(yè)控制領域的應用
基于S3C2410處理器對Windows CE 5.0操作系統(tǒng)實現(xiàn)BSP移植

Windows CE.net操作系統(tǒng)的內核定制

評論