Vxworks的引導(dǎo)過程資料_第1頁
Vxworks的引導(dǎo)過程資料_第2頁
Vxworks的引導(dǎo)過程資料_第3頁
Vxworks的引導(dǎo)過程資料_第4頁
Vxworks的引導(dǎo)過程資料_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

VxWorks的引導(dǎo)過程

此文為學(xué)習(xí)記錄,非正式文檔

相關(guān)術(shù)語說明如下:

Boot:引導(dǎo)或加載

BootROM:用來存放boot程序的ROM,boot程序首先對(duì)硬件作必要的基本的始化后

搬運(yùn)boot程序到RAM空間。然后啟動(dòng)加載程序通過網(wǎng)口、串口或者擴(kuò)展

FLASH加教VxWorks系統(tǒng)。BootROM程序可看作是一個(gè)獨(dú)立的系統(tǒng),具有

自加載功能和通過串口、網(wǎng)口或擴(kuò)展FLASH加載VxWorks系統(tǒng)的功能.

RAM_HIGH_ADRS:拷貝bootROM映像的目標(biāo)地址

RAM_LOW_ADRS:VxWorks映像的起始地址:

1.1啟動(dòng)過程

以下啟動(dòng)過程是通過串口或者網(wǎng)口加載VxWorks系統(tǒng)的過程,并不代表所有的加載過程.

1.上電復(fù)位后第一條被執(zhí)行的指令位置0xfff00100(針對(duì)MPC8240)

上電復(fù)位后CPU從0xfff00100取指令開始執(zhí)行.這個(gè)地址位于bootROM空間內(nèi)。

1)完成啟動(dòng)所必要的初始化

設(shè)置狀態(tài)字并創(chuàng)建一個(gè)啞堆棧(dummystack)

2)初始化存儲(chǔ)器接口

2.跳到C程序的入口地址

第一個(gè)被執(zhí)行的C程序是romStart()。

程序首先拷貝bootROM內(nèi)的部分boot程序到RAM空間。(我認(rèn)為這以后程序都在RAM中運(yùn)行).

然后根據(jù)啞堆棧中的參數(shù)決定是否清零內(nèi)存RAM(如是冷啟動(dòng)(coldstart)則清零),再把

ROM段的剩余部分拷貝到RAM的RAM_HIGH_ADRS地址(如果ROM代碼是壓縮的,還要解壓)。

3.處理器跳到RAM的入口地址RAM_HIGH_ADRS(bootConfigoc)。

在這里執(zhí)行的程序是usrInit();

使cache無效,清零bss段,初始化向量表,進(jìn)行板級(jí)初始化。

4.啟動(dòng)多任務(wù)內(nèi)核

VxWorks的bootROM本身就是一個(gè)獨(dú)立的應(yīng)用。到此步為止可看作是bootROM內(nèi)的這個(gè)獨(dú)立

系統(tǒng)已經(jīng)被加載且運(yùn)行起來了。

5.加載VxWorks系統(tǒng)

通過串口、網(wǎng)口或者從擴(kuò)展FLASH中加載系統(tǒng),VxWorks被加載到RAM的地端地址,起始地址為

RAM_LOW_ADRSo

6.應(yīng)用程序加載

各步所調(diào)用函數(shù)先后順序如下:

上電復(fù)位---》romlnit()----》romStart()---》usrInit()---》initVectBaseSet

()----》sysHwInit()----》usrKerneIInit()---》kernelInit()---》usrRoot()(啟動(dòng)

串口或者網(wǎng)口加載程序)---》〔完成對(duì)VxWorks系統(tǒng)的加載.)一》sysInit()----》usrInit()

----》initVectBaseSet()---》sysHwlnit()----》usrKerneIInit()—》kerneIInit()

----》usrRoot()(和前一個(gè)usrRoot。不一樣,這里啟動(dòng)用戶程序)

romlnit():

這是上電復(fù)位后首先執(zhí)行的程序

(a)設(shè)置啞堆棧,初始化CPU內(nèi)的寄存器,無效Cache,禁止中斷;

(b)保存啟動(dòng)類型,啟動(dòng)類型分為冷啟動(dòng)和熱啟動(dòng)

(c)硬件初始化,主要是初始化存儲(chǔ)器接口。

(d)調(diào)用romStart();

romStart():

這是第一個(gè)被執(zhí)行的C程序。

BootROM程序分為兩個(gè)部分,第一部分是上電復(fù)位后的首先執(zhí)行的程序,完成硬件的必要初始

化和搬運(yùn)程序到RAM,如果第二部分的程序被壓縮這部分程序還包括解壓程序;第二部分是Boot

ROM的其余部分程序,完成加載VxWorks系統(tǒng)的功能。這部分程序是可被壓縮的。如果第二部分程

序沒有被壓縮,則在搬運(yùn)時(shí)可把bootROM內(nèi)的程序一次搬運(yùn)到RAM中。下面的步驟是針對(duì)第二部

分程序被壓縮的情況。

完成功能如下:

(a)搬運(yùn)bootROM的第一部分程序到RAM。

(b)如果是冷啟動(dòng)則需要一些存儲(chǔ)區(qū)清0,這些存儲(chǔ)區(qū)是除了堆棧區(qū)(為啟動(dòng)所設(shè)的啞堆棧)

和(a)步所搬運(yùn)程序覆蓋的區(qū)域外的其他存儲(chǔ)區(qū)。

(c)解壓并搬運(yùn)bootROM的其余程序到RAM

(d)跳至被解壓的程序的入口點(diǎn)執(zhí)行,即執(zhí)行usrlnit();

usrInit():

這是運(yùn)行在VxWorks下的第一個(gè)C程序

完成功能如下:

(a)設(shè)置Cache模式,禁止Cache

(b)對(duì)bss段清0

(0保存啟動(dòng)類型

(d)調(diào)用函數(shù)intVecBaseSet()設(shè)置中斷式量表基本地址

(e)調(diào)用sysHwInit()初始化硬件到靜止?fàn)顟B(tài)(QuiescentState),這主要是讓可能產(chǎn)生中

斷的設(shè)備復(fù)位和禁止其產(chǎn)生中斷.

(f)調(diào)用usrKernelInit(),根據(jù)定義的的常數(shù)選擇適當(dāng)?shù)某跏蓟瘮?shù)完成初始化。

調(diào)用kernelInit(),初始化多任務(wù)環(huán)境,孵化任務(wù)usrRoot(),此函數(shù)不返回。

UsrRoot():

完成功能如下:(有些步驟根據(jù)需要選擇)

(a)初始化系統(tǒng)時(shí)鐘

(b)初始化I/O系統(tǒng)和驅(qū)動(dòng)

(c)Console設(shè)備的建立

(d)標(biāo)準(zhǔn)輸入輸出的配置

(e)例外處理的安裝

⑴管道驅(qū)動(dòng)的初始化

(g)標(biāo)準(zhǔn)I/O的初始化

(h)文件系統(tǒng)設(shè)備的建立和磁盤驅(qū)動(dòng)的安裝.

⑴性能監(jiān)控的設(shè)置

(j)目標(biāo)機(jī)管理的初始化

(k)用戶特定的代碼,例如網(wǎng)口加載程序

可以在usrRoot()添加網(wǎng)口或者串口加載程序來加載VxWorks系統(tǒng)。加載VxWorks系統(tǒng)后,程序

進(jìn)入syslnit()中執(zhí)行。

SysInit():

這是依賴特定系統(tǒng)的匯編代碼模塊,它是VxWorks的入口點(diǎn),執(zhí)行完后會(huì)跳至usrInit。(所

以u(píng)srlnit()是VxWorks下的第一個(gè)執(zhí)行的C代碼).

完成功能如下:

(a)鎖住中斷,無效Cache

(b)初始化處理器的寄存器(包括C堆棧指針)到默認(rèn)值

(c)清除所有懸置的中斷

(d)調(diào)用usrInit()

usrInit()調(diào)用kerneIInit()孵化任務(wù)usrRoot(),usrRoot()完成應(yīng)用程序執(zhí)行前所必要的

初始化.

以上步驟適用于通過串口或者網(wǎng)口加載VxWorks系統(tǒng)的過程。在開發(fā)階段通常采用這種方式。

實(shí)際的產(chǎn)品是可能是從FLASH加載VxWorks系統(tǒng)的。一個(gè)可能的過程如下:

上電復(fù)位----》romlnit()----》romStart()(此處把bootROM的內(nèi)容和FLASH內(nèi)的系統(tǒng)

程序都加載到RAM,VxWorks的加載在此步就完成了)一》sysInit()---》usrInit()----》

initVectBaseSet()---》sysHwInit()----》usrKerneIInit()----》kerne11nit()----》

usrRoot()(啟動(dòng)用戶應(yīng)用程序)

另外:

對(duì)于程序駐留在ROM中運(yùn)行的方式,在加載時(shí)只需要加載數(shù)據(jù)段。

2.1函數(shù)sysHwInit()

從上面的啟動(dòng)過程可以注意到硬件初始化的一個(gè)主要函數(shù)是sysHwlnit().

下面以BigHammer中扣板的BSP為例來分析一下該函數(shù)。

該函數(shù)完成如下功能:

(a)調(diào)用sysMemMapDetect。檢測(cè)存儲(chǔ)映射配置,然后對(duì)相關(guān)的全局變量賦相應(yīng)的值??梢圆?/p>

檢測(cè)而直接賦值。

(b)記錄物理存儲(chǔ)區(qū)的長(zhǎng)度,計(jì)算sysPhysMemDesc的人口數(shù)

(c)調(diào)用ppc8240pciInit()初始化8240PCI接口

(d)配置CPLD內(nèi)的寄存器(與扣板相關(guān),可參看扣板的硬件設(shè)計(jì)文檔)

(e)初始化寄存器EUMBBAR,此寄存器的值決定了EPIC,DMA等的相關(guān)寄存器的基本地址.

⑴確認(rèn)所用的CPU類型

(g)調(diào)用sysEpicInit0完成EPIC(嵌入式中段控制器)初始化

(h)調(diào)用GnetPciHwInit。初始化GaInet48303的PCI

(i)調(diào)用sysSeriaIHwInit()初始化串口

(j)調(diào)用sysNetHwInit()初始化網(wǎng)絡(luò)接口

下面的內(nèi)容引自一已有文檔

3.1件和程序說明

romlnitoS:romlnit()

關(guān)白斷,把啟動(dòng)類型(cold/warm)人棧,清零cache后跳到romStart的入口.

bootInit.C:romStart()

把ROM代碼和數(shù)據(jù)段拷貝并重定位到RAM,清零RAM的未用部分,需要的話要進(jìn)行解壓縮,然

后跳到syslnir。的入口地址。

拷貝的過程如下:

A,代碼段不是駐留在ROM中,要拷貝代碼段和數(shù)據(jù)段;

B,如代碼段是駐留在ROM中的,則只拷貝數(shù)據(jù)段;

C,未用的內(nèi)存清零;

D,需要時(shí),要進(jìn)行解壓縮。

sysALiboS:syslnit0

syslnit()是VxWorks映像的入口地址,起始地址由RAM—L0W-ADR定義。它首先關(guān)中斷,使cache

無效,初始化處理器的寄存器為缺省值,使tracing無效,清除中斷寄存器,初始化usrlnit。

的堆棧并激活usrInit().

注意,在syslnit。中必須重新初始化在romlnit()中所做的硬件初始化。

usrConfig.CandbootConfig.C:usrInit()

它是VxWorks運(yùn)行的第一個(gè)C代碼,在supervisormode中激活.它關(guān)中斷,存儲(chǔ)有關(guān)啟動(dòng)類型

(boottype)的信息,在VxWorks內(nèi)核運(yùn)行前進(jìn)行必要的初始化.

A,初始化cache的模式,設(shè)置為安全狀態(tài),在usrlnit()結(jié)束時(shí)使cache有效;

B,清零系統(tǒng)bss段;

C,初始化中斷向量表,調(diào)用VectBaseSet(),exeVectInit();

D,初始化系統(tǒng)硬件,但使之無效(QuiescentState),調(diào)用sysHwlnit(),這是一個(gè)與硬

件有關(guān)的過程,是我們要針對(duì)不同的目標(biāo)板進(jìn)行修改的重要部分,其中涉及到串口,網(wǎng)口的初始

化,CONSOLE的配置等;

E,調(diào)用usrKernelInit(),并使能cache;

F,調(diào)用kernelInit(),創(chuàng)建usrRoot()。

usrKerneIoC:kernelInitO

初始化內(nèi)核可選組件(kernelfaciIity)。

kerneILib.C:usrKerneIInit()

初始化多任務(wù)環(huán)境。

調(diào)用intLockLeveISet。,使時(shí)間片(round-robin)方式無效,在內(nèi)存的高端創(chuàng)建中斷堆棧,

ROOT堆棧和TCB,創(chuàng)建usrRoot(),中斷usrlnit。的運(yùn)行,然后打開中斷,注意要清除中斷寄存

器。

usrConfig.CandbootConfig.C:usrRoot()

初始化I/O系統(tǒng),驅(qū)動(dòng)器,設(shè)備(在configAI。h和config.h中指定).

3.2程序列表

對(duì)于硬件初始化的順序,大致可按下表中形式進(jìn)行:

函數(shù)函數(shù)功能所在文件

sys1nit()(a)鎖住中斷;(b)禁用緩沖;sysALibos

(c)用缺省值初始化系統(tǒng)中斷表(僅

i960);

(d)用缺省值初始化系統(tǒng)錯(cuò)誤表(僅

i960):

(e)初始化處理器寄存器到一缺省值;

(千)使回流失效;(g)清除所有懸置中斷;

(h)激活usrInit(),指明啟動(dòng)類型.

usr1nit()(a)對(duì)bss賦零;usrConfig.c

(b)保存bootType于sysStartType;

(c)調(diào)用excVecInit(),初始化所有系統(tǒng)

和缺省中斷向量;

(d)依次調(diào)用sysHwInit(),

usrKerne11nit(),kerne11nit()0

usrKernelInit()依次調(diào)用classLiblnit(),taskLiblnitusrKerne1.c

(),taskHookInit(),

semBLiblnit(),semMLib1nit(),semCL

ib1nit(),semOLiblnit(),wdLiblnit

(),msgQLiblnit(),qlnit(),

workQInit()

kerne11nit()初始化并啟動(dòng)內(nèi)核。kerne1Liboc

(a)激活intLockLeveISet();

(b)從內(nèi)存池頂部創(chuàng)建根堆棧和TCB;

(c)調(diào)用tasklnit(),taskActivate

(),用于usrRoot();

(d)調(diào)用usrRoot()。

usrRoot()初始化I/O系統(tǒng),驅(qū)動(dòng)器,設(shè)備(在usrConfigoc

configAII.h和config.h中指定)

(a)調(diào)用

sysCIkConnect(),sysCIkRateSet(),

iosInit(),[ttyDrv()];

(b)初始化exclnit(),

IogInit(),sigInit()o

(c)初始化管道,pipeDrvO;

(d)stdiolnit(),mathSoftInit()

或mathHardlnit()

(e)wdbConfig():配置并初始化目標(biāo)代

理機(jī)

在大多數(shù)目標(biāo)板的板級(jí)支持包中,VxWorks的入口點(diǎn)由兩個(gè)函數(shù):romlnit0^romStart()

來完成,而非syslnit。。具體基于ROM的VxWorks的初始化過程如下表所示:

函數(shù)函數(shù)功能所在文件

1.romlnit()(a)禁止中斷;romlnit。s

(b)保存啟動(dòng)類型;

(c)硬件初始化;

2.romStart()

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論