WinCE中OEM適配層點滴之系統初始化

2021-05-23 01:09:44 字數 3754 閱讀 7133

wince中oem適配層點滴之系統初始化

2010-04-18 22:27 by iameasy_man, 23 visits,

網摘,

收藏, 編輯

oal(oem adaptation layer)既oem 適配層,從邏輯上講位於windows ce核心和硬體之間,從物理上講oal各個模組**被編譯後(.lib)和其它核心庫鏈結到一起形成windows ce的核心可執行檔案nk.exe。windows ce核心在oal層暴露了大量的函式和全域性變數,利用這些函式和全域性變數oem可以編寫中斷處理、rtc、電源管理、除錯埠、通用i/o控制**等。圖1更直觀地描述了oal的結構。ce安裝目錄的子目錄中包含了oal的部分原始碼,大多數情況下開發者對oal只要修改即可,甚至無需修改。通過閱讀本篇文章,開發者能夠了解oal的結構、暴露的介面的功能,可以在此基礎上實現甚至增強oal的功能。

圖1 oal結構圖

一、在boot loader解壓ce核心映象檔案(nk.bin)後開始跳轉到startup(),startup函式屬於oal層,此時ce作業系統核心還沒有執行。startup函式的功能主要有兩個,一是初始化cpu為已知狀態(known state),二是呼叫核心初始化函式(x86平台為kernelinitialize,其它平台為kernelstart)。初始化cpu工作因cpu的不同而不同,如果是arm系列,包括設定cpu為管理員模式、禁止irq和fiq、禁止mmu、清空指令和資料緩衝、檢測啟動原因、配置gpio和記憶體控制器、初始化rtc、儲存oemaddresstable位址等。執行完畢後呼叫kernetstart。如果是x86系列,包括設定cpu為保護模式、初始化記憶體控制器、儲存oemaddresstable位址等。執行完畢後呼叫kernetinitialize。

二、核心初始化函式的功能也因cpu的不同而不同,不過有一些功能是相同的,如初始化串列埠(為了輸出除錯資訊)、呼叫oeminit函式等。對於x86系列,初始化工作除了上述的功能外還包括讀取oemaddresstable內容、確定分頁大小、核心重定位、初始化中斷分配表、初始化分頁表、記憶體初始化和其它初始化。對於其它系列cpu請參考ce幫助文件。

1. 串列埠除錯:

串列埠除錯函式包括oeminitdebugserial、oemreaddebugbyte、oemwritedebugbyte等。從oeminitdebugserial的原始碼可以看出,系統從boot_arg_ptr_location為首位址的結構中判斷當前連線的串列埠是哪個,然後配置這個串列埠。如果你的裝置的串列埠i/o位址設定和ce預設的一致的話,就能在ce核心得到cpu控制權到啟動完畢這段時間裡通過串列埠得到除錯資訊。

2. oeminit

一般在oeminit中初始化所有外圍的硬體、初始化系統時鐘(system tick)和rtc(real time clock)、初始化kitl(kernel independent transport layer)。例如i486平台的oeminit函式,它先關聯所有的irq和中斷id,然後初始化pci匯流排、網路介面卡、電源管理、pic(可程式設計中斷控制器)、系統時鐘,最後檢測是否有擴充套件記憶體。另外如果oem要通過oal暴露的函式指標或者全域性變數來增強功能的話,就要在此函式中實現(在下面詳細講解)。

3. 檢測擴充套件記憶體

我們都知道在config.bib配置檔案中設定ce系統使用ram總量(如果不知道請參考我的文章platform builder之旅系列),注意這個ram總量不是總的物理記憶體的大小。pb編譯的核心包含乙個變數ulramend,將在config.bib中定義的ram的起始位址 + ram大小的和賦值給ulramend。在ce核心的啟動過程中,ulramend的值賦值給全域性變數mainmemoryendaddress,ce核心通過訪問mainmemoryendaddress得到ram的總量資訊。假如基於ce的裝置附加了ram,而mainmemoryendaddress的值沒有包括這段附加的ram,結果ce核心無法知道已經附加了ram。為了讓ce核心了解附加ram的資訊,oem應該編寫乙個函式檢測ram的總量,並把總量值賦給mainmemoryendaddress。oal暴露了乙個函式指標pnkenumextensiondram,oem應該把編寫好的函式位址賦給這個函式指標。如果oem不準備自己編寫記憶體檢測函式的話也可以呼叫oemgetextensiondram。從幫助文件中看出oemgetextensiondram這個函式能夠檢測記憶體的總量,但是ce的針對x86 平台的原始碼中沒有具體編寫這個函式的實現**(見%_winceroot%/public/common/oak/csp/i486/oal/cfwpc.c)。也就是說在x86平台上呼叫oemgetextensiondram是檢測不到ram的。如果oem有興趣編寫檢測ram總量的函式,可以呼叫現成的函式isdram。這個函式也儲存在cfwpc.c中。

三、核心初始化函式執行完畢後開始按如下步驟執行:

1. 核心建立用於與filesys.exe同步的事件物件system/fsready,之後啟動filesys.exe。啟動filesys.exe的意義是讓filesys.exe讀取登錄檔資料。

2. 核心等待事件system/fsready被觸發,這個事件是由filesys.exe在做完一系列工作後觸發。這一系列的工作內容如下:

2.1 先檢測這是一次冷啟動還是熱啟動,如果是冷啟動,那麼初始化物件儲存記憶體區域。

2.2 呼叫oemiocontrol函式,i/o控制**為ioctl_hal_init_rtc,也就是初始化rtc。

2.3 初始化資料庫子系統和api、檔案系統api、訊息佇列api。

2.4 如果作業系統映象(nk.bin)包括ram檔案系統,那麼讀取initobj.dat檔案內容後建立乙個ram檔案系統。

2.5 初始化登錄檔(在記憶體中形成登錄檔)。

2.6 如果此時device.exe沒有啟動,那麼讀取hkey_local_machine/system/storagemanager下「dll」的值(這個值為儲存管理器所在的.dll的檔名)並載入到記憶體。載入之後建立乙個執行緒專用於初始化儲存管理器,初始化之後此執行緒結束。

2.7 初始化nls(national language support)。關於nls請參見我的文章《

ce下中文輸入法編輯器》。

2.8 為資料庫引擎設定本地id。

2.9 讀取initdb.ini檔案,安裝在物件儲存中的資料庫。

2.10 觸發system/fsready事件,之後filesys.exe處於等待狀態,等待核心發通知給它。

3. 此時登錄檔已經存在於記憶體當中,核心開始讀取如下位置資料:

hkey_local_machine/loader/systempath

hkey_local_machine/system/oom/cblow and cplow

hkey_local_machine/system/kernel/injectdll

hkey_local_machine/mui/enable and syslang

hkey_current_user/mui/curlang

4. 核心設定低記憶體處理(out of memory)。低記憶體處理是指當前可用的記憶體非常少時,核心所做的解決方案(ce幫助文件中有詳細說明)。

5. 核心在做好了上述工作後通知filesys.exe,由filesys.exe做其餘工作。filesys.exe所做的工作內容如下:

5.1 讀取hkey_local_machine/system/events 下包含的所有事件物件名稱並一一建立。

5.2 讀取hkey_local_machine/init 下包括的所有應用程式名稱並一一啟動。如果device.exe在列表中並且此時它已經啟動了,那麼觸發system/bootphase2事件,這會使device.exe重新讀取登錄檔資料來完成最後的驅動程式初始化。

5.3 初始化時間區域(time zone)。

JDK中的設計模式之介面卡模式

使用adapter模式的意圖是將乙個類的介面轉換成客戶希望的另外乙個介面。adapter模式使得原本由於介面不相容而不能在一起工作的那些類可以一起工作 在以下情況下比較適合使用adapter模式 1 當你想使用乙個已經存在的類,而它的介面不符合你的需求 2 你想建立乙個可以復用的類,該類可以與其他不...

php中的設計模式之 介面卡模式

介面卡模式 生活中的例子,給魅族mx2手機充電是,我們不能直接連上220v電源,需要220v 轉換器 模式中的角色 1 目標介面 target 客戶所期待的介面。目標可以是具體的或抽象的類,也可以是介面。我們需要220電源的充電介面 2 需要適配的類 adaptee 需要適配的類或適配者類。魅族手機...

生活中的設計模式之介面卡模式(一)

魯迅先生曾經說過,程式源自生活,而又高於生活,世界創造了萬物,我們創造了程式,在這之間一定存在某些相似點。所以我們可以通過觀察現實世界,來設計我們的虛擬世界 介面卡模式是傳說中的gof提出的二十三種設計模式的一種,他的適用範圍也比較廣,經常用到vo向po的轉換,或者專案對接時資料傳輸的型別匹配轉換等...