<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 電源與新能源 > WinCE中OEM適配層點(diǎn)滴之系統初始化

WinCE中OEM適配層點(diǎn)滴之系統初始化

——
作者:付林林 時(shí)間:2007-02-28 來(lái)源:天極網(wǎng) 收藏
OAL(OEM Adaptation Layer)既OEM 適配層,從邏輯上講位于Windows CE內核和硬件之間,從物理上講OAL各個(gè)模塊代碼被編譯后(.lib)和其它內核庫鏈接到一起形成Windows CE的內核可執行文件nk.exe。Windows CE內核在OAL層暴露了大量的函數和全局變量,利用這些函數和全局變量OEM可以編寫(xiě)中斷處理、RTC、電源管理、調試端口、通用I/O控制代碼等。圖1更直觀(guān)地描述了OAL的結構。CE安裝目錄的子目錄中包含了OAL的部分源碼,大多數情況下開(kāi)發(fā)者對OAL只要修改即可,甚至無(wú)需修改。通過(guò)閱讀本篇文章,開(kāi)發(fā)者能夠了解OAL的結構、暴露的接口的功能,可以在此基礎上實(shí)現甚至增強OAL的功能。


圖1 OAL結構圖

  因為OAL層代碼大多數和CE啟動(dòng)時(shí)系統初始化工作有關(guān),所以本篇文章以CE的啟動(dòng)順序為線(xiàn)索。其它OAL知識在下一篇文章中講解。

  一、在Boot Loader解壓CE內核鏡像文件(nk.bin)后開(kāi)始跳轉到StartUp(),StartUp函數屬于OAL層,此時(shí)CE操作系統內核還沒(méi)有運行。StartUp函數的功能主要有兩個(gè),一是初始化CPU為已知狀態(tài)(known state),二是調用內核初始化函數(x86平臺為KernelInitialize,其它平臺為KernelStart)。初始化CPU工作因CPU的不同而不同,如果是ARM系列,包括設置CPU為管理員模式、禁止IRQ和FIQ、禁止MMU、清空指令和數據緩沖、檢測啟動(dòng)原因、配置GPIO和內存控制器、初始化RTC、保存OEMAddressTable地址等。執行完畢后調用KernetStart。如果是x86系列,包括設置CPU為保護模式、初始化內存控制器、保存OEMAddressTable地址等。執行完畢后調用KernetInitialize。
 
  二、內核初始化函數的功能也因CPU的不同而不同,不過(guò)有一些功能是相同的,如初始化串口(為了輸出調試信息)、調用OEMInit函數等。對于x86系列,初始化工作除了上述的功能外還包括讀取OEMAddressTable內容、確定分頁(yè)大小、內核重定位、初始化中斷分配表、初始化分頁(yè)表、內存初始化和其它初始化。對于其它系列CPU請參考CE幫助文檔。

  1. 串口調試:

  串口調試函數包括OEMInitDebugSerial、OEMReadDebugByte、OEMWriteDebugByte等。從OEMInitDebugSerial的源碼可以看出,系統從BOOT_ARG_PTR_LOCATION為首地址的結構中判斷當前連接的串口是哪個(gè),然后配置這個(gè)串口。如果你的設備的串口I/O地址設置和CE默認的一致的話(huà),就能在CE內核得到CPU控制權到啟動(dòng)完畢這段時(shí)間里通過(guò)串口得到調試信息。

  2. OEMInit

  一般在OEMInit中初始化所有外圍的硬件、初始化系統時(shí)鐘(system tick)和RTC(real time clock)、初始化KITL(Kernel Independent Transport Layer)。例如I486平臺的OEMinit函數,它先關(guān)聯(lián)所有的IRQ和中斷ID,然后初始化PCI總線(xiàn)、網(wǎng)絡(luò )適配器、電源管理、PIC(可編程中斷控制器)、系統時(shí)鐘,最后檢測是否有擴展內存。另外如果OEM要通過(guò)OAL暴露的函數指針或者全局變量來(lái)增強功能的話(huà),就要在此函數中實(shí)現(在下面詳細講解)。

  3. 檢測擴展內存

  我們都知道在config.bib配置文件中設置CE系統使用RAM總量(如果不知道請參考我的文章Platform Builder之旅系列),注意這個(gè)RAM總量不是總的物理內存的大小。PB編譯的內核包含一個(gè)變量ulRAMEnd,將在config.bib中定義的RAM的起始地址 + RAM大小的和賦值給ulRAMEnd。在CE內核的啟動(dòng)過(guò)程中,ulRAMEnd的值賦值給全局變量MainMemoryEndAddress,CE內核通過(guò)訪(fǎng)問(wèn)MainMemoryEndAddress得到RAM的總量信息。假如基于CE的設備附加了RAM,而MainMemoryEndAddress的值沒(méi)有包括這段附加的RAM,結果CE內核無(wú)法知道已經(jīng)附加了RAM。為了讓CE內核了解附加RAM的信息,OEM應該編寫(xiě)一個(gè)函數檢測RAM的總量,并把總量值賦給MainMemoryEndAddress。OAL暴露了一個(gè)函數指針pNKEnumExtensionDRAM,OEM應該把編寫(xiě)好的函數地址賦給這個(gè)函數指針。如果OEM不準備自己編寫(xiě)內存檢測函數的話(huà)也可以調用OEMGetExtensionDRAM。從幫助文檔中看出OEMGetExtensionDRAM這個(gè)函數能夠檢測內存的總量,但是CE的針對X86 平臺的源碼中沒(méi)有具體編寫(xiě)這個(gè)函數的實(shí)現代碼(見(jiàn)%_WINCEROOT%PUBLICCOMMONOAKCSPI486OALcfwpc.c)。也就是說(shuō)在X86平臺上調用OEMGetExtensionDRAM是檢測不到RAM的。如果OEM有興趣編寫(xiě)檢測RAM總量的函數,可以調用現成的函數IsDRAM。這個(gè)函數也保存在cfwpc.c中。

  三、內核初始化函數執行完畢后開(kāi)始按如下步驟執行:

  1. 內核創(chuàng )建用于與filesys.exe同步的事件對象SYSTEM/FSReady,之后啟動(dòng)filesys.exe。啟動(dòng)filesys.exe的意義是讓filesys.exe讀取注冊表數據。

  2. 內核等待事件SYSTEM/FSReady被觸發(fā),這個(gè)事件是由filesys.exe在做完一系列工作后觸發(fā)。這一系列的工作內容如下:

  2.1 先檢測這是一次冷啟動(dòng)還是熱啟動(dòng),如果是冷啟動(dòng),那么初始化對象存儲內存區域。

  2.2 調用OEMIoControl函數,I/O控制代碼為IOCTL_HAL_INIT_RTC,也就是初始化RTC。

  2.3 初始化數據庫子系統和API、文件系統API、消息隊列API。

  2.4 如果操作系統鏡像(nk.bin)包括RAM文件系統,那么讀取Initobj.dat文件內容后創(chuàng )建一個(gè)RAM文件系統。

  2.5 初始化注冊表(在內存中形成注冊表)。

  2.6 如果此時(shí)device.exe沒(méi)有啟動(dòng),那么讀取HKEY_LOCAL_MACHINESystemStorageManager下“Dll”的值(這個(gè)值為存儲管理器所在的.dll的文件名)并加載到內存。加載之后創(chuàng )建一個(gè)線(xiàn)程專(zhuān)用于初始化存儲管理器,初始化之后此線(xiàn)程結束。

  2.7 初始化NLS(national language support)。關(guān)于NLS請參見(jiàn)我的文章《CE下中文輸入法編輯器》。

  2.8 為數據庫引擎設置本地ID。

  2.9 讀取Initdb.ini文件,安裝在對象存儲中的數據庫。

  2.10 觸發(fā)SYSTEM/FSReady事件,之后filesys.exe處于等待狀態(tài),等待內核發(fā)通知給它。

  3. 此時(shí)注冊表已經(jīng)存在于內存當中,內核開(kāi)始讀取如下位置數據:

HKEY_LOCAL_MACHINELoaderSystemPath

HKEY_LOCAL_MACHINESYSTEMOOMcbLow and cpLow

HKEY_LOCAL_MACHINESYSTEMKERNELInjectDLL

HKEY_LOCAL_MACHINEMUIEnable and SysLang

HKEY_CURRENT_USERMUICurLang


  4. 內核設置低內存處理(out of memory)。低內存處理是指當前可用的內存非常少時(shí),內核所做的解決方案(CE幫助文檔中有詳細說(shuō)明)。

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

  5.1 讀取HKEY_LOCAL_MACHINESystemEvents 下包含的所有事件對象名稱(chēng)并一一創(chuàng )建。

  5.2 讀取HKEY_LOCAL_MACHINEInit 下包括的所有應用程序名稱(chēng)并一一啟動(dòng)。如果device.exe在列表中并且此時(shí)它已經(jīng)啟動(dòng)了,那么觸發(fā)SYSTEM/BOOTPHASE2事件,這會(huì )使device.exe重新讀取注冊表數據來(lái)完成最后的驅動(dòng)程序初始化。

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

  



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>