如圖2,第一階段的執行流程使用的是上圖的左邊的源檔案中的那些函數(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二階段執行流程使用的是上圖中右邊源檔案中的那些函數(sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具體解釋:
第一階段:
romInit.s:romInit()
Ø 系統上電之後,首先調用的函數就是romInit()
Ø 禁止中斷
Ø 把啟動類型(冷啟動/熱啟動)放在堆棧上
Ø 清除cache
Ø 初始化CPU基本寄存器,調用SDRAM初始化函數初始化UPM
Ø 直接跳轉到bootInit.c:romStart()
bootInit.c:romStart()
Ø 把代碼段和資料段從bootrom複制到RAM當中
Ø 完成程式映象的解壓縮(如果映象是壓縮版本的)
Ø 跳轉到bootConfig.c:usrInit()
bootConfig.c:usrInit()
Ø VxWorks OS中第一個C語言完成的代碼。執行作業系統核心所必須的初始化程式。
Ø Cache程式庫的初始化
Ø 清零系統的BSS段
Ø 初始化中斷向量表
Ø 使硬體工作在一個“安靜”的狀态,盡量不産生各種中斷或者異常
Ø 控制權移交給KernelInit(),産生usrRoot根任務
Ø 在usrRoot根任務中解析Bootline,産生bootCmdLoop任務,用于啟動、加載VxWorks映像<b></b>
/target/config/all/bootConfig.c是Boot ROM設定子產品,用于加載VxWorks image。執行流程為:
usrRoot()----&gt;bootCmdLoop(void)指令行選擇,或autobooting----&gt;bootLoad(pLine, &entry)加載子產品到記憶體(網絡、TFFS、TSFS...)----&gt;netifAttach()----&gt;go(entry)----&gt;(entry)()從入口開始執行,不傳回。<b></b>
第二階段:
bootConfig.c: bootLoad( )
Ø 加載VxWorks映像,并轉向它的加載位址,從sysInit入口開始執行VxWorks映像
sysALib.s: sysInit( )
Ø 與romInit.s : romInit()的初始化過程類似,但不再初始化Memory(DRAM和Memory控制器通常初始化一次)
usrConfig.c: usrInit( )
Ø 設定cache的工作模式,闆級硬體初始化,初始化Wind核心,啟動usrRoot( )根任務
usrConfig.c: usrRoot( )
Ø 初始化記憶體,系統時鐘,I/O系統,标準輸入輸出錯,異常處理,添加使用者應用程式。
<b>ROM-based Images</b><b>(壓縮/</b><b>沒有壓縮)</b>
和上面那種啟動方式相比,這種啟動方式省去了一些步驟,執行完romStart()之後就已經加載VxWorks 到RAM中了,是以,下一步就是把控制權交給VxWorks,由VxWorks從sysInit()開始執行即可。下面是具體的流程:
<a href="http://21cnbao.blog.51cto.com/attachment/200903/3/109393_123610002932G6.jpg"></a>
bootInit.c: romStart()
Ø 把代碼段(如果是VxWorks_romResident映像,則不拷貝代碼段)和資料段從bootrom複制到RAM當中
Ø 跳轉到sysALib.s: sysInit()
sysALib.s: sysInit()
Ø 重新進行CPU核心(主要是cache)的初始化,這些工作在romInit.s:romInit()中曾經進行
Ø 是RAM中運作的第一段代碼
Ø 跳轉到usrConfig.c: usrInit()
usrConfig.c: usrInit()
Ø VxWorks 中第一個C語言完成的代碼。執行作業系統核心所必須的初始化程式。
<b>ROM-Resident Images</b><b>:</b>
這種映像的加載和上一種是基本相同的,其執行順序為:
檔案romInit.s中的romInit()----&gt;檔案bootInit.c中的romStart()----&gt;檔案usrConfig.c中的usrInit()----&gt;sysHwInit()----&gt;usrKernelInit()----&gt;KernelInit(usrRoot,...)。
usrRoot()任務的主要功能包括:
Ø 初始化記憶體分區表(memory partition library)
Ø 初始化系統時鐘(system clock)
Ø 初始化輸入輸出系統(I/O system)----可選
Ø Create devices----可選
Ø 設定網絡(Configure network)----可選
Ø 激活WDB目标通信(Activate WDB agent)----可選
Ø 調用程式(Activate application)
本文轉自 21cnbao 51CTO部落格,原文連結:http://blog.51cto.com/21cnbao/134679,如需轉載請自行聯系原作者