在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

u-boot在匯編啟動階段的相關操作介紹

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

u-boot在匯編啟動階段對系統的一些初始化

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

啟動前為后續流程做的一些平臺相關操作

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

/*************************************************************************
 *
 * 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:

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

#endif
  • ? (1)_start段標記為全局可見并在鏈接腳本中被聲明為入口地址,表示u-boot的入口地址為_start;
  • ? (2)首先進入入口后有兩種可配置情況,一種就是定義了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對應起來,為u-boot頭部添加一個類似與Linux arm64 的Image頭部,首先是起始8字節, 如果沒有定義efi相關的功能則是一個跳轉指令,跳轉到reset段繼續執行啟動流程 ,其他如鏈接腳本中解釋一致;

  • ? (3)第二種可能的配置,就是定義了ENABLE_ARM_SOC_BOOT0_HOOK配置,此處的頭文件根據不同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

因為有些設備boot到u-boot之前已經有安全固件了,

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

后續在完成tpl初始化后會將控制權再交還給bootrom固件,由bootrom固件繼續加載spl,

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

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

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

    關注

    134

    文章

    9165

    瀏覽量

    369202
  • 匯編
    +關注

    關注

    2

    文章

    214

    瀏覽量

    26007
  • Uboot
    +關注

    關注

    4

    文章

    125

    瀏覽量

    28349
收藏 人收藏

    評論

    相關推薦

    U-Boot介紹

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

    U-Boot代碼執行流程詳解

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

    U-boot的基本介紹

    從本文開始,將陸續推送“手把手教你移植U-boot”系列文章,目標是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認硬件開發平臺為ARM,
    發表于 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
    發表于 01-18 10:17

    U-Boot啟動及移植分析

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

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

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

    基于ARM9的U-Boot自動識別啟動實現

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

    u-boot簡介

    U-Boot是BootLoader的一種,是操作系統內核運行之前運行??梢猿跏蓟布O備、建立內存空間映射圖,從而將系統的軟硬件環境帶到一個
    發表于 10-14 11:17 ?3598次閱讀

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

    RK U-Boot 基于開源的 U-Boot 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 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 進行開發,工作模式有啟動加載模式和下載模式。
    的頭像 發表于 12-04 10:31 ?1481次閱讀

    fireflyAIO-3288C主板U-Boot介紹

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

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

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

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

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

    U-Boot啟動內核的工作過程詳細說明

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

    u-boot中使用ethernet的方法

    KV260 petalinux BSPu-boot device tree中disable了GEM3,也就是說ethernetu-boot中不建議使用ethernet。
    的頭像 發表于 07-21 10:25 ?4045次閱讀
    主站蜘蛛池模板: 成人免费视频一区二区三区 | 深夜免费在线视频 | 欧美大黄 | 亚洲成a人v在线观看 | 欧美大香a蕉免费 | 国产男女怕怕怕免费视频 | ww欧洲ww在线视频免费观看 | 看屁屁www视频免费观看 | 日本黄色片黄色片 | 久久亚洲综合色 | 啪啪日韩 | 中文字幕精品一区 | 狼色视频在线观免费观看 | 日韩三级视频在线观看 | 免费看黄视频网站 | 国内精品第一页 | 五月婷婷之婷婷 | 看片免费黄 | 91啪免费网站在线观看 | 久久99久久精品国产只有 | 国产玖玖在线 | 国产三级在线观看免费 | 免费看真人a一级毛片 | 欧美人成网站免费大全 | 一区二区三区高清在线 | 日本69xxxxxxxx69| 日本高清视频成人网www | 欧洲不卡一卡2卡三卡4卡网站 | 女上男下边吃奶边做视频成都 | 亚洲国产午夜看片 | 成人性色生活片免费看爆迷你毛片 | 狠狠色伊人亚洲综合第8页 狠狠色依依成人婷婷九月 狠狠色影院 | 亚洲成人网在线播放 | 男女吃奶一进一出动态图 | 免费高清在线观看a网站 | 日本三级精品 | 久久天天躁夜夜躁狠狠85台湾 | 丁香五月欧美成人 | 波多野结衣久久精品 | 日本一区免费观看 | 日本大黄在线观看 |