上一節主要是從映像的分類和各種映像的大致載入流程上看VxWorks的啟動過程,這一節讓我們從函數級看一下VxWorks的啟動過程:
1. Boot Image + Loadable Images:
以下是詳細的流程圖:
當中第一階段的運行流程使用的是上圖的左邊的源文件里的那些函數(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 中第一個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映像
- sysALib.s : sysInit( )
與romInit.s : romInit()的初始化過程類似,但不再初始化SDRAM
- usrConfig.c : usrInit( )
設置cache的工作模式,板級硬件初始化,初始化Wind內核,啟動usrRoot( )根任務
- usrConfig.c : 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.s:romInit()
• 系統上電之后,首先調用的函數就是romInit()
• 禁止中斷
• 把啟動類型(冷啟動/熱啟動)放在堆棧上
• 清除cache
• 初始化CPU基本寄存器,調用SDRAM初始化函數初始化UPM
• 直接跳轉到bootInit.c:romStart()
- bootInit.c:romStart()
• 把代碼段(假設是VxWorks_romResident映像,則不拷貝代碼段)和數據段從bootrom拷貝到RAM其中
• 完畢程序映象的解壓縮(假設映象是壓縮版本號的)
• 跳轉到sysALib.s:sysInit()
- sysALib.s:sysInit()
• 又一次進行CPU內核(主要是cache)的初始化。這些工作在romInit()里面以前進行過,因為系統剛剛進入RAM中運行。須要再次初始化。
• 不管使用何種系統(包含仿真器)引導,RAM版本號的VxWorks都是從這里開始運行的。
• 控制權移交給 usrInit()
- usrConfig.c: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中而已,故在此不作介紹了。