Jetson Bootloader 深度解析:EDK2 架构与启动机制

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.6k人参与


📖 推荐博主书籍:《Yocto项目实战教程:高效定制嵌入式Linux系统
🎥 更多学习视频请关注 B 站:嵌入式Jerry


Jetson Bootloader 深度解析:EDK2 架构与启动机制

在 NVIDIA Jetson 系列设备中,Bootloader 扮演着系统启动的关键角色,而 EDK2(UEFI Development Kit 2)是 Jetson 使用的开源 UEFI 固件框架。理解 EDK2 对于嵌入式系统开发、固件调试和定制启动界面至关重要。

本文将从概念入手,结合 Jetson 平台的实际案例,全面讲解 EDK2 Bootloader 的原理、模块结构、显示机制以及如何修改启动界面,仅显示 Logo 而去掉进度条与文本信息。


在这里插入图片描述

一、EDK2 的核心概念

EDK2 是由 TianoCore 社区维护的 UEFI 固件开发套件,用于构建现代平台的固件,包括 PC 和嵌入式系统。其主要特点包括:

  1. 模块化架构

    • Platform Modules(平台模块):针对不同硬件平台提供特定功能,例如 Jetson 的 PlatformBootManagerLib
    • Drivers(驱动):封装硬件初始化和控制逻辑,例如显示、USB 和网络驱动。
    • Applications(应用):UEFI 应用程序,例如 Boot Manager、Shell 等。
  2. 统一接口

    • EDK2 提供标准 UEFI 接口,如 gBS(Boot Services)、gST(System Table),使得平台初始化与驱动加载统一规范。
  3. 平台无关性与可扩展性

    • 通过 PCD(Platform Configuration Database)配置平台特性。
    • 可以通过模块扩展功能,如自定义 Logo、进度条显示或屏蔽日志信息。

二、Jetson EDK2 Bootloader 模块结构

Jetson 的 EDK2 Bootloader 基于 NVIDIA 自定义扩展,主要模块包括:

  1. PlatformBootManagerLib

    • 管理启动顺序、超时等待、用户按键处理。
    • 提供显示系统信息、版本号、日期和进度条的接口。
  2. Drivers

    • 包含 Logo 驱动 (Logo.c) 和显示控制接口。
    • 提供 Graphics Output Protocol(GOP)封装,管理屏幕显示。
  3. Features 和 SecurityPkg

    • Intel OutOfBandManagement(IPMI 功能)
    • 安全模块(SecurityPkg)确保固件完整性。

这些模块通过 EDK2 的构建系统组织成 INF 文件和 DSC 配置,最终由 build.py 编译生成固件镜像。


三、启动流程解析

Jetson EDK2 Bootloader 的启动流程大致如下:

  1. 芯片初始化

    • CPU、内存、片上总线初始化。
    • 加载 BootROM 指定的二进制到内存。
  2. Platform Initialization

    • 执行 PlatformInit 模块,初始化显示、UART、定时器等外设。
  3. 显示启动信息

    • 调用 PlatformBootManagerWaitCallback 每秒更新进度条。
    • 调用 PrintXY 显示系统信息、版本号、日期。
    • 通过 BootLogoUpdateProgress 显示进度条。
  4. Boot Manager

    • 等待用户按键选择启动顺序或进入 Setup。
    • 超时后自动启动默认操作系统。
  5. 退出 Bootloader

    • 转交控制权给 OS Loader,进入操作系统。

四、Logo 与进度条显示机制

在 Jetson EDK2 中,Logo 和进度条由 PlatformBootManagerLib 管理:

  • Logo 显示

    *Attribute = EdkiiPlatformLogoDisplayAttributeLeftTop;
    *OffsetX   = 0;
    *OffsetY   = 0;
    

    通过修改 Logo.c 可以调整显示位置或替换图片。

  • 进度条显示

    Status = BootLogoUpdateProgress(
               White.Pixel,
               Black.Pixel,
               ProgressTitle,
               White.Pixel,
               (Timeout - TimeoutRemain) * 100 / Timeout,
               0);
    

    调用该函数会在屏幕上绘制进度条和文本信息。

去掉文本与进度条显示

要实现只显示 Logo,可按以下步骤修改:

  1. 修改 PlatformBootManagerWaitCallback

    VOID EFIAPI PlatformBootManagerWaitCallback(UINT16 TimeoutRemain) {
        return;
    }
    

    直接返回,屏蔽进度条更新逻辑。

  2. 屏蔽 PrintXY 显示

    • DisplaySystemAndHotkeyInformation 中所有 PrintXYUnicodeSPrint 调用注释或删除。
    • 仅保留 Logo 显示相关代码。
  3. 编译注意事项

    • 不能完全删除 GOP 初始化,否则可能报编译错误。
    • 保留必要头文件和类型定义,确保 PlatformBootManagerLib 编译通过。

五、常见问题与解决方法

  1. 编译报错 Failed to build module

    • 检查 INF 文件中依赖的模块是否完整。
    • 删除显示文本后,确保没有使用未定义的变量或函数。
  2. Logo 不显示或位置异常

    • 检查 EdkiiPlatformLogoDisplayAttribute 设置。
    • 确认图片资源路径和格式正确。
  3. EDK2 Git 仓库异常

    • fatal: bad object HEAD 通常由于下载中断或仓库损坏,重新 repo sync 或删除 downloads/git2 并重新拉取。

六、总结

通过本文,读者可以理解 Jetson EDK2 Bootloader 的核心概念与模块结构:

  • EDK2 的模块化和统一接口为平台定制提供基础。
  • PlatformBootManagerLib 管理启动逻辑、Logo 和进度条显示。
  • 修改 Bootloader 可实现只显示 Logo、屏蔽日志信息和进度条。

理解这些概念和机制,有助于在 Jetson 或其他嵌入式平台上进行固件定制和调试,同时也为深入学习 UEFI 固件开发打下基础。



📖 推荐博主书籍:《Yocto项目实战教程:高效定制嵌入式Linux系统
🎥 更多学习视频请关注 B 站:嵌入式Jerry


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值