色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

          本文引用地址:http://cafeforensic.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)跳轉(zhuǎn)到C代碼執(zhí)行(即Stage2階段)

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

          LDR pc,=Main

          2.4 Stage2階段

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

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

          對(duì)于串口的波特率和波特因子的計(jì)算采用如下公式

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

          mclk是頻率、baud為波特率

          2.4.1 檢測(cè)內(nèi)存

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

          2.4.2 加載內(nèi)核映像

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

          。..。..

          Boot

          初始化代碼

          uClinux

          未用

          中斷向量表

          初始化映像代碼

          啟動(dòng)參數(shù)

          內(nèi)核映像

          未用

          堆棧

          2.4.3 配置內(nèi)核啟動(dòng)參數(shù)

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

          2.5 uClinux內(nèi)核引導(dǎo)

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

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

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

          CALL decmporess_kernel()

          CALL call_kernel()

          ELSE

          啟動(dòng)失敗

          decompress_kernel()

          {

          解壓內(nèi)核映像

          }

          call_kernel()

          {

          。..

          start_kernel()

          。..。

          }

          3 總結(jié)

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

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

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

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

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

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

          首先介紹內(nèi)核的Flash本地運(yùn)行方式。

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


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

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

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉