<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

ldr r3, =0x10000 /* 64K Bytes */

ldr r2, =0xc700000

ldr r1, =0

next :

ldr r0,[r1],#4

str r0,[r2],#4

cmp r1,r3

bne next

6)跳轉到C代碼執行(即Stage2階段)

這個(gè)過(guò)程是直接給指令指針賦值于跳轉的C代碼的入口地址,在我們的試驗中該入口地址是Main。

LDR pc,=Main

2.4 Stage2階段

該階段的代碼主要使用C語(yǔ)言來(lái)實(shí)現的。該階段的工作主要是建立開(kāi)發(fā)板與宿主機之間的通信,加載內核映像文件和配置內核啟動(dòng)參數,并且啟動(dòng)內核。

嵌入式設備與宿主機的通訊方式有多種,最常用的是使用串口方式進(jìn)行數據交換。本試驗采用的S3C44B0微處理器提供了兩個(gè)UART口,因此我們可以任選其中一個(gè)來(lái)初始化并且使用它來(lái)與宿主機交互。對于串口的初始化主要是波特率、奇偶校驗、停止位、數據位等內容。

對于串口的波特率和波特因子的計算采用如下公式

Iubrd =((int(mclk/16 / baud + 0.5) – 1)

mclk是頻率、baud為波特率

2.4.1 檢測內存

該部分的功能主要是檢測系統在進(jìn)行硬件初始化的時(shí)候是否發(fā)生了內存映射錯誤,即是否物理地址是否被映射到不存在的地址空間。通常是使用讀寫(xiě)方式來(lái)檢測的,即以?xún)却骓?yè)為單位,在每個(gè)頁(yè)頭進(jìn)行讀寫(xiě)操作,比較讀寫(xiě)結果。因為S3C44B0處理器并不支持內存映射,因此我們在Stage2過(guò)程中并沒(méi)有包含該部分功能函數。

2.4.2 加載內核映像

該過(guò)程其實(shí)只是一個(gè)從Flash的指定位置(該位置是燒寫(xiě)的起始地址)拷貝到RAM中指定的地址空間里。在拷貝之前必須要為uClinux的全局變量結構,即啟動(dòng)參數、內核頁(yè)表、RAM的頁(yè)目錄等信息預留一定的空間。如果我們將FLASH和RAM看成連在一起的線(xiàn)性地址,則系統的空間分配會(huì )如下圖:

。..。..

Boot

初始化代碼

uClinux

未用

中斷向量表

初始化映像代碼

啟動(dòng)參數

內核映像

未用

堆棧

2.4.3 配置內核啟動(dòng)參數

我們采用的uClinux是2.4.x內核版本,該版本的內核支持參數啟動(dòng)過(guò)程。在嵌入式系統中,啟動(dòng)參數的傳入主要是依靠bootloader程序向標記列表(tagged list)的相關(guān)域中填寫(xiě)相應的值來(lái)完成的。

2.5 uClinux內核引導

當我們初始化完畢uClinux的啟動(dòng)參數之后,控制權就可以交給uClinux內核了,uClinux系統調用內核解壓函數(decompress_kernel)來(lái)對上一個(gè)階段拷貝的uClinux內核在RAM空間里進(jìn)行解壓(當然如果系統內核在建立的時(shí)候沒(méi)有配置成壓縮格式,則解壓過(guò)程略去)。在解壓完畢后,跳轉到內核調用函數(call_kernel),該函數實(shí)際上執行的是start_kernel(),這個(gè)函數包含了有關(guān)處理器初始化、中斷初始化、進(jìn)程初始化等操作。最后,將控制權完全的交與uClinux操作系統來(lái)執行。

偽處理過(guò)程如下:

IF(啟動(dòng)參數正確)

CALL decmporess_kernel()

CALL call_kernel()

ELSE

啟動(dòng)失敗

decompress_kernel()

{

解壓內核映像

}

call_kernel()

{

。..

start_kernel()

。..。

}

3 總結

本文是對S3C44B0的啟動(dòng)過(guò)程進(jìn)行了一次分析,啟動(dòng)部分的代碼可以說(shuō)是嵌入式設備開(kāi)發(fā)比較重要的部分。而且該部分的處理工作往往又比較麻煩,因此在這里我只是想起到拋磚引玉的作用。因為成文時(shí)間比較倉促,難免有錯誤,請大家批評指正。

==========================================================

《ARM7 uClinux開(kāi)發(fā)實(shí)驗與實(shí)踐》P130

Bootloader完成系統初始化工作后,將運行控制權交給uClinux內核。根據內核是否壓縮以及內核是否在本地執行,uClinux通常有以下兩種可選的啟動(dòng)方式:

(1)Flash本地運行方式。內核中未經(jīng)壓縮的可執行映像固化在Flash中,系統啟動(dòng)時(shí),內核在Flash中開(kāi)始逐句執行。

(2)壓縮內核加載方式。內核的壓縮映像固化在Flash上,系統啟動(dòng)時(shí),由附加在壓縮映像前的解壓復制程序讀取壓縮映像,并在內存中解壓后執行。這種方式相對復雜,但是運行速度更快。

首先介紹內核的Flash本地運行方式。

本地運行時(shí),內核的啟動(dòng)包括特定體系結構設置和uClinux系統初始化兩步,內核啟動(dòng)的入口文件是head-armv.s。


上一頁(yè) 1 2 3 4 5 6 7 8 9 10 11 下一頁(yè)

關(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>