上一節主要是從映像的分類和各種映像的大致載入流程上看VxWorks的啟動過程,這一節讓我們從函數級看一下VxWorks的啟動過程:
1. Boot Image + Loadable Images:
下面是具體的流程圖:
其中第一階段的執行流程使用的是的左邊的源檔案中的那些函數(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二階段執行流程使用的是中右邊源檔案中的那些函數(sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具體解釋:
第一階段:
• 系統上電之後,首先調用的函數就是romInit()
• 禁止中斷
• 把啟動類型(冷啟動/暖開機)放在堆棧上
• 清除cache
• 初始化CPU基本寄存器,調用SDRAM初始化函數初始化UPM
• 直接跳轉到bootInit.c:romStart()
• 把程式碼片段和資料區段從bootrom複製到RAM當中
• 完成程式映象的解壓縮(如果映象是壓縮版本的)
• 跳轉到bootConfig.c:usrInit()
• bootConfig.c:usrInit()
• VxWorks 中第一個C語言完成的代碼。執行作業系統核心所必須的初始化程式。
• Cache程式庫的初始化
• 清零系統的BSS段
• 初始化中斷向量表
• 使硬體工作在一個“安靜”的狀態,盡量不產生各種中斷或者異常
• 控制權移交給KernelInit(),產生usrRoot根任務
• 在usrRoot根任務中解析Bootline,產生bootCmdLoop任務,用於啟動、載入VxWorks映像
此時,調試超級終端會有如下列印資訊:
VxWorks System Boot
Copyright 1984-1998 Wind River Systems, Inc.
CPU: MPC860
Version: 5.4
BSP version: 1.2/0
Creation date: Aug 2 2002, 09:19:47
Press any key to stop auto-boot...
3
此時按任意鍵可停止自動啟動,修改啟動行參數
[VxWorks Boot]: p
boot device : cpm
unit number : 0
processor number : 0
host name : Michel
file name : c:/ftpRoot/vxWorks
inet on ethernet (e) : 168.2.7.27:ffffff00
host inet (h) : 168.2.7.10
user (u) : target
Passwd(pw) : target
flags (f) : 0x0
―――――――――――――――――――――――――――
[VxWorks Boot]: @
boot device : cpm
unit number : 0
processor number : 0
host name : Michel
file name : c:/ftpRoot/vxWorks
inet on ethernet (e) : 168.2.7.27:ffffff00
host inet (h) : 168.2.7.10
user (u) : target
Passwd(pw) : target
flags (f) : 0x0
Attached TCP/IP interface to cpm0.
Attaching network interface lo0... done.
第二階段:
- bootConfig.c: bootLoad( )
載入VxWorks映像,並轉向它的載入地址,從sysInit入口開始執行VxWorks映像
與romInit.s : romInit()的初始化過程類似,但不再初始化SDRAM
設定cache的工作模式,板級硬體初始化,初始化Wind核心,啟動usrRoot( )根任務
初始化記憶體,系統時鐘,I/O系統,標準輸入輸出錯,異常處理,添加使用者應用程式
此時調試超級終端列印如下資訊,Boot引導完成
/*VXWORKS Image Getting Loaded*/
Loading... 881680
Starting at 0x10000…
Attached TCP/IP interface to cpm unit 0
Attaching network interface lo0... done.
VxWorks
Copyright 1984-1998 Wind River Systems, Inc.
CPU : MPC860
vxWorks : 5.4
BSP version: 1.2/0
Creation date: Aug 2 2000
WDB : Ready
2. ROM-based Images(壓縮/沒有壓縮):和上面那種啟動方式相比,這種啟動方式省去了一些步驟,執行完romStart()之後就已經載入VxWorks 到RAM中了,因此,下一步就是把控制權交給VxWorks,有VxWorks從sysInit()開始執行即可。下面是具體的流程:
• 系統上電之後,首先調用的函數就是romInit()
• 禁止中斷
• 把啟動類型(冷啟動/暖開機)放在堆棧上
• 清除cache
• 初始化CPU基本寄存器,調用SDRAM初始化函數初始化UPM
• 直接跳轉到bootInit.c:romStart()
• 把程式碼片段(如果是VxWorks_romResident映像,則不拷貝程式碼片段)和資料區段從bootrom複製到RAM當中
• 完成程式映象的解壓縮(如果映象是壓縮版本的)
• 跳轉到sysALib.s:sysInit()
• 重新進行CPU核心(主要是cache)的初始化。這些工作在romInit()裡面曾經進行過,由於系統剛剛進入RAM中執行,需要再次初始化。
• 無論使用何種系統(包括模擬器)引導,RAM版本的VxWorks都是從這裡開始執行的。
• 控制權移交給 usrInit()
• VxWorks 中第一個C語言完成的代碼。執行作業系統核心所必須的初始化程式。
• Cache程式庫的初始化
• 清零系統的BSS段
• 初始化中斷向量表
• 使硬體工作在一個“安靜”的狀態,盡量不產生各種中斷或者異常
• 控制權移交給KernelInit(),產生usrRoot根任務
此時,調試超級終端會有如下列印資訊:
/*VXWORKS Image Getting Loaded*/
Loading... 881680
Starting at 0x10000…
Attached TCP/IP interface to cpm unit 0
Attaching network interface lo0... done.
VxWorks
Copyright 1984-1998 Wind River Systems, Inc.
CPU : MPC860
vxWorks : 5.4
BSP version: 1.2/0
Creation date: Aug 2 2000
WDB : Ready
3. ROM-Resident Images:這種啟動方式的流程和上面那種基本相同,只是不需要載入text段到RAM中而已,故在此不作介紹了。
VxWorks借鑒了傳統PC作業系統的引導原理,其將整個引導過程分為兩個階段:1. BOOTROM啟動,2. 通過BOOTROM載入VxWorks核心。