<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > uclinux啟動(dòng)過(guò)程詳細分析

uclinux啟動(dòng)過(guò)程詳細分析

作者: 時(shí)間:2018-08-31 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/201808/388126.htm

2) 為加載Boot Loader的Stage2準備RAM空間

3) 復制Boot Loader的Stage2到RAM空間中

4) 設置好堆棧

5) 跳轉到Stage2的C入口點(diǎn)

Boot Loader的Stage2通常包括如下步驟:

1) 始化本階段要使用的硬件設備

2) 檢測系統內存映射(Memory Map)

3) 將Kernel映象和根文件系統映象從FLASH上讀取到RAM空間中

4) 為內核設置啟動(dòng)參數

5) 調用內核

2.2 系統內存組織

由于嵌入式設備具有很好的制定性,因此通常硬件環(huán)境會(huì )變的千差萬(wàn)別。就算是用戶(hù)使用了相同的處理器芯片,但是也很有可能因為外圍設備電路設計的不同,而存在差異。對于BootLoader程序來(lái)說(shuō),存儲設備的與處理器的連接方式,與其息息相關(guān)。對于我們采用的S3C44B0微處理器來(lái)說(shuō),在系統加電之后,指令指針是指向0x00000000的,也就是說(shuō)系統是從0x00000000開(kāi)始之行。正是因為這個(gè)原因,通常這個(gè)地址空間我們會(huì )安排給FLASH存儲器。這樣我們可以將BootLoader啟動(dòng)代碼以及我們之后將會(huì )要啟動(dòng)的操作系統映像燒寫(xiě)到Flash里。對于RAM地址空間,S3C44B0芯片將其設定為從0x0C000000到0x0FFFFFFF一共64MB的范圍里。我們可以通過(guò)設定存儲器控制寄存器來(lái)重新設定RAM的大小。例如我們試驗采用的存儲設備安排如下:

0x00000000 – 0x003FFFFF 4MB Flash

0x0C000000 – 0x0C7FFFFF 8MB RAM

通常來(lái)說(shuō)對于系統的引導和操作系統的啟動(dòng),可以完全都在Flash中進(jìn)行,但是Flash存儲器的速度相對于RAM來(lái)說(shuō)會(huì )慢很多,因此出于速度上的考慮,我們通常會(huì )將啟動(dòng)代碼和操作系統的內核映像文件拷貝到RAM中之行。

下面我將對典型的BootLoader程序框架進(jìn)行分析。

2.3 Stage1階段

該階段的主要工作是完成對系統中斷向量的設置,初始化微處理器內部寄存器,初始化堆棧,初始化RAM地址空間,并且將Stage2部分的C代碼拷貝到RAM空間的指定地點(diǎn),然后跳轉到C代碼入口點(diǎn)繼續執行。對于這段代碼來(lái)說(shuō),做的都是一些準備工作,因此為了提高效率,這段代碼通常都是使用匯編語(yǔ)言來(lái)完成的。下面我將結合具體的代碼來(lái)分析一下Stage1的啟動(dòng)過(guò)程。

1)設置中斷向量

設置S3C44B0處理器定義的8種系統中斷的中斷向量地址。這八種系統中斷分別是復位中斷、未定義指令中斷、軟件中斷、指令預取異常中斷、數據異常中斷、地址異常中斷、IRQ中斷和FIQ中斷。這8個(gè)中斷通常是通過(guò)無(wú)條件跳轉的方式來(lái)實(shí)現的。具體的代碼如下。

__entry :

b ResetHandler /* Reset vector */

b HandlerUndef /* Undefined instruction */

b HandlerSWI /* SWI */

b HandlerPabort /* Prefetch abort */

b HandlerDabort /* Data abort */

b 。 /* Address exception */

b HandlerIRQ /* IRQ */

b HandlerFIQ /* FIQ */

2)初始化微處理器內部寄存器

這段代碼主要是要完成硬件部分的初始化,包括關(guān)閉中斷響應、初始化微處理器通用端口、設置CPU頻率等操作。不過(guò)需要注意的是,在進(jìn)行硬件初始化之前需要將微處理器的運行狀態(tài)轉換到SVC模式下。

MRS a1,CPSR /*; Pickup current CPSR*/

BIC a1,a1,#MODE_MASK /*; Clear the mode bits*/

ORR a1,a1,#SUP_MODE /*; Set the supervisor mode bits*/

ORR a1,a1,#LOCKOUT /*; Insure IRQ and FIQ intr are locked out*/

MSR CPSR_cxsf,a1 /*; Setup the new CPSR*/

3)初始化系統RAM空間

這個(gè)部分的工作主要是為之后啟動(dòng)代碼和內核映像的拷貝操作做準備,并且也為之后的C代碼的執行初始化堆棧。這部分的工作主要可以分成兩個(gè)部分來(lái)處理。首先,根據系統配置的存儲器特性來(lái)初始化相關(guān)的存儲器控制寄存器。在我們使用的S3C44B0處理器中,存儲空間被分成了BANK0-BANK7一共8個(gè)塊,分別由BANKCON0-BANKCON7控制各個(gè)塊存儲器的讀寫(xiě)時(shí)鐘和片選時(shí)鐘等信號參數。具體代碼如下:

ldr r0,=rBANKCON0

ldr r1,=0x700

str r1,[r0]

ldr r0,=rBANKCON1

ldr r1,=0x700 /* 0x7ffc */

str r1,[r0]

ldr r0,=rBANKCON2

ldr r1,=0x700 /* 0x7ffc */

str r1,[r0]

ldr r0,=rBANKCON3

ldr r1,=0x7568

str r1,[r0]

ldr r0,=rBANKCON4

ldr r1,=0x700 /* 0x7ffc */

str r1,[r0]

ldr r0,=rBANKCON5

ldr r1,=0x700 /* 0x7ffc */

str r1,[r0]

ldr r0,=rBANKCON6

ldr r1,=0x18008

str r1,[r0]

ldr r0,=rBANKCON7

ldr r1,=0x18000

str r1,[r0]

ldr r0,=rREFRESH

ldr r1,=0xac03e1

str r1,[r0]

ldr r0,=rBANKSIZE

ldr r1,=0x16

str r1,[r0]

ldr r0,=rMRSRB6

ldr r1,=0x020

str r1,[r0]

ldr r0,=rMRSRB7

ldr r1,=0x020

str r1,[r0]

初始化RAM空間的第二個(gè)部分就是初始化連接腳本文件中指定的需要清0的地址空間,將該斷地址空間的內容清0。該部分地址空間主要是用來(lái)存放C語(yǔ)言代碼中的全局變量等內容的。實(shí)現代碼如下:

LDR a1,=Image_ZI_Base /* Pickup the start of the BSS area */

MOV a3,#0 /* Clear value in a3 */

LDR a2,=Image_ZI_Limit /* Pickup the end of the BSS area */

CMP a1,a2

BEQ move_data

clear_loop :

STR a3,[a1],#4 /* Clear a word, a1 += 4 */

CMP a1,a2 /* end of ZI ? */

BNE clear_loop

4)為Stage2的C語(yǔ)言代碼的執行準備必要的堆棧

因為在Stage2階段一般都是采用C語(yǔ)言代碼來(lái)完成的,因此必須在使用C語(yǔ)言代碼之前先建立起必要的堆棧信息。通常為了避免堆棧數據被執行代碼破壞,通常都是放在RAM的高端地址,并且使得堆棧指針的增長(cháng)方向是向下增長(cháng)的。

5)將初始化代碼拷貝到RAM中,并且跳轉到RAM中執行。因為在我們采用的S3C44B0微處理器里對于FLASH和RAM地址空間是使用的統一編址的,因此我們可以直接使用一個(gè)簡(jiǎn)單循環(huán)來(lái)完成拷貝。



關(guān)鍵詞: uClinux cpu 控制器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>