一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

U-Boot重定位代碼分析

 rookie 2012-04-03

概述

重定位(relocate)代碼將BootLoader自身由Flash復(fù)制到SDRAM,以便跳轉(zhuǎn)到SDRAM執(zhí)行。之所以需要進(jìn)行重定位是因?yàn)樵?/span>Flash中執(zhí)行速度比較慢,而系統(tǒng)復(fù)位后總是從0x00000000地址取指。

重定位代碼,位于/U-Boot/cpu/s3c44b0/start.S

relocate:                /* relocate U-Boot to RAM              */

    adr r0, _start    /* r0 <- current position of code      */

    ldr r1, _TEXT_BASE    /* test if we run from flash or RAM    */

    cmp     r0, r1        /* don't reloc during debug         */

    beq     stack_setup

    ldr r2, _armboot_start

    ldr r3, _bss_start

    sub r2, r3, r2    /* r2 <- size of armboot    */

    add r2, r0, r2    /* r2 <- source end address */

copy_loop:

    ldmia r0!, {r3-r10}     /* copy from source address [r0]   */

    stmia r1!, {r3-r10}     /* copy to target address [r1] */

    cmp r0, r2               /* until source end address [r2]   */

    ble copy_loop

以上代碼首先判斷是否需要進(jìn)行重定位,如果需要的話首先確定復(fù)制的源基址、源大小和目標(biāo)基址,然后以r3 ~ r13為媒介,將BootLoader復(fù)制到SDRAM中。

分析

copy_loop很容易理解,這里主要分析relocate處的前兩條指令:

1.       adr r0, _start

adr是一條偽指令,匯編器總是試圖為它產(chǎn)生add/sub這樣的指令,(在這里)以pc為基址裝載目標(biāo)寄存器。以下是arm-elf-objdump產(chǎn)生的反匯編代碼:

c700048:   e24f0050 sub r0, pc, #80   ; 0x50

e24f0050是指令對(duì)應(yīng)的機(jī)器碼,c700048是存放該機(jī)器碼的地址(十六進(jìn)制表示)。這個(gè)地址是怎么來的呢?在/U-Boot/config.mk中有問題的答案:

LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)

上面的宏指定連接時(shí)的命令行參數(shù),-Ttext設(shè)定了.text段的地址,而TEXT_BASE/U-Boot/board/.../config.mk中定義為0x0C700000。這些信息最后都以硬編碼的方式記錄在程序映像文件中,程序的入口_start = TEXT_BASE = 0x0C700000

Disassembly of section .text:

0c700000 <_start>:

c700000: ea00000a b   c700030 <reset>
...

但是,程序映像是燒寫到Flash中并開始執(zhí)行的,而Flash的地址從0x00000000開始。于是,程序映像的第一條指令對(duì)齊到0x00000000處。相應(yīng)的,這條adr指令的地址應(yīng)對(duì)齊到0x00000048處,執(zhí)行后r0等于0。

2.       ldr r1, _TEXT_BASE

以下是arm-elf-objdump產(chǎn)生的反匯編代碼:

c70004c:   e51f1034 ldr r1, [pc, #-52]    ; c700020 <_TEXT_BASE>

由此可見,這里的ldr并不是簡(jiǎn)單的將_TEXT_BASE地址處的4字節(jié)裝載到r1,而同樣是以pc為基址計(jì)算得到源地址的。這里的pc = 0x4c + 8 = 0x54,于是該指令把0x54 – 52 = 0x20處的4字節(jié)(即TEXT_BASE,亦即0x0C700000)裝載到r1。

3.       源大小的確定

通過上面的分析,我們已經(jīng)有了一個(gè)概念:程序的實(shí)際執(zhí)行地址與連接時(shí)指定的加載地址可能是不一樣的。我們已經(jīng)得到BootLoader代碼開始的運(yùn)行時(shí)開始地址,存放于r0,還需要計(jì)算它的運(yùn)行時(shí)結(jié)束地址。運(yùn)行時(shí)結(jié)束地址 = 運(yùn)行時(shí)開始地址 + 代碼段大小。代碼段大小由.bss段的期望開始地址 - .text段的期望開始地址獲得。

小結(jié)

通過連接時(shí)的-Ttext選項(xiàng),將.text段的地址硬編碼到程序映像中。雖然程序映像在Flash中執(zhí)行,其實(shí)際執(zhí)行地址與期望執(zhí)行地址不一致,但在relocate之前,通過以pc為基址進(jìn)行相對(duì)尋址,使得這些代碼的執(zhí)行與其實(shí)際裝載的地址無關(guān)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产内射一级一片内射高清| 亚洲中文字幕视频在线观看| 午夜国产福利在线播放| 国产午夜福利在线观看精品| 欧美日韩少妇精品专区性色| 欧美成人免费一级特黄| 爱在午夜降临前在线观看| 青青操在线视频精品视频| 99少妇偷拍视频在线| 白丝美女被插入视频在线观看| 国产91人妻精品一区二区三区| 欧美av人人妻av人人爽蜜桃| 亚洲综合色在线视频香蕉视频| 欧美精品日韩精品一区| 老司机精品线观看86| 免费国产成人性生活生活片| 国产欧美性成人精品午夜| 欧美av人人妻av人人爽蜜桃 | 成人午夜视频在线播放| 精品欧美在线观看国产| 国产又色又爽又黄的精品视频| 日本人妻的诱惑在线观看| 开心久久综合激情五月天| 尤物天堂av一区二区| 国产成人精品一区在线观看| 国产欧美高清精品一区| 久久精品亚洲精品国产欧美| 91偷拍与自偷拍精品| 黄片免费观看一区二区| 国产一级精品色特级色国产| 免费大片黄在线观看日本| 精品国产亚洲av久一区二区三区| 激情内射亚洲一区二区三区| 欧美同性视频免费观看| 91亚洲熟女少妇在线观看| 欧美成人欧美一级乱黄| 91亚洲国产成人久久精品麻豆| 亚洲欧美视频欧美视频| 国产女高清在线看免费观看| 精品国产亚洲av久一区二区三区| av国产熟妇露脸在线观看|