WinCE 5.0 內核啓動過程(中文版)

WinCE 5.0 內核啓動過程(中文版) 2008-08-23 11:19

字號:    

WinCE 5.0 內核啓動過程(中文版)

本文簡單描述一下wince5.0內核的啓動流程,以mips cpu爲例。msdn有一篇文章叫做Microsoft Windows CE 5.0 Board support Package,Boot Loader,and Kernel Startup Sequence非常不錯,可以參考。

1. startup.首先,內核最先執行的代碼位於oal當中,叫做startup,這段代碼由微軟留給開發者定製。當然,各個參考bsp裏面都有現成的代碼,開發者只需在此基礎上改動。在startup()的末尾,會跳轉到kernelstart函數。

2. kernelstart. 位於WINCEROOT/Private/winceos/coreos/nk/kernel/mips/startup.s 這裏面是彙編代碼。是所有的mips開發板都要執行的操作。所以這裏面會根據不同cpu類型作判斷。雖然是彙編代碼,好在裏面還是有不少註釋,通過這些註釋,可以看出它裏面主要在幹什麼。

3. KernelRelocate. kernelstart在完成一些必要的初始化之後,會調用KernelRelocate函數,這是一個比較重要的函數,位於WINCEROOT/Private/winceos/coreos/nk/kernel/loader.c. 它會把kernel用到的數據copy的ram裏面。具體的功能msdn裏面有解釋。 這裏的ram就是在config.bib裏面指定的具有ram屬性的存儲區域,不是ramimage. kernelRelocate以pToc爲參數,那麼pToc的值從何而來呢?即便你搜索完所有的文件也找不到在那裏pToc被賦值。因爲pToc是在makeimage階段被romimage.exe賦值的,也就是說pToc並不是在代碼中被賦值的,是由外力(romimage.exe)改動nk.bin的內容賦值的。

4。MIPSInit.  KernelRelocate處理完成之後,MIPSInit會被調用。位於WINCEROOT/Private/winceos/coreos/nk/kernel/mips/mdsched.c.這裏是通用的mips的處理,其中會調用oal當中的OEMInitDebugSerial去初始化調試用的串口。

5。OEMInit。接下來就是大名鼎鼎的OEMInit了。這個函數由開發者定製。是c語言的。由上面的分析我們知道,在進入OEMInit的時候,串口已經初始化完畢,所以現在我們已經可以通過串口打印出一些調試信息了。而在此之前,我們只能通過led的方式作一些簡單的顯示。

6。KernelFindMemory. 位於WINCEROOT/Private/winceos/coreos/nk/kernel/loader.c
OEMInit返回之後調用該函數。這個函數主要是把ram劃分爲兩部分:object store和應用程序可以使用的部分。object store就是用於存貯wince的ram file system的,例如開機以後我們看到的/windows目錄就是位於ram file system.

7。KernelInit. 位於WINCEROOT/Private/winceos/coreos/nk/kernel/kwin32.c
這部分跟cpu無關,是kernel要完成自己的初始化。至此,kernel得初始化全部完成,可以開始線程調度。

還有一點需要說明的時,kernel在完成初始化之後,會以IOCTL_HAL_POSTINIT爲參數調用OEMIoControl,所以我們可以在這裏打印出一句話表明kernel已經初始化完成。

除了kernel本身(nk.exe)之外,第一個被創建的進程是誰呢,對,就是文件系統,filesys.exe.
雖然他不是kernel本身的一部分,但是如果沒有文件系統,wince也是玩不轉的,註冊表的初始化就是由文件系統來完成。

來自於:http://wogoyixikexie.blog.163.com/blog/static/88778624200872311197708/

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