Xilinx ZYNQ FSBL解讀:LoadBootImage()

篇首

最近突發奇想,Xilinx 的集成開發環境已經很好了,很多必要的代碼都直接生成了,這給開發者帶來了巨大便利的同時,也讓人錯過了很多代碼的精彩,可能有很多人用了很多年了,都還無法清楚的理解其中過程。博主準備以FSBL為例,與大家深入探討一番,從而加深對ZYNQ的加載過程的理解,以便大家作出更精彩的設計!


LoadBootImage() 解讀

本文以Zynq7000 FSBL工程代碼為基礎,分析啟動流程核心函數 L o a d B o o t I m a g e ( ) LoadBootImage() LoadBootImage()的執行邏輯與關鍵技術細節。

一、函數調用框架

int LoadBootImage(void) {FsblHookBeforeBitstreamDdr(); // 鉤子函數Status = XFsbl_LoadPartitions(...); // 核心加載FsblHookBeforeHandoff(); // 移交前預處理return Status;
}

二、 函數執行全流程分解

** 函數入口與預處理**
int LoadBootImage(void) {u32 Status = XFSBL_SUCCESS;XTime tStart, tEnd;  // 64位計時器(若啟用性能分析)
  • 硬件依賴
    • 依賴psu_init.c完成的PS端基礎初始化(時鐘、MIO、SLCR鎖等)
    • DDR物理層已通過Xil_DDRInit()完成訓練(psu_ddr_phyinit.c
** F s b l H o o k B e f o r e B i t s t r e a m D d r ( ) FsblHookBeforeBitstreamDdr() FsblHookBeforeBitstreamDdr() 鉤子函數**
#ifdef FSBL_PERFXTime_GetTime(&tStart);  // 記錄TSC起始值(AXI Timer 0)
#endif
/* 用戶自定義擴展點:可插入DDR重配置代碼 */
  • 關鍵寄存器操作
    • DDRC控制:通過Xil_Out32(0xFD070000, 0x00040010)設置DDRC_ADDRMAP0調整地址映射
    • OCM重映射:關閉OCM緩存(SLCR.OCM_CFG寄存器位3置1)
X F s b l L o a d P a r t i t i o n s ( ) XFsbl_LoadPartitions() XFsblL?oadPartitions() 核心加載
階段1:Boot Header解析
XFsblPs_BootHdr Header;
XFsbl_CheckBootHeader(ImageAddr, &Header); // 從QSPI/NAND讀取頭部
  • 頭部結構體xfsbl_ps_boothdr.h):
    typedef struct {u32 ImageID;          // 魔數0xAA995566u32 NumPartitions;    // 分區總數(含PL比特流+應用)u32 AuthType;         // 加密類型:0=None, 1=RSA-2048u32 Checksum;         // 頭部的CRC32校驗// ... 其他字段(分區表偏移、證書偏移等)
    } XFsblPs_BootHdr;
    
階段2:安全認證(以RSA-2048為例)
XSecure_Sha3Init(&Sha3Instance);  // 初始化SHA-3引擎
XSecure_Sha3Update(&Sha3Instance, (u8*)ImageAddr, Header.HashLength);
XSecure_Sha3Final(&Sha3Instance, CalculatedHash);  // 計算哈希
XSecure_VerifySignature(CalculatedHash, StoredSignature); // RSA驗簽
  • 硬件加速
    • 使用PS內置的CSU模塊(Crypto Subsystem)
    • RSA密鑰存儲在eFUSE或BBRAM中(通過XSecure_GetEfuseKek()讀取)
階段3:分區加載循環
for (u8 i=0; i<Header.NumPartitions; i++) {XFsblPs_PartitionHdr PartHdr;XFsbl_ReadPartitionHdr(ImageAddr + Offset, &PartHdr);if (PartHdr.Attr & PART_ATTR_PL) {  // PL比特流分區XFsbl_LoadPlBitstream(PartHdr.LoadAddr, PartHdr.Size);} else {  // PS應用程序分區XFsbl_LoadElf(PartHdr.LoadAddr, PartHdr.Size); // ELF解析}
}
  • 關鍵操作細節
    • PL加載:通過DevCfg接口(XDcfg_CfgInitialize())寫入PCAP
    • ELF加載:解析Program Headers,使用Xil_Out32()逐段寫入DDR
    • 地址對齊:通過XLAT_FSBL_TABLE處理非32位對齊訪問(觸發Data Abort時自動轉換)
F s b l H o o k B e f o r e H a n d o f f ( ) FsblHookBeforeHandoff() FsblHookBeforeHandoff() 移交前處理
Xil_DCacheFlush();  // 數據緩存刷新(確保DDR數據一致性)
Xil_Out32(CRL_APB_BASE + 0x24, 0x01000F00);  // 配置時鐘分頻
  • 寄存器詳解
    • CRL_APB (0xFF5E0024): 設置RPLL_CTRL分頻系數(CPU=1.3GHz, DDR=1066MHz)
    • SLCR_UNLOCK (0xF8000008): 寫入0xDF0D解鎖保護寄存器

三、關鍵子函數解析

  1. F s b l H o o k B e f o r e B i t s t r e a m D d r ( ) FsblHookBeforeBitstreamDdr() FsblHookBeforeBitstreamDdr()

    • 作用:DDR初始化前的預處理鉤子
    • 執行內容:
      #ifdef FSBL_PERF
      XTime_GetTime(&tStart); // 性能計數器啟動
      #endif
      
  2. X F s b l L o a d P a r t i t i o n s ( ) XFsbl_LoadPartitions() XFsblL?oadPartitions()

    • 流程分解:
      • X F s b l C h e c k B o o t H e a d e r ( ) XFsbl_CheckBootHeader() XFsblC?heckBootHeader()
        驗證BIN文件頭結構(含 s i z e o f ( X F s b l P s B o o t H d r ) sizeof(XFsblPs_BootHdr) sizeof(XFsblPsB?ootHdr)
      • X F s b l A u t h e n t i c a t i o n ( ) XFsbl_Authentication() XFsblA?uthentication()
        執行RSA-2048簽名驗證(通過 X S e c u r e S h a 3 I n i t ( ) XSecure_Sha3Init() XSecureS?ha3Init()等加密API)
      • 分區加載循環
        遍歷分區表加載:
        for(u8 PartNum=0; PartNum<Header.NumPartitions; PartNum++){XFsbl_LoadPartition(...); // 加載單個分區#ifdef FSBL_DEBUGxil_printf("Partition %d Loaded\r\n", PartNum);#endif
        }
        
  3. F s b l H o o k B e f o r e H a n d o f f ( ) FsblHookBeforeHandoff() FsblHookBeforeHandoff()

    • 執行DDR刷新操作( X i l D C a c h e F l u s h ( ) Xil_DCacheFlush() XilD?CacheFlush()
    • 配置時鐘分頻器(通過 X i l O u t 32 ( ) Xil_Out32() XilO?ut32()寫CRL_APB寄存器)

四、核心宏定義

  • $FSBL_DEBUG
    控制調試輸出(默認關閉)
  • KaTeX parse error: Double subscript at position 15: XPAR_PSU_DDR_0_?S_AXI_BASEADDR
    DDR控制器基地址宏(值 0 x 00100000 0x00100000 0x00100000
  • X L A T F S B L T A B L E XLAT_FSBL_TABLE XLATF?SBLT?ABLE
    地址轉換表(處理非對齊訪問)

五、執行流程圖

初始化硬件 → 驗證頭部 ↓ ↓ DDR預處理 → 加載分區 ↘ ↓ 移交控制權 \begin{array}{ccc} \text{初始化硬件} & \rightarrow & \text{驗證頭部} \\ \downarrow & & \downarrow \\ \text{DDR預處理} & \rightarrow & \text{加載分區} \\ & \searrow & \downarrow \\ & & \text{移交控制權} \end{array} 初始化硬件DDR預處理??驗證頭部加載分區移交控制權?

六、 關鍵數據流與硬件交互

數據加載路徑

QSPI?Flash → AXI?Quad-SPI控制器 OCM緩存 → DMA DDR3 \text{QSPI Flash} \xrightarrow{\text{AXI Quad-SPI控制器}} \text{OCM緩存} \xrightarrow{\text{DMA}} \text{DDR3} QSPI?FlashAXI?Quad-SPI控制器 ?OCM緩存DMA ?DDR3

  • 性能優化
    • 啟用DMA傳輸(XQspiPs_DmaTransfer()
    • 使用線性突發模式(QSPI配置為DDR模式,時鐘速率83MHz)
安全認證流程

原始鏡像 → SHA-3/384 哈希值 哈希值 → RSA-2048簽名 驗簽結果 \begin{aligned} &\text{原始鏡像} \xrightarrow{\text{SHA-3/384}} \text{哈希值} \\ &\text{哈希值} \xrightarrow{\text{RSA-2048簽名}} \text{驗簽結果} \end{aligned} ?原始鏡像SHA-3/384 ?哈希值哈希值RSA-2048簽名 ?驗簽結果?

  • 抗攻擊設計
    • 哈希計算前會清空CSU的密鑰緩存(XSecure_CsuAesKcvClear()
    • 簽名失敗觸發安全鎖定(通過XSecure_SetTamperConfig()

七、調試與錯誤處理

調試宏啟用
#define FSBL_DEBUG  // 啟用調試輸出
  • 典型輸出
    XFsbl_Debug: Partition 0 Loaded at 0x00100000 (Size 1MB)
    XFsbl_Debug: PL Bitstream CRC Check Passed
    
** 錯誤碼定義**
#define XFSBL_ERROR_BOOTHEADER   0x1000  // 頭部校驗失敗
#define XFSBL_ERROR_AUTHFAIL     0x1001  // RSA驗簽錯誤
#define XFSBL_ERROR_PLLLOCK      0x1002  // 時鐘鎖相環失鎖
  • 錯誤處理
    • 記錄錯誤到PMU全局狀態寄存器(XFsbl_WriteReg(PMU_GLOBAL_GLOB_GEN_STORAGE, errCode)
    • 觸發系統復位(XFsbl_FallbackReset()

**八、 總結 **

L o a d B o o t I m a g e ( ) LoadBootImage() LoadBootImage()作為Zynq7000啟動鏈的核心,其執行涵蓋硬件初始化、安全認證、多階段加載三大模塊。函數首先通過 F s b l H o o k B e f o r e B i t s t r e a m D d r ( ) FsblHookBeforeBitstreamDdr() FsblHookBeforeBitstreamDdr()完成DDR時序微調與性能監控啟動,隨后 X F s b l L o a d P a r t i t i o n s ( ) XFsbl_LoadPartitions() XFsblL?oadPartitions()深度解析Boot Header結構,利用CSU硬件模塊實現RSA-2048/SHA-3安全認證,并依據分區屬性(PL比特流或PS應用)選擇PCAP配置或ELF加載機制。關鍵點包括:通過DevCfg接口的PL動態重配置、基于XLAT表的非對齊地址訪問補償、以及DMA加速的QSPI數據傳輸。移交控制權前,函數會強制刷新數據緩存(確保內存一致性)并通過CRL_APB寄存器組重配時鐘域。調試方面,FSBL_DEBUG宏可實時輸出分區加載狀態,而錯誤處理機制將異常狀態固化至PMU寄存器,為后續故障分析提供關鍵日志。該函數的設計充分體現了Zynq架構中PS-PL協同、硬件安全加速、以及多級啟動鏈的技術特點。


:具體實現細節需參考對應版本的 f s b l _ h o o k s . c fsbl\_hooks.c fsbl_hooks.c x f s b l _ p a r t i t i o n l o a d . c xfsbl\_partition_load.c xfsbl_partitionl?oad.c源碼文件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73125.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode1871 跳躍游戲VII

LeetCode 跳躍游戲 IV&#xff1a;二進制字符串的跳躍問題 題目描述 給定一個下標從 0 開始的二進制字符串 s 和兩個整數 minJump 和 maxJump。初始時&#xff0c;你位于下標 0 處&#xff08;保證該位置為 0&#xff09;。你需要判斷是否能到達字符串的最后一個位置&#xf…

Burpsuite使用筆記

Burpsuite使用筆記 抓包設置代理open Browserintercept on輸入要抓包的網站回車ForwardHTTP history查看抓包數據其他瀏覽器配置burpsuite代理瀏覽器代理器插件配置打開代理同樣步驟訪問原理三級目錄抓包 設置代理 open Browser 打開內置瀏覽器 intercept on 輸入要抓包的網…

Windows 遠程桌面多端口訪問,局域網虛擬IP映射多個Windows 主機解決方案

情景 項目現場4G路由局域網中兩臺主機通過VPN連接到公司內網&#xff0c;實現遠程管理&#xff0c;要求映射兩個Windows 桌面進行管理。 目錄 情景 網絡 思路 已知 問題解決 1.客戶端通過VPN進入內網路由器配置NAT 2.使用遠程主機遠程桌面功能&#xff1a;IP端口號訪問 …

【深度學習】讀寫文件

讀寫文件 到目前為止&#xff0c;我們討論了如何處理數據&#xff0c;以及如何構建、訓練和測試深度學習模型。 然而&#xff0c;有時我們希望保存訓練的模型&#xff0c;以備將來在各種環境中使用&#xff08;比如在部署中進行預測&#xff09;。 此外&#xff0c;當運行一個…

仿Manus一

復制 ┌───────────────┐ ┌─────────────┐ │ 主界面UI │?─────?│ 會話管理模塊 │ └───────┬───────┘ └──────┬──────┘│ │▼ ▼ ┌─…

VS Code C++ 開發環境配置

VS Code 是當前非常流行的開發工具. 本文講述如何配置 VS Code 作為 C開發環境. 本文將按照如下步驟來介紹如何配置 VS Code 作為 C開發環境. 安裝編譯器安裝插件配置工作區 第一個步驟的具體操作會因為系統不同或者方案不同而有不同的選擇. 環境要求 首先需要立即 VS Code…

Flutter 學習之旅 之 flutter 不使用插件,實現簡單帶加載動畫的 LoadingToast 功能

Flutter 學習之旅 之 flutter 不使用插件&#xff0c;實現簡單帶加載動畫的 LoadingToast 功能 目錄 Flutter 學習之旅 之 flutter 不使用插件&#xff0c;實現簡單帶加載動畫的 LoadingToast 功能 一、簡單介紹 二、LoadingToast 三、簡單案例實現 四、關鍵代碼 一、簡單…

Spring (八)AOP-切面編程的使用

目錄 實現步驟&#xff1a; 1 導入AOP依賴 2 編寫切面Aspect 3 編寫通知方法 4 指定切入點表達式 5 測試AOP動態織入 圖示&#xff1a; 一 實現步驟&#xff1a; 1 導入AOP依賴 <!-- Spring Boot AOP依賴 --><dependency><groupId>org.springframewor…

開源數字人模型Heygem

一、Heygem是什么 Heygem 是硅基智能推出的開源數字人模型&#xff0c;專為 Windows 系統設計。基于先進的AI技術&#xff0c;僅需1秒視頻或1張照片&#xff0c;能在30秒內完成數字人形象和聲音克隆&#xff0c;在60秒內合成4K超高清視頻。Heygem支持多語言輸出、多表情動作&a…

uniapp開通開屏廣告后動態開啟或關閉開屏廣告

近期使用uniapp開發的APP有uniad的廣告對接&#xff0c;并且要求會員用戶不顯示包含開屏廣告在內的廣告&#xff0c;除開屏廣告外的廣告都可以通過uniapp廣告組件控制是否顯示 因uniad的開屏廣告無需代碼開發&#xff0c;經過uniad客服指點可在App.vue中的onLaunch生命周期中執…

神經網絡為什么要用 ReLU 增加非線性?

在神經網絡中使用 ReLU&#xff08;Rectified Linear Unit&#xff09; 作為激活函數的主要目的是引入非線性&#xff0c;這是神經網絡能夠學習復雜模式和解決非線性問題的關鍵。 1. 為什么需要非線性&#xff1f; 1.1 線性模型的局限性 如果神經網絡只使用線性激活函數&…

使用SSH密鑰連接本地git 和 github

目錄 配置本地SSH&#xff0c;添加到github首先查看本地是否有SSH密鑰生成SSH密鑰&#xff0c;和郵箱綁定將 SSH 密鑰添加到 ssh-agent&#xff1a;顯示本地公鑰*把下面這一串生成的公鑰存到github上* 驗證SSH配置是否成功終端跳轉到本地倉庫把http協議改為SSH&#xff08;如果…

關于AI數據分析可行性的初步評估

一、結論&#xff1a;可在部分環節嵌入&#xff0c;無法直接處理大量數據 1.非本地部署的AI應用處理非機密文件沒問題&#xff0c;內部文件要注意數據安全風險。 2.AI&#xff08;指高規格大模型&#xff09;十分適合探索性研究分析&#xff0c;對復雜報告無法全流程執行&…

矩陣分析-淺要理解(深度學習方向)

梯度分析與最優化 在深度學習的任務中&#xff0c;我們所期望的是訓練一個神經網絡&#xff0c;使得預測結果與真實標簽之間的誤差最小化&#xff0c;這可以近似看作是一個提供梯度下降等優化找到全局最優解的凸優化問題。 奇異值分解 在信息工程領域&#xff0c;對數據處理的…

使用DeepSeek+藍耘快速設計網頁簡易版《我的世界》小游戲

前言&#xff1a;如今&#xff0c;借助先進的人工智能模型與便捷的云平臺&#xff0c;即便是新手開發者&#xff0c;也能開啟創意游戲的設計之旅。DeepSeek 作為前沿的人工智能模型&#xff0c;具備強大的功能與潛力&#xff0c;而藍耘智算云平臺則為其提供了穩定高效的運行環境…

固定表頭、首列 —— uniapp、vue 項目

項目實地&#xff1a;也可以在 【微信小程序】搜索體驗&#xff1a;xny.handbook 另一個體驗項目&#xff1a;官網 一、效果展示 二、代碼展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

【學習筆記】Numpy和Tensor的區別

1. NumPy 和 PyTorch Tensor 的格式對比 NumPy 使用的是 numpy.ndarray&#xff0c;而 PyTorch 使用的是 torch.Tensor&#xff0c;兩者的格式在數據存儲和計算方式上有所不同。 NumPy (numpy.ndarray) import numpy as np array np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.…

每天一道算法題【藍橋杯】【在排序數組中查找元素的第一個位置和最后一個位置】

思路 本題為查找左邊界和右邊界的標準模型 查找左邊界 int left 0, right nums.size() - 1, mid 0; //查找左邊界 while (left < right) { mid left (right - left) / 2; if (nums[mid] < target) left mid 1; else right mid; } 查找右邊界 int left 0, r…

Python數據分析之機器學習基礎

Python 數據分析重點知識點 本系列不同其他的知識點講解&#xff0c;力求通過例子讓新同學學習用法&#xff0c;幫助老同學快速回憶知識點 可視化系列&#xff1a; Python基礎數據分析工具數據處理與分析數據可視化機器學習基礎 五、機器學習基礎 了解機器學習概念、分類及…

我與DeepSeek讀《大型網站技術架構》(10)- 維基百科的高性能架構設計分析

目錄 網站整體架構核心組件請求處理流程圖關鍵環節說明 性能優化策略前端優化&#xff1a;攔截 80% 以上請求服務端優化&#xff1a;高性能 PHP 集群后端優化&#xff1a;存儲與緩存極致設計Memcached 持久化連接 性能優化策略對比表 網站整體架構 核心組件 Wikipedia 的架構…