VxWorks引導啓動過程

一 基本概念及引導概述

1 bootloader/bootrom/bootstrap

CPU上電經自復位的過程(由硬件時序邏輯決定的Power-On StrappingSequence)後,指令指針指向一個固定的地址(after-reset startingpoint)。這個固定地址因體系架構而異:在一個基於 ARM7TDMI core 的嵌入式系統中,系統在上電或復位時通常都從地址0x00000000 處開始執行;在一個MIPS體系架構的嵌入式系統中,系統在上電或復位時通常都從地址0xBFC00000(0x1FC00000)處開始執行。

無論是ARM中的0x00000000,還是MIPS中的0x1FC00000,這個入口地址處往往存放的就是系統的Boot Loader程序。這個地址往往映射(可參考具體datasheet的Memory Map)爲Boot Rom的地址空間,這裏的Boot Rom通常爲NOR Flash或者SPI Flash(早期的可能爲EEPROM等非易失性存儲介質)。由此可見,bootloader(引導加載程序)是系統上電後運行的第一段軟件代碼。bootrom則是用來存儲bootloader的ROM/Flash芯片

當然bootrom(ROM/Flash)上不僅僅只是存儲bootloader,往往還存儲着系統映像、應用程序資源和用戶配置數據等信息。這樣,嵌入式設備每次重新上電後,總能加載系統和恢復上一次的配置。因爲嵌入式設備中往往沒有配備磁盤,SDRAM又是易失的,因此bootrom上往往還存放着系統映像等數據(可能是壓縮的)。

在嵌入式系統中,通常沒有像BIOS那樣的固件程序(注,有的嵌入式CPU也會內嵌一段短小的啓動微碼),因此整個系統的加載啓動任務就完全由Boot Loader來完成。此時,CPU只認得指令,因此bootloader一般以純彙編指令開始,而不應該包含任何ELF格式的文件頭信息(這些信息只有特定OS才能識別)。

bootstrapbootloader的一部分,是最初級的引導,旨在初始化CPU、內存控制器、時鐘、堆棧,目標是讓CPU正常運作起來。我們可以認爲bootloader = bootstrap program + boot image。boot image往往初始化最小OS內核,搭建網絡下載通道,提供一個可以交互的命令行,以便自我更新(update boot)或下載更新系統映像(update vxWorks)。bootloader通常都分爲Stage1和Stage2兩個階段,這裏的bootstrap program對應Stage1,boot image則對應Stage2。下面從代碼構成角度入手,闡述VxWorks下的bootstrap program和boot image的含義。

在vxWorks中,若含有bootlader(即下文提到的Boot Image + Loadable Image組合類型),則bootstrap program主要是指romInit.s+bootInit.c,boot image主要是指有bootConfig.c、sysAlib.s、sysLib.c以及BSP目錄下的其他文件編譯鏈接而成。通常爲了節省空間,boot image部分被壓縮作爲數據段存儲在bootstrap program之後——bootrom.bin。bootstrap program是在ROM/Flash中運行的,當然爲了執行更快,其後半部分也可能拷貝到RAM中執行。很顯然,bootstrap program是不能壓縮的,否則無法完成自舉。

對於沒有bootloader的引導型映像(即下文提到的ROM-based Image類型,vxWorks_rom*.bin),其固化在ROM/Flash的第一部分bootstrap program可能有romInit.s+romStart.c組成,後面無boot image,緊隨其後的爲vxWorks映像(可能被壓縮)。

2 vxWorks的bootrom類型

bootrom的類型
前綴或後綴 說明
bootrom 壓縮的bootrom映像(除bootstrap代碼外)
bootorm_uncmp 非壓縮的bootrom映像
bootrom_res ROM駐留型的bootrom映像
無後綴 ELF可執行文件格式
.hex Motorola S-record文件格式
.bin 裸的二進制格式(一般燒到ROM/Flash零地址處)










3 引導流程概述

系統上電後,CPU開始從預先安排的地址上開始執行一段指令,這段指令的作用首先是將可執行程序所需的最小環境搭建起來。這個初始化過程包括初始化CPU、內存控制器及各種必需輸入/輸出設備、磁盤控制器等等。以X86體系結構來說,需要初始化CPU、北橋、南橋,常說的BIOS就是這樣一段初始化程序。在那些沒有BIOS的架構中,這一工作由系統的bootloader完成。

建立了最小可運行系統,操作系統的內核就可以運行了。於是,BIOS或bootloader程序將操作系統從能夠永久保存內容的存儲介質中讀取出來加載到內存中。這些可永久保存內容的存儲介質可能是NVROM、磁盤、光盤等,例如我們常說的操作系統光盤。

通常,操作系統在加載過程中還會對硬件環境做一次重新初始化,這一次初始化就不僅僅是最小運行環境了。包括CPU在內的全部計算機所包含的硬件都會被操作系統依次初始化,同時初始化的還包括操作系統內核本身。這樣,整個系統就處於一種可控狀態,可以開始執行用戶應用程序了。

從引導到系統啓動是一個bottom-up的過程;啓動後,用戶交互到系統響應則是一個top-down的過程。

 

二 VxWorks映象

1 VxWorks映象的組成

VxWorks映象由文本段(.text/.code),數據段(.data)和BSS段(.bss)組成。文本段相當於代碼段,是由一些指令組成的;數據段就是由一些初始化過的全局和靜態變量組成;BSS段也是由全局變量和靜態變量組成,只不過他們都沒有經過初始化。

2 VxWorks映象的類型

(1).VxWorks(Loadable binary VxWorks image)

RAM based VxWorks image, linked to RAM_LOW_ADRS. It is loaded into RAM via some external program such as abootROM.This is the default development image.

(2).vxWorks_rom(Uncompressed ROMable binary VxWorks image)

RAM based image that starts in ROM. The ROM startup code copies the entireimage to RAM and then jumps to it. This image generally has a slower startup time, but faster execution time, than vxWorks_romResident.

(3).vxWorks_romCompress(compressed ROMable binary VxWorks image)

Compressed RAM based image thatstartsin ROM. This image can fit almost twice the code as other ROM images.But it has the slowest boot time, since the image must be uncompressed. The run-time speed is the same as for vxWorks_rom.

(4).vxWorks_romResident(ROM-resident version binary VxWorks image)

ROM resident image. The program textremains in ROM, only the data iscopied to RAM. This image has the fastest boot time and uses the least amount of RAM, but runsslower on boards with slow ROM access.

相關後綴的含義同bootrom。


我們可將VxWorks Image的文件類型劃分爲兩類三種:

A.加載型映象(VxWorks類型)

(1)Loadable Image是包含用戶程序的VxWorks操作系統映象,其不具備引導功能,需要藉助bootloader引導程序通過網口或串口下載到RAM中。bootloader在此扮演了“搬運工”的角色。

B.可引導型映象

可引導型(Bootable)映象包含含有用戶程序的VxWorks操作系統映象,幷包括完整的引導代碼,可以在系統上電後自動完成自身的引導。我們在前面已經分析過,該類映像往往由bootstrap program(romInit.s+romStart.c)和緊隨其後的爲vxWorks映像(可能被壓縮)組成。

(2)ROM-based Image(壓縮/沒有壓縮):即將Image直接燒入ROM/flash,運行時將Image拷入(如果壓縮則需解壓)RAM中運行。

(3)ROM-resident Image:Image的指令部分駐留在ROM中運行,僅將數據段部分拷入RAM。

注意,以上三種映象都是包含完整VxWorks操作系統的映象,其中後兩種可以直接啓動並運行起來,但是第一種不行,它必須藉助另一個叫做Boot Image的映象(可以在Tornado中的build->build bootrom中生成)才能運行起來,也就是利用Boot Image引導起來後通過網口或串口下載真正包含VxWorks的Loadable Image,然後才能運行起來。也即Boot Image往往和Loadable Image結合起來使用。

現在看來一共有四種映象文件,讓我們看看它們的組成:

(1)Boot Image:包含一段起始引導程序(BootStrap Program)和一段ROM引導程序(ROM Boot Program)。

(2)Loadable Image:由操作系統VxWorks和應用組成的映象。

(3)ROM-based Image(壓縮/沒有壓縮):包含一段叫做BootStrap Program的程序+Loadable Image(即有操作系統VxWorks和應用組成的映象)。

(4)ROM-Resident Image:同上。

通過上面我們可以看出,ROM-based Image,ROM-Resident Image,Boot Image三種映象都包含一段叫做BootStrap Program的程序,可以把ROM引導程序的代碼段和數據段拷貝到RAM中。同時,它具有啓動功能。

 

三 VxWorks映象啓動流程

下面讓我們看看三種VxWorks的啓動過程:

1 BootImage+LoadableImage

注意:這裏和下文的Boot Image是指存放在bootrom中的bootloader映像。

前面提到LoadableImage是依靠Boot Image加載啓動的,首先由Boot Image中的BootStrap Program程序把ROM引導程序(ROM Boot Program)加載(如果壓縮則需解壓)到RAM中的RAM_HIGH_ADRS處,然後跳轉到此處執行ROM引導程序,由ROM引導程序負責一系列簡單的硬件初始化(網口,串口等),開始下載Loadable Image(即包含應用的VxWorks操作系統)到RAM_LOW_ADRS,然後跳轉到此處啓動VxWorks操作系統。

下面的圖一是一個簡單的流程圖,後面的圖二是更爲詳細的流程圖。

圖一

圖二(1)

圖二(2)

引導過程成功以後,RAM中ROM引導程序佔用的空間(從RAM_HIGH_ADRS開始)可以重新被系統利用。

2 ROM-basedImage(壓縮/沒有壓縮)

這種映象由起始引導程序(BootStrap Program)和基於ROM的VxWorks映象組成。因此,這種bootrom的體積較大。BootStrap Program把基於ROM的VxWorks映象加載到內存的RAM_LOW_ADRS處,然後直接啓動VxWorks操作系統(如果壓縮則需解壓)。圖三是一個簡圖,圖四是更爲詳盡的流程圖。


圖三

圖四

3 ROM-residentImage

這種映象由起始引導程序(BootStrap Programs)和駐留ROM的VxWorks映象組成。VxWorks系統文本段(代碼段)駐留在ROM,搬移程序負責將data段和bss段搬移到內存的RAM_LOW_ADRS處,直接啓動VxWorks映像(含符號表)。此時,RAM_LOW_ADRS是VxWorks映象的加載點,也是VxWorks數據段的起始點。

 

四 VxWorks映象函數級啓動過程

上一節主要是從映象的分類和各種映象的大致加載流程上看VxWorks的啓動過程,這一節讓我們從函數級看一下VxWorks的啓動過程。

1 BootImage+LoadableImage

VxWorks借鑑了傳統PC操作系統的引導原理,其將整個引導過程分爲兩個階段:

1.1 BOOTROM啓動

起始引導程序(BootStrap Program)駐留在ROM中,主要包含:

(1)彙編級的硬件初始化程序romInit.s,用於系統的基本初始化,設置一些重要寄存器的初始值,進行存儲器的映射

(2)搬移程序bootInit.c,將ROM引導程序拷貝至RAM的高端地址RAM_HIGH_ADRS,然後跳轉到此處執行ROM引導程序。

ROM引導程序運行,將可加載的VxWorks映象下載到內存的指定地址RAM_LOW_ADRS處。

1.2 啓動VxWorks內核

下面是具體的流程圖:


圖五

其中第一階段的執行流程使用的是上圖的左邊的源文件中的那些函數(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二階段執行流程使用的是上圖中右邊源文件中的那些函數(sysInit->usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具體解釋:

Stage 1:

(1)romInit.s : romInit() /*entry point for VxWorks in ROM*/

系統上電之後,首先調用的函數就是romInit(),其主要完成兩個操作:將CPU設置爲正確的工作狀態,包括各個寄存器的值以及CPU的工作模式;初始化系統內存並建立堆棧。由於需要設置CPU模式,所以這裏的代碼必須由彙編代碼完成,並且彙編也是建立堆棧的唯一選擇。

• 禁止中斷,避免陷入不確定混亂狀態。

• 清除cache。

• 初始化CPU基本寄存器,調用SDRAM初始化函數初始化UPM。

• 初始化系統堆棧,在內存中建立起堆棧後,系統就具備了高級語言的執行條件。後面的代碼可以用C實現。

• 把啓動類型(冷啓動/熱啓動)放在堆棧上。

• 直接跳轉到bootInit.c : romStart()

(2)bootInit.c : romStart()/*generic ROM initialization*/

這是VxWorks中所執行的第一段C語言代碼,但仍在ROM中執行。

• 把ROMBoot Program的代碼段和數據段從ROM複製到RAM中。

• 完成程序映象的解壓縮(如果映象是壓縮版本的)。

• 跳轉到bootConfig.c: usrInit()開始執行ROM引導程序。

從這裏開始,可引導型映象和加載型映象走上了相同的初始化道路。

(3)bootConfig.c : usrInit()

對於bootrom_uncmp和bootrom_res,在romStart()中直接跳轉到usrInit()。對於壓縮的bootrom,romStart()跳轉到解壓縮點,而bootConfig.c中的第一個函數爲compressedEntry(),故壓縮型bootrom解壓後將跳轉到compressedEntry()入口處,緊接着調用usrInit()。至於爲什麼壓縮的bootrom需要compressedEntry這個樁函數(Stub Routine),詳情參考後文《VxWorks/MIPS運行期的gp重定位》。

/

* compressedEntry - compressed entry point after decompression。
* This routine is the entry point after the bootroms decompress, if
compression is utilized.  This routine must be the first item of the
* text segment of this file.

*/

• VxWorks中第一個在RAM中執行的函數。執行操作系統內核所必須的初始化程序。

• Cache程序庫的初始化。

• 清零系統的BSS段。

• 初始化中斷向量表。

• 使硬件工作在一個“安靜”的狀態,儘量不產生各種中斷或者異常。

• 調用sysHwInit()初始化硬件。

• 調用usrKernelInit()初始化內核的必要組件。

• 調用KernelInit(),初始化VxWorks內核併產生usrRoot根任務。

• 在usrRoot根任務中解析Bootline,產生bootCmdLoop任務,用於啓動、加載VxWorks映象。

此時,調試超級終端會有如下打印信息(printBootLogo()):

VxWorks System Boot

Copyright 1984-1998  Wind River Systems, Inc.

CPU: MPC860

Version: 5.4

BSP version: 1.2/0

Creation date: Aug 22002, 09:19:47

Press any key to stopauto-boot...

 3

接着,將調用自動引導程序autoboot(timeout),在指定時間timeout內,按任意鍵可停止自動啓動,修改啓動行參數(read and execute the ROM commands)。下一步將調用bootload()將指定主機目錄下的VxWorks映象下載到目標板的RAM地址RAM_LOW_ADRS處,並跳轉(go)到此處執行指令代碼,啓動VxWorks操作系統。

[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/IPinterface to cpm0.

Attaching networkinterface lo0... done.

Stage 2:

(1)bootConfig.c :bootLoad()

加載VxWorks映象,並跳轉到它的加載地址,具體流程如下。

usrBootLineInit()中strcpy (BOOT_LINE_ADRS,DEFAULT_BOOT_LINE);從FLASH中讀出DEFAULT_BOOT_LINE配置的引導方式及映象文件。

bootload()->usrBootLineCrack (BOOT_LINE_ADRS,&params)獲取BOOT_PARAMS,通過params.bootDev類型來決定從硬盤、軟盤、閃存加載或通過網口、串口下載VxWorks映象。

bootLoad (BOOT_LINE_ADRS, &entry);

{

scsiLoad();/* loada vxWorks image from a local SCSI disk */

fdLoad(); /* loada vxWorks image from a local floppy disk */

ideLoad();/* loada vxWorks image from a local IDE disk */

ataLoad();/* loada vxWorks image from a local ATA disk */

pcmciaLoad();/* loada vxWorks image from a PCMCIA disk device */

tffsLoad();/* loada vxWorks image from a TFFS Flash disk */

tsfsLoad();/* loada vxWorks image from a Target Server File System (TSFS) */

netLoad();/*downLoad a file from a remote machine via the network */

bootLoadModule();/*bootstrap load an object module into memory */

}

下載完成後,直接跳轉到VxWorks系統映象起始地址(RAM_LOW_ADRS)處,從系統入口點(VxWorks image entrypoint)開始執行,入口函數爲sysInit():

go (entry); /*... and never return */

(2)sysALib.s : sysInit()

與romInit.s: romInit()的初始化過程類似,但不再初始化SDRAM。

(3)usrConfig.c :usrInit()

設置cache的工作模式,板級硬件初始化,初始化Wind內核,啓動usrRoot()根任務。

(4)usrConfig.c : usrRoot()

初始化內存,系統時鐘,I/O系統,標準輸入輸出錯,異常處理,最後會調用usrAppInit.c中的usrAppInit()進行用戶級應用模塊的初始化。

此時調試超級終端打印如下信息,Boot引導完成。

/*VXWORKS Image GettingLoaded*/

Loading... 881680

Starting at 0x10000…

 

Attached TCP/IPinterface to cpm unit 0

Attaching networkinterface lo0... done.

 

VxWorks

Copyright 1984-1998 WindRiver Systems, Inc.

         CPU : MPC860

     vxWorks : 5.4

  BSP version: 1.2/0

Creation date: Aug 22000

         WDB : Ready

2 ROM-based Image(壓縮/沒有壓縮)

和上面那種啓動方式相比,這種啓動方式省去了一些步驟,執行完romStart()之後就已經將VxWorks加載到RAM中了,因此,下一步就是把控制權交給VxWorks,由VxWorks從usrEntry()開始執行即可。下面是具體的流程:

(1)romInit.s : romInit()

同上。

(2)romStart.c : romStart()

rules.vxWorks中根據映像類型是vxWorks_romCompress、vxWorks_rom或vxWorks_romResident,將ROM_FLAGS_EXTRA定義爲CC_ROM_CMP_FLAGS、CC_ROM_CPY_FLAGS或CC_ROM_RES_FLAGS(defs.vxWorks中定義),其中分別定義了ROM_COMPRESS、ROM_COPYROM_RESIDENT宏。項目wpj文件在romInit.o和romStart.o的BUILDRULE中引入了ROM_FLAGS_EXTRA。

• 把基於ROM的VxWorks映象的代碼段(如果是VxWorks_romResident映象,則不拷貝代碼段)和數據段從bootrom複製到RAM當中。

• 完成程序映象的解壓縮(如果映象是壓縮版本的)

• 跳轉到usrEntry.c: usrEntry()

(3)usrEntry.c : usrEntry()

• usrEntry - entry point for _romCompress and _rom images.

rules.vxWorks中定義了partialImage.o的編譯規則,當非DEFAULT_RULE(vxWorks)類型時,usrEntry.o將會安插到$(PRJ_OBJS_FOR_LD_PARTIAL)之前。而PRJ_OBJS_FOR_LD_PARTIAL=PRJ_OBJS=prjObjs.lst,其中第一個目標文件爲sysAlib.o,這樣usrEntry()取代sysInit()了成爲vxWorks的入口。

--------------------------------------------------------------------------------------------------------

partialImage.o: $(LDDEPS) $(PRJ_OBJS) $(EXTRA_MODULES) $(COMPONENT_LIBS) \
        $(patsubst -l%,lib%.a,$(LIBS)) $(CC_LIB) $(PRJ_OBJS_FILE)
    - @ $(RM) $@
    $(CC) $(CFLAGS) $(OPTION_OBJECT_ONLY) $(VERSION_C)
ifneq   ($(findstring vxWorks_rom, $(DEFAULT_RULE)),)
    $(CC) $(CFLAGS) $(OPTION_OBJECT_ONLY) $(USR_ENTRY_C)
    $(LD_PARTIAL) usrEntry.o $(PRJ_OBJS_FOR_LD_PARTIAL) \
        $(EXTRA_MODULES) version.o $(LD_PARTIAL_START_GROUP) \
        $(COMPONENT_LIBS) $(LD_LINK_PATH) $(LIBS) \
        $(LD_PARTIAL_END_GROUP)  $(CC_LIB) -o $@
else
    $(LD_PARTIAL) $(PRJ_OBJS_FOR_LD_PARTIAL) $(EXTRA_MODULES) \
        version.o $(LD_PARTIAL_START_GROUP) $(COMPONENT_LIBS) \
        $(LD_LINK_PATH) $(LIBS) $(LD_PARTIAL_END_GROUP) $(CC_LIB) -o $@
endif

--------------------------------------------------------------------------------------------------------

• 控制權移交給 usrInit()

(4)usrConfig.c : usrInit()

執行操作系統內核所必須的初始化程序。

• Cache程序庫的初始化。

• 清零系統的BSS段。

• 初始化中斷向量表。

• 使硬件工作在一個“安靜”的狀態,儘量不產生各種中斷或者異常。

• 控制權移交給KernelInit(),產生usrRoot根任務,最後會調用usrAppInit.c中的usrAppInit()進行用戶級應用模塊的初始化。

此時,調試超級終端會有如下打印信息:

/*VXWORKS Image GettingLoaded*/

Loading... 881680

Starting at 0x10000…

 

Attached TCP/IPinterface to cpm unit 0

Attaching networkinterface lo0... done.

 

VxWorks

Copyright 1984-1998 WindRiver Systems, Inc.

         CPU : MPC860

     vxWorks : 5.4

  BSP version: 1.2/0

Creation date: Aug 22000

         WDB : Ready

3 ROM-residentImage

.text代碼段駐留在ROM/.Flash中運行,.data數據段和.bss段需要拷貝重定位到RAM中,且所使用的堆棧空間亦在RAM中。啓動流程和vxWorks_rom*映像基本相同,稍微不同的是romStart()中直接跳轉到usrInit,而不是usrEntry。至於爲什麼vxWorks_rom(Compress)需要usrEntry這個樁函數(Stub Routine),詳情參考後文《VxWorks/MIPS運行期的gp重定位》。

 

五 使用Tornado編譯VxWorks映象

Tornado2.2\target\config\all下的bootConfig.c/bootInit.c/usrConfig.c爲通用的bootrom/vxworks代碼模版。其中,bootConfig.c/bootInit.c是用來生成bootrom的,是通過工具欄裏的Build->Build BootRom生成的,相當於命令行;usrConfig.c是用於生成vxworks的。

需要注意的是如果使用手動編譯,則編譯的是usrConfig.c文件;如果在Tornado開發環境下編譯,則編譯的是Tornado根據用戶配置自動生成的prjConfig.c文件。

/* prjConfig.c - dynamicaly generatedconfiguration file */

工程下編譯就要按照prjConfig.c裏各個程序的封裝順序執行。

 

說明:

本文主要內容來自《VxWorks啓動過程詳解》,結合自己的理解重新整合組織,以方便日後查詢。

 

參考1:

VxWorks內核源代碼

VxWorks  6.x全部頭文件

VxWorks Source Code

VxWorks 5.5 Source Code

VxWorks  BSP for AMD(x86)

VxWorks  BSP for Intel's IXDP425(ARM)

VxWorks  BSP for Philips' LPC2210(ARM)

VxWorks  BSP for SAMSUNG's S3C2440X(ARM)

VxWorks  BSP for Motorola's MPC8260(PowerPC)

VxWorks  BSP for AMD's AU1500(MIPS) and Motorola's MPC8260(PowerPC)


參考2:

Tornado BSP Training Workshop》 

VxWorks 5.4 Programmer's Guide

vxworks_bsp_developers_guide_6.0

    2 Overview of BSP

《VxWorks下設備驅動程序及BSP開發指南》

    第12章 VxWorks映像及啓動順序

《VxWorks內核、設備驅動與BSP開發詳解》

    2.1.2 編譯BootRom

    4.3.1 編譯規則

    第23章 多樣化的主板——板級支持包BSP

《嵌入式實時操作系統VxWorks及其開發環境Tornado》

    10.4VxWorks的初始化

《VxWorks程序開發實踐》

    第9章 建立開發環境


參考3:

嵌入式系統VxWorks的啓動流程

VxWorks系統的BSP概念及啓動過程

VxWorks系統的映像及其裝載過程解析

romInit.s文件分析

VxWorks啓動代碼rominit.s分析


《VxWorks啓動過程描述及主要宏開關含義》

VxWorks啓動解析

BSP映像分析和啓動流程

VxWorks及BSP啓動流程與順序

基於VxWorks的BSP啓動過程實例分析

MVME162 FLASHRAMResident Bootable VxWorks System


參考4:

VxWorksBSP移植(基於lpc2210)

基於vxWorks的mpc8260 BSP啓動過程實例分析

源碼分析vxWorks6.x的ARM板BSP啓動過程(上)

源碼分析vxWorks6.x的ARM板BSP啓動過程(下)


VxWorks在龍芯處理器上的移植與實現

龍芯軟件開發(18)-- 乾坤大挪移,從ROM到RAM

龍芯軟件開發(19)-- C函數入口

 

參考5:

bootstrap到底是什麼意思

BootStrap運行流程解析

對於編譯vxWorks_rom中的生成vxWorks的疑問


嵌入式系統 BootLoader 技術內幕

Universal BootLoader

VxWorks的bootrom 到u-boot的移植心得

 

參考6:

《Windows深入剖析-內核篇》

    第3章 Windows內核引導過程

《Microsoft Windows Internals, FourthEdition》

    Chapter5. Startup and Shutdown

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