那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

u-boot在匯編啟動階段的相關(guān)操作介紹

麥辣雞腿堡 ? 來源:CSDN博客 ? 作者:內(nèi)核新視界 ? 2023-12-07 11:22 ? 次閱讀

u-boot在匯編啟動階段對系統(tǒng)的一些初始化

當(dāng)cpu交由u-boot接管進(jìn)入u-boot后, 首先會到_start符號處開始執(zhí)行初始化, 并在此期間完成一些必要的系統(tǒng)寄存器相關(guān)的初始化,包括保存boot參數(shù), 進(jìn)行地址無關(guān)fixed,系統(tǒng)寄存器復(fù)位,底層平臺相關(guān)初始化等 ,啟動代碼位于arch/arm/cpu/armv8/start.S,入口地址為_start。

啟動前為后續(xù)流程做的一些平臺相關(guān)操作

從_start開始,u-boot會根據(jù)board定義做一些平臺化相關(guān)的初始化工作或者是保存一些重要寄存器信息,代碼如下:

/*************************************************************************
 *
 * Startup Code (reset vector)
 *
 *************************************************************************/

.globl _start
_start: ------------------------------------------------------------------------ (1)
#if defined(CONFIG_LINUX_KERNEL_IMAGE_HEADER) ---------------------------------- (2)
#include < asm/boot0-linux-kernel-header.h >
#elif defined(CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK) -------------------------------- (3)
/*
 * Various SoCs need something special and SoC-specific up front in
 * order to boot, allow them to set that in their boot0.h file and then
 * use it here.
 */
#include < asm/arch/boot0.h >
#else
    b reset ----------------------------------------------------------------- (4)
#endif

    .align 3

.globl _TEXT_BASE ------------------------------------------------------------ (5)
_TEXT_BASE:
    .quad CONFIG_SYS_TEXT_BASE

/*
 * These are defined in the linker script.
 */
.globl _end_ofs -------------------------------------------------------------- (5)
_end_ofs:
    .quad _end - _start

.globl _bss_start_ofs
_bss_start_ofs:
    .quad __bss_start - _start

.globl _bss_end_ofs
_bss_end_ofs:
    .quad __bss_end - _start

reset:
    /* Allow the board to save important registers */
    b save_boot_params ----------------------------------------------------- (6)
.globl save_boot_params_ret
save_boot_params_ret:

... /* 此處省略無關(guān)代碼,待分析到時再展開代碼 */
...
WEAK(save_boot_params)
    b save_boot_params_ret /* back to my caller */
ENDPROC(save_boot_params)

#endif
  • ? (1)_start段標(biāo)記為全局可見并在鏈接腳本中被聲明為入口地址,表示u-boot的入口地址為_start;
  • ? (2)首先進(jìn)入入口后有兩種可配置情況,一種就是定義了LINUX_KERNEL_IMAGE_HEADER,boot0-linux-kernel-header.h展開部分后如下:
.macro le64sym, sym
    .long sym()_lo32
    .long sym()_hi32
    .endm

.globl _start
_start:
    /*
     * DO NOT MODIFY. Image header expected by Linux boot-loaders.
     */
    b reset    /* branch to kernel start, magic */
    .long 0    /* reserved */
    le64sym _kernel_offset_le  /* Image load offset from start of RAM, little-endian */
    le64sym _kernel_size_le   /* Effective size of kernel image, little-endian */
    le64sym _kernel_flags_le  /* Informative flags, little-endian */
    .quad 0    /* reserved */
    .quad 0    /* reserved */
    .quad 0    /* reserved */
    .ascii "ARMx64"   /* Magic number */
    .long 0    /* reserved */

此處將與在鏈接腳本中定義的LINUX_KERNEL_IMAGE_HEADER對應(yīng)起來,為u-boot頭部添加一個類似與Linux arm64 的Image頭部,首先是起始8字節(jié), 如果沒有定義efi相關(guān)的功能則是一個跳轉(zhuǎn)指令,跳轉(zhuǎn)到reset段繼續(xù)執(zhí)行啟動流程 ,其他如鏈接腳本中解釋一致;

  • ? (3)第二種可能的配置,就是定義了ENABLE_ARM_SOC_BOOT0_HOOK配置,此處的頭文件根據(jù)不同board會引用到不同頭文件,如瑞芯微的最終會引用到如下部分代碼頭文件:
#ifdef CONFIG_SPL_BUILD
    /*
     * We need to add 4 bytes of space for the 'RK33' at the
     * beginning of the executable.  However, as we want to keep
     * this generic and make it applicable to builds that are like
     * the RK3368 (TPL needs this, SPL doesn't) or the RK3399 (no
     * TPL, but extra space needed in the SPL), we simply insert
     * a branch-to-next-instruction-word with the expectation that
     * the first one may be overwritten, if this is the first stage
     * contained in the final image created with mkimage)...
     */
    b 1f  /* if overwritten, entry-address is at the next word */
1:
#endif
#if CONFIG_IS_ENABLED(ROCKCHIP_EARLYRETURN_TO_BROM)
    adr     r3, entry_counter
    ldr r0, [r3]
    cmp r0, #1           /* check if entry_counter == 1 */
    beq reset            /* regular bootup */
    add     r0, #1
    str r0, [r3]         /* increment the entry_counter in memory */
    mov     r0, #0           /* return 0 to the BROM to signal 'OK' */
    bx lr               /* return control to the BROM */
entry_counter:
    .word   0
#endif

#if (defined(CONFIG_SPL_BUILD) || defined(CONFIG_ARM64))
    /* U-Boot proper of armv7 do not need this */
    b reset
#endif

#if !defined(CONFIG_ARM64)
    /*
     * For armv7, the addr '_start' will used as vector start address
     * and write to VBAR register, which needs to aligned to 0x20.
     */
    .align(5), 0x0
_start:
    ARM_VECTORS
#endif

#if !defined(CONFIG_TPL_BUILD) && defined(CONFIG_SPL_BUILD) && 
    (CONFIG_ROCKCHIP_SPL_RESERVE_IRAM > 0)
    .space CONFIG_ROCKCHIP_SPL_RESERVE_IRAM /* space for the ATF data */
#endif

因為有些設(shè)備boot到u-boot之前已經(jīng)有安全固件了,

所以此時控制權(quán)交給u-boot時,其實是可能有一些傳遞參數(shù)信息的要求,比如這里瑞芯微芯片通過bootrom boot到tpl后,

后續(xù)在完成tpl初始化后會將控制權(quán)再交還給bootrom固件,由bootrom固件繼續(xù)加載spl,

所以這里在進(jìn)行u-boot流程之前保存了bootrom的返回地址,以便后續(xù)瑞芯微板級軟件使用。

定義有可能也是arm32的模式,所以還可能在入口地址處保存異常向量表;

  • ? (4)如果對應(yīng)board沒有上述兩種需求,那么_start段則是一條最簡單的跳轉(zhuǎn)指令b reset跳轉(zhuǎn)到reset處繼續(xù)啟動流程初始化;
  • ? (5)在_start到reset之間,有一個.align 3用于8字節(jié)對齊,因為可能在讀取常量地址之前各自平臺做了自己代碼邏輯導(dǎo)致當(dāng)前地址并不是8字節(jié)對齊的, 這里不管是否對齊都強制對齊了一下,之后還保存了一些常量信息,其中包括_TEXT_BASE保存了鏈接地址,用于在啟動地址無關(guān)功能時進(jìn)行對運行時地址的偏移計算,其他幾個偏移值目前未使用;
  • ? (6)save_boot_params用于保存一些board相關(guān)的重要寄存器,此處定義為了一個弱函數(shù),為直接跳轉(zhuǎn)回save_boot_params_ret繼續(xù)往下執(zhí)行,如果某些board需要保存寄存器參數(shù)則可以在自己的lowlevel.S文件中實現(xiàn)此函數(shù)。 一般由atf,bl2或者rom跳轉(zhuǎn)到spl或u-boot時廠商可能需要在兩個固件之間傳遞參數(shù),比如由bl2在寄存器x0,x1,x2中分別存入了一些固件的地址信息,那么u-boot則可以在早期通過此函數(shù)保存這些信息,并在后續(xù)某個時機中使用。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9165

    瀏覽量

    369176
  • 匯編
    +關(guān)注

    關(guān)注

    2

    文章

    214

    瀏覽量

    26005
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    125

    瀏覽量

    28348
收藏 人收藏

    評論

    相關(guān)推薦

    U-Boot介紹

    移植 Linux之前我們需要先移植一個 bootloader 代碼,這個 bootloader 代碼用于啟動 Linux 內(nèi)核, bootloader有很多,常用的就是 U-Boot。
    的頭像 發(fā)表于 10-08 10:50 ?4191次閱讀

    U-Boot代碼執(zhí)行流程詳解

    U-Boot通常是從架構(gòu)相關(guān)匯編文件(尾綴為大寫S的匯編文件意為可鏈接)中獲取第一條執(zhí)行的指令,
    發(fā)表于 10-19 15:22 ?1104次閱讀
    <b class='flag-5'>U-Boot</b>代碼執(zhí)行流程詳解

    U-boot的基本介紹

    從本文開始,將陸續(xù)推送“手把手教你移植U-boot”系列文章,目標(biāo)是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認(rèn)硬件開發(fā)平臺為ARM,
    發(fā)表于 07-14 16:52 ?3130次閱讀
    <b class='flag-5'>U-boot</b>的基本<b class='flag-5'>介紹</b>

    U-BOOT啟動流程分享

    Bootloader移植(下)U-BOOT 啟動流程u-boot啟動三個2啟動步驟(重點)U-boot
    發(fā)表于 01-18 10:17

    U-Boot啟動及移植分析

    bootloader 開發(fā)是嵌入式系統(tǒng)必不可少而且十分重要的部分,U-Boot 為功能強大的bootloader 開發(fā)軟件。本文詳細(xì)分析了U-Boot啟動流程,并結(jié)合其源碼,闡述了U-Bo
    發(fā)表于 09-01 16:34 ?27次下載

    嵌入式U-BOOT啟動流程及移植

    摘要:嵌入式系統(tǒng)一般沒有通用的bootloader,u-boot是功能強大的bootloader開發(fā)軟件,但相對也比較復(fù)雜。文中對u-boot啟動流程作了介紹,詳細(xì)給出了
    發(fā)表于 02-25 16:00 ?59次下載

    基于ARM9的U-Boot自動識別啟動實現(xiàn)

    嵌入式ARM9系列處理器支持U-Boot從Nor FLASH或者Nand FLASH啟動,也支持U-Boot直接下載到內(nèi)存中調(diào)試運行,根據(jù)U-Boot
    發(fā)表于 03-04 16:23 ?91次下載
    基于ARM9的<b class='flag-5'>U-Boot</b>自動識別<b class='flag-5'>啟動</b>實現(xiàn)

    u-boot簡介

    。 U-Boot是BootLoader的一種,是操作系統(tǒng)內(nèi)核運行之前運行??梢猿跏蓟布O(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個
    發(fā)表于 10-14 11:17 ?3596次閱讀

    fireflyFace-RK3399主板U-Boot模式啟動

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-04 08:52 ?4619次閱讀
    fireflyFace-RK3399主板<b class='flag-5'>U-Boot</b>模式<b class='flag-5'>啟動</b>

    fireflyAIO-3399C主板U-Boot介紹

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-04 10:31 ?1481次閱讀

    fireflyAIO-3288C主板U-Boot介紹

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-16 13:52 ?1192次閱讀
    fireflyAIO-3288C主板<b class='flag-5'>U-Boot</b><b class='flag-5'>介紹</b>

    fireflyAIO-3288J主板U-Boot使用簡介

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-20 10:06 ?1609次閱讀
    fireflyAIO-3288J主板<b class='flag-5'>U-Boot</b>使用簡介

    fireflyAIO-3399J主板U-Boot使用介紹

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-24 10:00 ?1696次閱讀
    fireflyAIO-3399J主板<b class='flag-5'>U-Boot</b>使用<b class='flag-5'>介紹</b>

    U-Boot啟動內(nèi)核的工作過程詳細(xì)說明

    U-Boot 啟動內(nèi)核的過程可以分為兩個階段,兩個階段的功能如下:(1)第一階段的功能 硬件設(shè)備初始化 加載
    發(fā)表于 12-28 08:00 ?3次下載
    <b class='flag-5'>U-Boot</b><b class='flag-5'>啟動</b>內(nèi)核的工作過程詳細(xì)說明

    u-boot中使用ethernet的方法

    KV260 petalinux BSPu-boot device tree中disable了GEM3,也就是說ethernetu-boot中不建議使用ethernet。
    的頭像 發(fā)表于 07-21 10:25 ?4045次閱讀
    威尼斯人娱乐城优惠| 今晚六合彩开奖结果| 台前县| 百家乐官网号游戏机| 真人百家乐现金游戏| 大发888娱乐方| 赌博百家乐官网游戏| 可以玩百家乐的博彩公司| bet365提款多久到账| 百家乐官网技巧头头娱乐| 百家乐网络真人斗地主| 都匀市| 百家乐游戏全讯网2| 大发体育| 百家乐视频看不到| 桐庐县| 谈谈百家乐赢钱技巧| 金道博彩| 百家乐怎么会赢| 大发娱乐场下载| 24山吉凶八卦图| 上游棋牌官网| 宝马会百家乐官网的玩法技巧和规则 | 百家乐官网与龙虎斗怎么玩| 澳门百家乐网上赌博| e世博百家乐官网技巧| 百家乐游戏教程| 百家乐官网大眼仔用法| 玩百家乐的高手| 澳门百家乐官网线上娱乐城| 百家乐正负计| 百家乐官网路单规则| 赌场百家乐试玩| 百家乐官网投注打三断| 上海百家乐的玩法技巧和规则 | 大发888更名网址622| 大杀器百家乐官网学院| 顶级赌场官方网站| 百家乐体育宝贝| 博乐百家乐官网游戏| 反赌百家乐的玩法技巧和规则|