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

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

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

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

評(píng)論