WinCE OAL架構分析

我個人認爲OAL應該是WinCE BSP中最爲重要的一個模塊了,簡單回顧一下,WinCE BSP由Bootloader,Drivers,OAL和配置文件組成。Bootloader一般指EBOOT,Drivers指一些需要的設備驅動,而OAL被稱爲OEM Adaption Layer,是WinCE操作系統和底層交互的中間層,其中很多WinCE的功能的支持,都是在OAL裏面實現。有人說OAL可大可小,一點不假,根據不同的需求,可以說是變化無窮,呵呵。


這裏主要介紹WinCE 6.0的OAL架構,它與WinCE5.0有些區別。不過我會對區別做個簡單介紹。

在WinCE5.0下面,OAL位於BSP_Name/SRC/Kernel目錄下面,其包含的目錄結構如下:

 /OAL:包含所有和硬件相關的OAL代碼,最後生成oal.lib。

 /Kern:包含oal.lib和會被內核用到的庫。

 /KernKitl:包含oal.lib,KITL和會被內核用到的庫

 /KernKitlProf:包含oal.lib,KITL,支持profiling的庫和會被內核用到的庫


在WinCE6.0下面,OAL位於BSP_Name/SRC/OAL目錄下面,其包含的目錄結構如下:

 /OALLIB:包含所有和硬件以及調試相關的OAL代碼,最後生成OAL.lib

 /OALEXE:包含oal.lib和被內核用到的庫

實際上在WinCE5.0下面有三個版本的kernel,如下:

 OAL + Kernel = kern.exe

 OAL + Kernel + KITL = kernkitl.exe

 OAL + Kernel + KITL +Profiler = kernkitlprof.exe


而在WinCE6.0下面OAL,KITL和Kernel被分別分開了,如下:

 OAL = oal.exe

 Kernel = kernel.dll

 KITL = kitl.dll

在WinCE5.0下,OAL和KITL被連接到kernel當中,而且會有三個不同的版本。而在WinCE6.0中,OAL,KITL和kernel都獨立成三個模塊oal.exe,kitl.dll和kernel.dll。一個最主要的原因是如果微軟每更新一次kernel,OEM都需要更新一次,並且要重新鏈接OAL產生一個新的kernel,然後再release。而在WinCE6.0下就不需要再鏈接OAL,而只是release一個新的kernel.dll就可以了。另一個好處就是在WinCE6.0中OAL,KITL和kernel分成三個模塊,彼此之間是通過標準的接口函數來訪問對方,這樣比較安全,而在WinCE5.0中,OAL被鏈接到Kernel的時候,導致一些未被描述過的內核函數也可以被調用,而調用這些函數是很不安全的。最後還有一個好處就是在WinCE5.0中,OAL,KITL和Kernel 只能是用一個Debug Zone,而在WinCE6.0中,由於它們彼此獨立,所以有各自的Debug Zone,可以分別調試,而且這爲以後的KITL動態加載打下了基礎,當然在WinCE6.0中還沒有實現。

說了半天,下面看一下WinCE6.0的OAL的架構,如圖:

 


kernel.dll:內核模塊以和OAL,KITL分開,其中OEMGlobal是一個由Oal模塊導出的數據結構,裏面包含了會被kernel調用的OAL函數和變量,在/public/common/oak/inc/oemglobal.h中有定義,如果kernel想訪問kitl.dll就會通過KITLIoctl接口來訪問。

kitl.dll:該模塊支持KITL功能,會直接訪問硬件,KITL可以基於USB,Ethernet或者是串口。有時候該模塊也會和kernel.dll和oal.exe交互,它會通過NKGlobal來訪問kernel模塊,通過OEMGlobal來訪問OAL模塊。

oal.exe:包含了支持硬件的相關庫,一般肯定會支持Startup,Cache,Interrupt,Timer和IOCTL幾個庫,RTC根據需要可選。OAL模塊訪問kernel模塊通過NKGlobal數據結構實現,在/public/common/oak/inc/nkglobal.h中定義。


應該說OEMGlobal和NKGlobal是兩個重要的數據結構,用於OAL和Kernel之間的交互,這兩個結構都有默認定義,分別在/private/winceos/coreos/nk/oemmain/oemglobal.c和/private/winceos/coreos/nk/kernel/nkglobal.c定義。他們會被編譯爲OEMMain.lib和NKMain.lib,而在BSP中的OAL應該鏈接OEMMain.lib庫並實現相應的OEM函數。


OAL實際上就是一個硬件的抽象層,WinCE的內核通過OAL來和硬件進行通信,應該說它並不包含硬件外設的驅動,而只是對基於處理器本身的硬件模塊的控制。如前面的圖所示,包含以下模塊:

Startup Library:實現了內核的啓動

Interrupt Library:支持WinCE的中斷處理

Cache Library:用於實現Cache功能

OS Timer Library:內核所需的定時器功能

RTC Library:實時時鐘功能

IOCTL Library:內核的輸入/輸出函數

上述模塊可以說是OAL中必須實現的,而OAL還可以包含更多的模塊來實現更多的功能,模塊如下:

Module Name
 Description
 
Boot Arguments
 支持引導參數傳入
 
Debug
 支持Debug功能,一般指串口打印
 
Flash
 實現Flash操作的功能
 
Interrupt Latency Timing
 支持ILTimer功能,可對ISR和IST的延時進行測試
 
Log
 實現Log功能
 
Power Management
 實現處理器級的電源管理功能
 
Profiler
 支持Profiler功能,從而對內核性能進行評測
 
Memory
 實現物理地址和虛擬地址之間的轉換
 
PCI
 實現內核中對PCI總線的支持
 

 

OAL中可支持的模塊很多,基本要實現的模塊有Startup,Interrupt,Timer,Debug和IOCTL等,而其他的一些模塊屬於根據自己的需要進行裁減的,所以說OAL可大可小。

由於在做BSP開發的時候,BSP都是Clone過來的,所以OAL已經存在,只是根據自己的平臺和需要來改相應的模塊或者添加新的模塊。前面提到WinCE5.0的OAL和WinCE6.0下的架構發生了變化,如果想從WinCE5.0升級到WinCE6.0,這裏有一個經典的視頻,推薦給大家:

http://channel9.msdn.com/posts/mikehall/Porting-a-CE-50-BSP-to-CE-60-Travis-Hobrla/

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/wirror800/archive/2009/04/13/4069906.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章