亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 6280 | 回復(fù): 14
打印 上一主題 下一主題

[轉(zhuǎn)]基于ARM的嵌入式BootLoader設(shè)計(jì)與啟動(dòng)過(guò)程 [復(fù)制鏈接]

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-07-08 16:20 |只看該作者 |倒序?yàn)g覽
作者:?jiǎn)纬袆?戴學(xué)豐 劉樹(shù)東 崔登志  來(lái)源于: 微計(jì)算機(jī)信息  發(fā)布時(shí)間:2007-5-26 11:34:00
摘要:本文總結(jié)了基于S3C44B0X芯片的Bootloader代碼設(shè)計(jì)的一般流程,具體說(shuō)明了Bootloader完成的主要任務(wù),實(shí)現(xiàn)方法和地址重映射的概念;給出了S3C44B0X在基于uCLinux操作系統(tǒng)的嵌入式應(yīng)用中,Bootloader的引導(dǎo)過(guò)程及關(guān)鍵技術(shù)和代碼,有著很好的借鑒價(jià)值。
關(guān)鍵詞: 嵌入式系統(tǒng)  Bootloader代碼  地址重映射  S3C44B0X  uCLinux  

1 引言

近年來(lái),ARM在嵌入式設(shè)備中的應(yīng)用越來(lái)越廣泛。S3C44B0X就是Samsung公司生產(chǎn)的基于ARM7架構(gòu)的微處理器。uCLinux是專(zhuān)門(mén)為無(wú)MMU處理器設(shè)計(jì)的嵌入式操作系統(tǒng),支持ARM、Motorola等處理器。采用ARM+uCLinux作為嵌入式開(kāi)發(fā)平臺(tái),吸取了兩者優(yōu)點(diǎn),是一種比較流行的開(kāi)發(fā)方式。在ARM程序設(shè)計(jì)中,啟動(dòng)代碼是至關(guān)重要的,它不僅初始化硬件系統(tǒng)本身,而且最終引導(dǎo)進(jìn)入操作系統(tǒng),所以啟動(dòng)代碼的設(shè)計(jì)直接影響整個(gè)開(kāi)發(fā)的正常進(jìn)行。本文結(jié)合S3C44B0X的特點(diǎn)詳細(xì)給出了Bootloader設(shè)計(jì)和啟動(dòng)過(guò)程。

2 BootLoader代碼

    Bootloader代碼是芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,主要是為操作系統(tǒng)提供基本的運(yùn)行環(huán)境,由它最終將操作系統(tǒng)啟動(dòng)起來(lái)并將控制權(quán)交給操作系統(tǒng)內(nèi)核。

Bootloader代碼由匯編代碼和C代碼兩部分組成。由于資源有限,Bootloader、uCLinux內(nèi)核映象、文件系統(tǒng)(Ramdisk壓縮映象)通常都是固化在Flash中的。在S3C44B0X架構(gòu)的嵌入式系統(tǒng)中,為了保證上電或復(fù)位時(shí)正常運(yùn)行, Bootloader必須存放在Flash(0x0-0x400000,

4M)中的0x0處,則在硬件設(shè)計(jì)中把Flash接在CPU的nGCS0處[1]。上電后 Bootloader首先完成存儲(chǔ)器、堆棧、寄存器、全局變量和基本硬件模塊的初始化,這由匯編代碼完成,然后將操作系統(tǒng)內(nèi)核與文件系統(tǒng)調(diào)入SDRAM (0x0c000000-0x0c800000,8M)中,并將PC指針指向操作系統(tǒng)內(nèi)核的入口處,為操作系統(tǒng)的運(yùn)行作好準(zhǔn)備,這由C代碼完成。

3 BootLoader代碼設(shè)計(jì)流程

    ARM芯片多數(shù)為復(fù)雜的片上系統(tǒng)(SOC),系統(tǒng)里許多硬件模塊都可由軟件來(lái)設(shè)置。系統(tǒng)的初始化直接聯(lián)系到處理器內(nèi)核和硬件控制器,進(jìn)行編程一般用匯編語(yǔ)言。根據(jù)具體的目標(biāo)系統(tǒng),Bootloader的設(shè)計(jì)流程包括:⑴設(shè)置異常向量表 ⑵初始化存儲(chǔ)器系統(tǒng) ⑶堆棧初始化 ⑷C例程全局變量初始化 ⑸呼叫主程序

3.1 設(shè)置異常中斷向量表

ARM處理器的中斷向量表從地址0x0處開(kāi)始存放,連續(xù)有8×4字節(jié)的空間。在ARM存儲(chǔ)空間里每個(gè)字32位,占4個(gè)字節(jié)?梢酝ㄟ^(guò)圖1來(lái)描述中斷向量表的地址分配。

每當(dāng)有中斷或者異常發(fā)生時(shí),ARM處理器便強(qiáng)制把PC指針指向向量表中對(duì)應(yīng)中斷類(lèi)型的地址值。為了加快中斷響應(yīng),我們?cè)贔lash的0x0地址存放能跳轉(zhuǎn)到0x0c000008地址處中斷向量的跳轉(zhuǎn)指令,即在RAM中建立一個(gè)二級(jí)中斷向量表,起始地址為0x0c000008,除復(fù)位外,其它異常入口地址由Flash跳轉(zhuǎn)得到,如表1所示:

       圖 1 中斷向量表                 表 1 異常向量表跳轉(zhuǎn)關(guān)系

3.2 初始化存儲(chǔ)器系統(tǒng)

存儲(chǔ)器系統(tǒng)的初始化是指對(duì)Flash、RAM存儲(chǔ)器的地址范圍,數(shù)據(jù)總線(xiàn)寬度及DRAM的刷新等進(jìn)行軟件設(shè)置。設(shè)置對(duì)象是存儲(chǔ)器控制寄存器,芯片不同具體的設(shè)置不同。本文僅以開(kāi)發(fā)中用到S3C44B0X為例,說(shuō)明這部分程序設(shè)計(jì)的過(guò)程。

memsetup:  ldr       r0, =MEMORY_CONFIG

               ldmia       r0, {r1-r13}

               ldr          r0, =0x01c80000

               stmia       r0, {r1-r13}

其中MEMORY_CONFIG地址處定義了配置rBWSCON, rBANKCONn(n=0-7),rREFRESH,

rBANKSIZE,rMRSRB6,rMRSRB7寄存器的值(依次為0x11000100,0x700,0x700,0x7ffc,0x7568

,0x700,0x700,0x18008,0x18000,0xac03e1,0x16,0x020,0x020)。

圖 2 地址映射關(guān)系

地址重映射通常把位于Flash的0x0處異常向量表映射到更快、更寬(32bit/16bit)的RAM中,并把0地址重新指向到RAM中去.圖2描述了Remap前后的地址映射關(guān)系,復(fù)位時(shí)ROM定位到0x0,實(shí)際的跳轉(zhuǎn)地址為ROM的Reset Handler處,Remap后0x0的ROM替換為RAM,并把中斷向量表拷貝到0x0。Remap的實(shí)現(xiàn)和ARM處理器硬件特性相關(guān)。在 S3C44B0X系統(tǒng)中,既沒(méi)有MMU也不支持Remap,為了實(shí)現(xiàn)快的啟動(dòng)和異常處理速度,在Bootloader程序設(shè)計(jì)中,我們把RAM中的 0x0c000008地址當(dāng)成0x0地址處理,即在這里開(kāi)始存放程序中斷向量,而在Flash的0x0地址存放能跳轉(zhuǎn)到0x0c000008地址處中斷向量的跳轉(zhuǎn)指令。支持Remap的處理器有的通過(guò)寄存器的相應(yīng)Bit位置1來(lái)完成,有的通過(guò)軟件設(shè)計(jì)改寫(xiě)Memory起始地址的Bank寄存器完成[2]。

[ 本帖最后由 dreamice 于 2008-7-8 16:25 編輯 ]

figure1.gif (7.64 KB, 下載次數(shù): 62)

figure1.gif

figure2.gif (4.91 KB, 下載次數(shù): 71)

figure2.gif

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [報(bào)告]
發(fā)表于 2008-07-08 16:21 |只看該作者

繼續(xù):

3.3 初始化堆棧

ARM處理器有7種工作模式,每種模式都有獨(dú)立的堆棧指針寄存器(SP),并定義相應(yīng)地址。改變狀態(tài)寄存器(CPSR)的狀態(tài)位,可使處理器切換到不同模式,然后給SP賦值,就實(shí)現(xiàn)了堆棧的初始化。需注意的是:不要切換到用戶(hù)模式進(jìn)行本模式的堆棧設(shè)置,因?yàn)檫M(jìn)入該模式后就不能修改CPSR回到別的模式了,會(huì)影響程序的順利執(zhí)行[3]。初始化堆棧的代碼如下所示:(以2個(gè)不同的SP寄存器SP_IRQ、SP_FIQ為例)

InitStacks:  mrs  r0,cpsr                 ;CPSR=》R0

             bic  r0,r0,#MODEMASK|NOINT   ;屏蔽模式位和中斷

orr  r1,r0,#IRQMODE|NOINT    ;MODEMASK =0x1f, NOINT = 0x80

            msr  cpsr_cxsf,r1            ;轉(zhuǎn)到IRQ模式

            ldr  sp,=IRQStack            ;設(shè)置SP_irq

             orr  r1,r0,#FIQMODE            

            msr  cpsr_cxsf,r1             ;轉(zhuǎn)到FIQ模式

            ldr  sp,=FIQStack  

3.4 C例程全局變量初始化

全局變量的初始化,就是完成從ROM到RAM的數(shù)據(jù)傳輸和內(nèi)容清零?蓤(zhí)行程序的映像結(jié)構(gòu)由RO段、RW段和ZI段三部分組成,分別為只讀數(shù)據(jù)段、可寫(xiě)數(shù)據(jù)段和堆棧段。其中RO段在Flash和RAM里都可運(yùn)行;而RW和ZI段是必須轉(zhuǎn)移到RAM中去的。盡管RAM的運(yùn)行速度比Flash快的多,但由于RO段比較小,拷貝到RAM也需要時(shí)間,還要程序跳轉(zhuǎn),一比較兩者的啟動(dòng)時(shí)間差不多,最終我們選擇讓RO段在Flash中運(yùn)行。

開(kāi)發(fā)工具中的鏈接器(Linker)提供了一定的機(jī)制來(lái)幫助我們完成這部分工作,其中|Image$$ZI$$ Base|,|Image$$ZI$$Limit|,|Image$$RW$$Base|,|Image$$RO$$Limit|是由鏈接器定義輸出的。主要是輸出段的起始和終止定位信息,具體程序?qū)崿F(xiàn)如下:

startram :  LDR    a1,=|Image$$ZI$$Base|    ;ZI段在RAM里面的起始地址

            MOV   a3,#0                    ;寄存器清0               

            LDR   a2,=|Image$$ZI$$Limit|   ;ZI段在RAM里面的結(jié)束地址

            CMP   a1,a2                                                

            BEQ   move_data                                            

clear_loop : STR   a3,[a1],#4               ;清一個(gè)字為0, a1 += 4   

            CMP   a1,a2                                                   

            BNE   clear_loop                                                                                                                                                                                      

move_data   LDR    a1,=|Image$$RW$$Base|    ;RW段在RAM中的起始地址   

           LDR    a2,=|Image$$RO$$Limit|   ;RW段在ROM中的起始地址   

            LDR    a3,=|Image$$ZI$$Base|    ;RW段在RAM中的結(jié)束地址                                                                              

           CMP    a1,a3                                                

           BEQ    goto_main                                            

move_loop : LDR    a4,[a2],#4                                          

           STR    a4,[a1],#4               ;拷貝一個(gè)字,a1 += 4, a2 += 4

           CMP    a1,a3                                 

           BNE    move_loop                                                                                         

goto_main :  BL   Main

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [報(bào)告]
發(fā)表于 2008-07-08 16:22 |只看該作者

接上

3.5 呼叫主程序

當(dāng)系統(tǒng)初始化完成后,就要轉(zhuǎn)入主程序,可由跳轉(zhuǎn)指令來(lái)完成。這部分代碼為C程序,主要負(fù)責(zé)uCLinux內(nèi)核拷貝、 Ramdisk文件系統(tǒng)加載、設(shè)置啟動(dòng)參數(shù)和串口通信等功能.程序最終完成內(nèi)核壓縮文件和Ramdisk到RAM的拷貝,后跳轉(zhuǎn)到RAM中Linux Kernel的首地址,并交出控制權(quán),到此Bootloader的任務(wù)完成。其中uCLinux在RAM中的空間分配為0x0c000000

-0x0c008000(uCLinux內(nèi)核調(diào)度用),0x0c008000-0x0c300000(uCLinux Kernel),0x0c300000

-0x0c800000(uCLinux Ramdisk)。以下程序?yàn)閡CLinux內(nèi)核和Ramdisk文件系統(tǒng)拷貝過(guò)程,F(xiàn)LASH_UC_KERNEL,F(xiàn)LASH_UC_RAMDISK分別為內(nèi)核和文件系統(tǒng)在Flash的起始地址,RAM_UC

_ZIMAGE,RAM_UC_RAMDISK分別為RAM中uCLinux內(nèi)核和文件系統(tǒng)的起始地址,F(xiàn)LASH_LEN_UC_

KERNEL,F(xiàn)LASH_LEN_UC_RAMDISK分別為兩者大小,拷貝完后,PC指針指向RAM_UC_ZIMAGE。程序主要部分如下:

/* Copy  uClinux Kernel */

    pSource = (unsigned int *)FLASH_UC_KERNEL;

    pDest = (unsigned int *)RAM_UC_ZIMAGE;

    for (loopcnt = 0;loopcnt < (FLASH_LEN_UC_KERNEL>>2);loopcnt++)

    {   *pDest++ = *pSource ++;  }

/* Copy ramdisk */

    pSource = (unsigned int *)FLASH_UC_RAMDISK;

    pDest = (unsigned int *)RAM_UC_RAMDISK;

    for (loopcnt = 0;loopcnt< (FLASH_LEN_UC_RAMDISK>>2); loopcnt++)

    {   *pDest++ = *pSource ++;  }

/* Start Kernel */

    fp = (UClinux_Entry)RAM_UC_ZIMAGE;

    (*fp)(0);

4  uCLinux操作系統(tǒng)啟動(dòng)過(guò)程

本系統(tǒng)采用RAM中啟動(dòng)方式,將Flash中的內(nèi)核先拷貝到RAM的某一段地址區(qū)間,再?gòu)脑搮^(qū)間的首地址運(yùn)行 uCLinux內(nèi)核。當(dāng)Bootloader完成系統(tǒng)初始化和拷貝完內(nèi)核和Ramdisk以后,交出控制權(quán),系統(tǒng)開(kāi)始從RAM中執(zhí)行uCLinux內(nèi)核的引導(dǎo)程序Head.s,并將控制權(quán)交給它。在uCLinux中,Head.s在uCLinux-dist/linux- 2.4.x/arch/armnommu/boot/compressed/head.s

里。Head.s非常關(guān)鍵,它完成了加載內(nèi)核的大部分工作,主要是調(diào)用Misc.c中的解壓內(nèi)核函數(shù) (decompress_kernel)來(lái)完成,另外內(nèi)核的加載還必須知道系統(tǒng)必要的硬件信息,該硬件信息在hardware.h中并被Head.s所引用。最后跳轉(zhuǎn)到調(diào)用內(nèi)核函數(shù)(call_kernel),將控制權(quán)交給解壓后的uCLinux系統(tǒng)[4]。系統(tǒng)啟動(dòng)后將加載Ramdisk文件系統(tǒng),進(jìn)入用戶(hù)shell程序。
5  結(jié)束語(yǔ)

   本系統(tǒng)采用Bootloader完成操作系統(tǒng)內(nèi)核和文件系統(tǒng)拷貝到RAM的設(shè)計(jì)方法,提高了系統(tǒng)的實(shí)時(shí)性。目前,啟動(dòng)代碼已經(jīng)正常引導(dǎo)uCLinux操作系統(tǒng),并實(shí)現(xiàn)了對(duì)輪式移動(dòng)機(jī)器人驅(qū)動(dòng)系統(tǒng)的控制,該嵌入式系統(tǒng)運(yùn)行穩(wěn)定,完全實(shí)現(xiàn)了設(shè)計(jì)目的。由于所選處理器的關(guān)系,本文的Bootloader是不支持Remap芯片的,但啟動(dòng)裝載程序的原理都一樣,只要稍作修改就可用于支持Remap和MMU的芯片,而且對(duì)于其他操作系統(tǒng)同樣適用。

參考文獻(xiàn)

1 嚴(yán)國(guó)清,熊建設(shè).S3C44B0X中BootLoader的實(shí)現(xiàn).[J].數(shù)據(jù)采集與嵌入式系統(tǒng).2004,(6):40-43

2 姜京梅,郭樹(shù)旭.ARM7啟動(dòng)代碼設(shè)計(jì)方法與流程.[J].微計(jì)算機(jī)信息,2004,(20):78-79

3 費(fèi)浙平.基于ARM的嵌入式系統(tǒng)開(kāi)發(fā)—系統(tǒng)的初始化過(guò)程.[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003.9,80-83

4 黃克彬,葉 梧,馮穗力.基于ARM+uCLinux嵌入式系統(tǒng)啟動(dòng)引導(dǎo)的實(shí)現(xiàn).[J].電子技術(shù)應(yīng)用. http://

www.cvtech.com.cn/tech_detail.asp?newsid=223

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [報(bào)告]
發(fā)表于 2008-07-08 16:23 |只看該作者
不知道為什么,貼不上圖。希望驅(qū)動(dòng)版面能夠活躍起來(lái)!

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-07-08 16:49 |只看該作者
對(duì)嵌入式不是很懂

請(qǐng)問(wèn)嵌入式bootloader不需要保護(hù)模式嗎

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [報(bào)告]
發(fā)表于 2008-07-08 17:14 |只看該作者
bootloader是系統(tǒng)啟動(dòng)前加載的一段代碼,在X86上相當(dāng)于bios執(zhí)行的那段代碼,所以應(yīng)該是運(yùn)行于實(shí)模式的。一般的嵌入式系統(tǒng),bootloader也分為兩個(gè)部分,實(shí)際上都是在運(yùn)行操作系統(tǒng)之前執(zhí)行的代碼。不知道我說(shuō)清楚沒(méi)有。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-07-08 17:40 |只看該作者
那么,uclinux會(huì)不會(huì)進(jìn)入保護(hù)模式?
uclinux和linux出了mmu的區(qū)別,其他的多嗎?

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [報(bào)告]
發(fā)表于 2008-07-08 17:52 |只看該作者
對(duì)uCLinux 來(lái)說(shuō),其設(shè)計(jì)針對(duì)沒(méi)有MMU的處理器,不能使用處理器的虛擬內(nèi)存管理技術(shù)。uCLinux仍然采用存儲(chǔ)器的分頁(yè)管理,系統(tǒng)在啟動(dòng)時(shí)把實(shí)際存儲(chǔ)器進(jìn)行分頁(yè)。uCLinux系統(tǒng)對(duì)于內(nèi)存的訪(fǎng)問(wèn)是直接的,所有程序中訪(fǎng)問(wèn)的地址都是實(shí)際的物理地址。操作系統(tǒng)對(duì)內(nèi)存空間沒(méi)有保護(hù),各個(gè)進(jìn)程實(shí)際上共享一個(gè)運(yùn)行空間。一個(gè)進(jìn)程在執(zhí)行前,系統(tǒng)必須為進(jìn)程分配足夠的連續(xù)地址空間,然后全部載入主存儲(chǔ)器的連續(xù)空間中。
uClinux中沒(méi)有fork()和brk()系統(tǒng)調(diào)用,調(diào)用fork()將復(fù)制出進(jìn)程來(lái)創(chuàng)建一個(gè)子進(jìn)程。在Linux下,fork()是使用copy-on-write頁(yè)面來(lái)實(shí)現(xiàn)的。由于沒(méi)有MMU, uclinux不能完整、可靠地復(fù)制一個(gè)進(jìn)程,也沒(méi)有對(duì)copy-on-write的存取。uClinux實(shí)現(xiàn)了vfork(),當(dāng)父進(jìn)程調(diào)用vfork()來(lái)創(chuàng)建子進(jìn)程時(shí),兩個(gè)進(jìn)程共享它們的全部?jī)?nèi)存空間,包括堆棧。子進(jìn)程要么代替父進(jìn)程執(zhí)行(此時(shí)父進(jìn)程已經(jīng)sleep)直到子進(jìn)程調(diào)用exit()退出,要么調(diào)用exec()執(zhí)行一個(gè)新的進(jìn)程,這個(gè)時(shí)候?qū)a(chǎn)生可執(zhí)行文件的加載。

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [報(bào)告]
發(fā)表于 2008-07-08 17:55 |只看該作者
uClinux是針對(duì)控制領(lǐng)域的嵌入式linux操作系統(tǒng),它從Linux 2.0/2.4內(nèi)核派生而來(lái),沿襲了主流Linux的絕大部分特性。適合不具備內(nèi)存管理單元(MMU)的微處理器/微控制器。
其他的差異,不是特別了解。我想,uClinux的中進(jìn)程的調(diào)度策略,文件系統(tǒng)等等,要比linux標(biāo)準(zhǔn)版本滯后一些(個(gè)人猜測(cè))。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2008-07-08 18:01 |只看該作者
謝謝你的回復(fù)。
這么說(shuō),uclinux的父子進(jìn)程不能同時(shí)運(yùn)行了?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP