91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

U-Boot SPL核心文件spl.c深度解析:從啟動流程到調(diào)試優(yōu)化

jf_44130326 ? 來源:Linux1024 ? 2026-02-05 14:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)開發(fā)中,U-BootSPLSecondary Program Loader)扮演著至關(guān)重要的角色,它是系統(tǒng)上電后執(zhí)行的第一個軟件組件之一,負責為后續(xù)啟動過程鋪平道路。本文將深入解析U-Bootspl.c文件的功能與作用,探討其在系統(tǒng)調(diào)試和優(yōu)化中的價值,并通過流程圖和腦圖幫助開發(fā)者快速掌握核心要點。

一、spl.c文件核心功能解析

spl.cU-Boot SPL階段的核心實現(xiàn)文件,承擔著從硬件初始化到加載下一階段程序的關(guān)鍵任務(wù)。其主要功能可歸納為以下幾個模塊:

1.初始化管理

?早期初始化(spl_early_init:完成malloc內(nèi)存分配、緩存使能(spl_dcache_enable)、bootstage初始化等基礎(chǔ)工作,為后續(xù)操作準備環(huán)境

?系統(tǒng)初始化(spl_init:根據(jù)配置完成設(shè)備模型(DM)初始化、內(nèi)存初始化等,設(shè)置全局標志(GD_FLG_SPL_INIT)標記初始化狀態(tài)

?重定位設(shè)置(spl_setup_relocate:處理SPL自身的重定位邏輯,調(diào)整全局數(shù)據(jù)(gd)和設(shè)備樹(fdt)的存儲位置

2.鏡像加載與解析

?鏡像頭部解析(spl_parse_image_header:識別鏡像類型(U-Boot鏡像、Linux內(nèi)核等),提取加載地址、入口點、大小等關(guān)鍵信息

?設(shè)備加載管理(boot_from_devices:按照板級定義的啟動順序(board_boot_order),嘗試從不同設(shè)備加載鏡像

?加載器匹配(spl_ll_find_loader:根據(jù)啟動設(shè)備類型匹配對應(yīng)的鏡像加載器,完成實際的鏡像讀取操作

3.啟動流程控制

?下一階段選擇(spl_next_stage:確定SPL之后要啟動的程序(通常是主U-Boot或內(nèi)核)

?跳轉(zhuǎn)準備(spl_cleanup_before_jump:跳轉(zhuǎn)前的清理工作,包括關(guān)閉中斷、禁用緩存、刷新數(shù)據(jù)同步屏障(dsb/isb

?多路徑啟動支持:實現(xiàn)對U-Boot、Linux內(nèi)核、ATFARM可信固件)、OP-TEE等不同目標的啟動支持

4.板級適配框架

?提供大量弱函數(shù)(__weak)如spl_start_uboot、dram_init_banksize等,允許板級代碼重寫以實現(xiàn)平臺特定功能

?通過宏定義(如CONFIG_SPL_OS_BOOTCONFIG_ATF等)支持靈活的功能配置,適應(yīng)不同硬件和啟動需求

二、spl.cU-Boot中的核心作用

SPL作為系統(tǒng)啟動的第一階段,是連接硬件上電與主程序運行的橋梁,spl.c則是這一階段的"神經(jīng)中樞",具體作用體現(xiàn)在:

1.硬件最小化初始化:完成CPU、內(nèi)存、串口等核心硬件的初始化,為后續(xù)程序運行提供基礎(chǔ)環(huán)境

2.啟動介質(zhì)適配:支持從NAND、NOR、MMC等多種存儲介質(zhì)加載程序,實現(xiàn)靈活的啟動策略

3.資源約束管理:在內(nèi)存、Flash等資源受限的早期階段,高效分配和使用系統(tǒng)資源

4.安全啟動支持:為secure boot提供基礎(chǔ)環(huán)境,可在早期階段驗證后續(xù)程序的完整性

5.多階段啟動銜接:實現(xiàn)SPL到主U-Boot、內(nèi)核或其他固件的平滑過渡,傳遞必要的啟動參數(shù)

wKgZO2kajDWAcc98AAE33CBipmM970.png

三、spl.c對系統(tǒng)調(diào)試的關(guān)鍵價值

嵌入式系統(tǒng)調(diào)試中,SPL階段的問題往往導(dǎo)致系統(tǒng)無法啟動,spl.c提供了豐富的調(diào)試支持:

1.啟動進度跟蹤

?通過show_boot_progress函數(shù)可跟蹤啟動階段,定位卡殼位置

?bootstage相關(guān)函數(shù)記錄各階段耗時,便于分析啟動性能瓶頸

1.錯誤定位機制

?詳細的debug日志輸出(如鏡像加載信息、設(shè)備匹配結(jié)果)

?明確的錯誤返回碼(如-ENODEV表示無可用設(shè)備)

?關(guān)鍵操作的狀態(tài)提示(如"Trying to boot from XXX"

1.環(huán)境驗證工具

?內(nèi)存初始化和分配狀態(tài)檢查

?設(shè)備樹(fdt)修復(fù)和驗證(spl_fixup_fdt

?緩存配置正確性驗證

1.調(diào)試配置選項

?CONFIG_SPL_SERIAL_SUPPORT啟用串口調(diào)試輸出

?CONFIG_SPL_PANIC_ON_RAW_IMAGE增強對非法鏡像的錯誤檢測

?CONFIG_BOOTSTAGE_STASH保存啟動階段信息供后續(xù)分析

四、在問題定位與系統(tǒng)優(yōu)化中的應(yīng)用

問題定位場景

1.啟動失敗問題

?若卡在"SPL: failed to boot from all boot devices",可檢查board_boot_order配置及對應(yīng)設(shè)備驅(qū)動

?鏡像解析失敗時,通過spl_parse_image_header中的日志確認鏡像格式是否正確

1.硬件兼容性問題

?內(nèi)存初始化失敗可檢查dram_init_banksize實現(xiàn)

?設(shè)備加載失敗可跟蹤spl_ll_find_loader匹配邏輯

1.性能瓶頸分析

?通過spl_cleanup_before_jump中的時間統(tǒng)計,分析各階段耗時

?緩存配置(spl_dcache_enable)對加載速度的影響

系統(tǒng)優(yōu)化方向

1.啟動速度優(yōu)化

?精簡啟動設(shè)備列表,減少無效嘗試

?優(yōu)化內(nèi)存分配策略,減少SPL階段內(nèi)存占用

1.可靠性提升

?增強鏡像校驗邏輯,在spl_parse_image_header中增加完整性檢查

?增加啟動設(shè)備重試機制,提高容錯能力

1.資源利用優(yōu)化

?根據(jù)實際需求調(diào)整CONFIG_SYS_MONITOR_LEN等宏定義,減少內(nèi)存浪費

?合理配置SPL與主U-Boot的功能劃分,平衡資源占用

五、核心功能腦圖

wKgZO2kajDuAPsJvAAFzcgGO8Eo884.png

總結(jié)

spl.c作為U-Boot SPL階段的核心實現(xiàn),是理解嵌入式系統(tǒng)啟動流程的關(guān)鍵。它不僅承擔著初始化硬件、加載程序的核心任務(wù),更為系統(tǒng)調(diào)試和優(yōu)化提供了豐富的接口和工具。

對于開發(fā)者而言,深入理解spl.c的邏輯有助于:

?快速定位啟動階段的疑難問題

?優(yōu)化系統(tǒng)啟動速度和資源利用

?實現(xiàn)定制化的啟動策略和硬件適配

掌握spl.c的工作機制,將為嵌入式系統(tǒng)開發(fā)和調(diào)試打下堅實基礎(chǔ),助力構(gòu)建更可靠、高效的啟動流程。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3745

    瀏覽量

    133611
  • u-boot
    +關(guān)注

    關(guān)注

    0

    文章

    135

    瀏覽量

    39738
  • 內(nèi)存分配
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    8560
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    基于AM335x的U-Boot/SPL 的CCS 調(diào)試

    在基于Linux的AM335x軟件開發(fā)流程中,第一步就是U-Boot/SPL(SecondProgram Loader)的移植。##2.調(diào)試環(huán)境的準備##3.3
    發(fā)表于 08-21 15:09 ?1.1w次閱讀
    基于AM335x的<b class='flag-5'>U-Boot</b>/<b class='flag-5'>SPL</b> 的CCS <b class='flag-5'>調(diào)試</b>

    深度解析SPL階段A/B分區(qū)啟動spl_ab.c代碼全拆解

    ( Secondary Program Loader ,二級程序加載器)作為系統(tǒng)啟動的早期階段,負責初始化硬件、選擇啟動分區(qū), spl_ab.c 正是 SPL 層處理 A/B 分區(qū)
    的頭像 發(fā)表于 01-20 07:07 ?9492次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b><b class='flag-5'>SPL</b>階段A/B分區(qū)<b class='flag-5'>啟動</b>:<b class='flag-5'>spl_ab.c</b>代碼全拆解

    i.mx8m如何在u-boot SPL階段啟用pwm?

    硬件:i.mx8m mini。 U-Boot 版本:2023.01 DFSG-2 我想讓 pwm 點亮我的 spl.c 中的 LED,這樣用戶在接通板子電源后就可以立即看到燈亮了。 我沒有找到將
    發(fā)表于 03-21 07:51

    fn_u-boot-spl.bin和u-boot-spl.bin區(qū)別是什么?請問如何u-boot-spl.bin生成fn_u-boot-spl.bin?

    fn_u-boot-spl.bin = bootrom頭 + u-boot-spl.bin ;生成過程見后面代碼片段; bootrom頭(格式詳見) + u-boot-spl.bin(標準的一級
    發(fā)表于 07-11 07:58

    soc fpga開發(fā)日記之:preloader spl探秘

    (comm/spl/spl.c)中是spl中至關(guān)重要的工作,可畏步步驚心,是系統(tǒng)啟動核心。。。。。。比較重要的調(diào)用有:timer_init
    發(fā)表于 12-18 14:59

    【OK210試用體驗】u-boot篇 -- SPL移植

    本帖最后由 q15920078530 于 2015-8-28 20:25 編輯 【OK210試用體驗】u-boot篇 -- SPL移植 在S5PV210的啟動流程中可以知道,iR
    發(fā)表于 08-26 20:51

    【OK210試用體驗】u-boot篇 -- u-boot啟動流程總結(jié)

    u-boot-spl.bin 和 u-boot.bin 。 結(jié)合裸機程序前的S5PV210啟動流程,可以清晰地分析 S5PV210移植完u-bo
    發(fā)表于 09-08 22:45

    AM335X的U-BOOT代碼拷貝SDRAM,請問MLO拷貝代碼u-boot.img到外部SDRAM的流程,是否正確?

    的是SD卡啟動,對于AM335X,知道MLO是在內(nèi)部RAM運行,而u-boot.img是在外部SDRAM運行, 那么MLO里面應(yīng)該有拷貝u-boot.img
    發(fā)表于 06-21 07:21

    關(guān)于U-boot SPL入口的問題。

    仔細看了源代碼,知道SPL(MLO鏡像)入口是start.s但是沒有找到u-bootu-boot.img)的入口,請問一下u-boot.img的入口是哪個
    發(fā)表于 06-21 16:13

    ARM U-boot SPL源碼簡要分析

    的設(shè)置值不變?! √D(zhuǎn)到board_init_r()運行,復(fù)制u-boot第二階段代碼系統(tǒng)RAM中,并跳到第二階段代碼在系統(tǒng)RAM的起始地址處開始運行。crt0.S中整理出來的SPL
    發(fā)表于 04-13 09:44

    一文淺析ARM U-boot SPL的源碼

    ()運行,復(fù)制u-boot第二階段代碼系統(tǒng)RAM中,并跳到第二階段代碼在系統(tǒng)RAM的起始地址處開始運行。crt0.S中整理出來的SPL main源碼:ENTRY(_main)#if
    發(fā)表于 06-06 16:08

    u-boot armv8鏈接腳本

    u-boot armv8鏈接腳本 在進行源碼分析之前,首先看看u-boot的鏈接腳本,通過鏈接腳本可以整體了解一個u-boot的組成,并且可以在
    的頭像 發(fā)表于 12-07 11:19 ?1545次閱讀

    深入解析U-Boot命令處理核心文件:功能、調(diào)試與開發(fā)價值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為主流的引導(dǎo)加載程序,其命令處理、交互邏輯和自動啟動流程核心功能模塊。本文將圍繞command.c、c
    的頭像 發(fā)表于 02-03 15:44 ?870次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>命令處理<b class='flag-5'>核心</b><b class='flag-5'>文件</b>:功能、<b class='flag-5'>調(diào)試</b>與開發(fā)價值

    解析Rockchip平臺U-Boot核心文件boot_rkimg.c到底做了什么?

    在嵌入式開發(fā)中,U-Boot 作為引導(dǎo)程序的 “中流砥柱”,負責初始化硬件、加載內(nèi)核并啟動系統(tǒng)。對于 Rockchip 平臺的設(shè)備(如常見的開發(fā)板、智能終端),boot_rkimg.cU
    的頭像 發(fā)表于 02-03 15:29 ?736次閱讀
    <b class='flag-5'>解析</b>Rockchip平臺<b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b><b class='flag-5'>文件</b>:<b class='flag-5'>boot_rkimg.c</b>到底做了什么?

    深入解析U-Boot image.c:RK平臺鏡像處理核心邏輯

    在瑞芯微(RK)平臺的嵌入式開發(fā)中,U-Boot作為核心啟動加載程序,負責完成鏡像解析、校驗、加載等關(guān)鍵流程。而image.
    的頭像 發(fā)表于 02-24 16:46 ?1403次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> image.<b class='flag-5'>c</b>:RK平臺鏡像處理<b class='flag-5'>核心</b>邏輯