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

來源:互聯網
上載者:User

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結構圖

  因為OAL層代碼大多數和CE啟動時系統初始化工作有關,所以本篇文章以CE的啟動順序為線索。其它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 先檢測這是一次冷啟動還是暖開機,如果是冷啟動,那麼初始化Object Storage Service記憶體地區。

  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檔案,安裝在Object Storage Service中的資料庫。

  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)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.