0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在Vitis中调试ARM可信固件和U-boot

王利祥 来源:mede1001 作者:mede1001 2022-08-02 10:14 次阅读

本文来自 XILINX 产品应用工程师Stephen MacMahon

在本篇博文中,我们将探讨如何在 Vitis 中调试 Zynq UltraScale 器件启动镜像。这些启动镜像包括 ARM 可信固件 (ATF) 和 U-boot。

本篇博文乃是系列博文中的一篇,此系列博文旨在探讨如何在 Petalinux 镜像中调试各种组件。 (更多系列博文请持续关注公众号文章推送)

启动镜像调试是任何定制板启动过程中不可或缺的一环,希望本篇博文能够帮助用户完整完成定制板启动镜像的调试工作。即使您使用的是开发板,本篇博文也将能够提供有关启动镜像在 Zynq UltraScale 器件上的工作方式方面的诸多实用见解。

启动镜像的生成途径多种多样。用户可以使用 PetaLinux/Yocto,或者也可以从 GiT 源代码手动构建镜像。本文将演示如何使用 PetaLinux 2020.1 来为 Zynq UltraScale 器件创建启用调试功能的启动镜像。

PetaLinux 流程:

在此次演示中使用的是 ZCU104 板,但其中步骤应适用于所有 Zynq UltraScale 器件。

在 images/Linux 文件夹中提供的 u-boot.elf 不具有在 Vitis 中进行调试所需的符号信息。因此,我们将使用 PetaLinux 内的工作目录下的 u-boot 二进制文件。

并且 PetaLinux 移除了其中间文件以节省磁盘空间,因此我们需要在 PetaLinux 工程中禁用此功能。

下列步骤演示了用户如何获取启用调试功能的 ATF 和 U-boot:

petalinux-create -t project --template zynqMP -n linux_image
cd linux_image

pYYBAGGYHxaAA-TBAAKCbyEfraQ148.png

注: 很遗憾,在 PetaLinux 存在 1 个已知问题,即无法将 debug=1 传递到此处的 makefile。用户可以使用此处所述的变通方法来手动添加该值。

用户还应注意 TMP 目录:

poYBAGGYHxeAZLJsAAJzENvam10657.png

退出“配置 (Config)”屏幕并单击“Save”以保存。

如上所述,PetaLinux 提供的 u-boot 可执行文件不具有调试所需的符号信息。用户可以通过修改 build/conf 文件夹下的 local.conf 文件来阻止 PetaLinux 移除中间构建文件。

创建任何构建时都会创建 build 文件夹,因此我们可以执行 petalinux-build,随后使用 Ctrl + c 在创建此文件时停止操作。打开 local.conf 文件并注释掉以下行:

pYYBAGGYHxmAfn3-AADjJk2T3ks333.png

现在,只需构建启动镜像并使用 PetaLinux 创建可启动镜像 (BOOT.BIN) 即可

petalinux-build -c bootloader

完成构建后,将 u-boot 重命名为 u-boot.elf 并从 tmp 文件夹复制到 images/linux 文件夹中:

pYYBAGGYHxqASq9iAACFXzuhQKs236.png

下一步,使用 PetaLinux 创建可启动镜像 (BOOT.BIN)

cd images/linux
petalinux-package --boot --u-boot

作为完整性检查,我们还可测试可执行文件以确认其中包含符号信息:

poYBAGGYHxuAZDPkAAFDo250lyY464.png

在 Vitis 中执行调试:

我发现调试启动镜像最简单的方法是将启动镜像加载到 SD/QSPI 上,并在运行目标上执行调试。

启动 Vitis 并关闭欢迎屏幕。

创建新的“调试配置 (Debug Configuration)”:

pYYBAGGYHxyAVIPbAABLQDW_LDM825.png

双击“单应用调试 (Single Application Debug)”:

poYBAGGYHx2AZ5WCAAE2CXuRkt4253.png

将“调试类型 (Debug Type)”设置为“连接到运行目标 (Attach to Running Target)”:

pYYBAGGYHx-ADztLAAD8zNABPTU038.png

注: 由于我当前使用远程连接,因此还需一并设置远程连接。

选择“应用并调试 (Apply and Debug)”。这样即可打开调试透视图。

您可以看到其中 Cortex A53 正在运行(我们的启动镜像)。

poYBAGGYHyCAKklUAACWm0GdyAg456.png

重定位前的调试:

展开赛灵思软件命令行工具 (XSCT) 窗口。

我们要在其中将符号文件传递给 Cortex A53 #0 以供 ATF 和 U-Boot 使用。

在 XSCT 中使用 memmap 命令设置符号文件:

pYYBAGGYHyGAU8bAAABQQQELE7c838.png

然后即可在 ATF 和 U-Boot 中添加中断点。

我将 ATF 中的中断点设置在 bl31_main,将 U-boot 中的中断点设置在 board_init_f:

poYBAGGYHyKAVXMCAACH7Bj6gvU492.png

如果将板掉电并重新上电,则会在 ATF 中看到中断点被命中。

pYYBAGGYHySASBDqAAFFcJ0EBiU510.png

随后,用户可以执行恢复 (resume)、单步进入 (step into)、单步跳过 (step over) 等:

poYBAGGYHyWATtpKAACEqIf_NtQ875.png

用户可以单步执行此处代码。例如,用户可以使用其中的 setup_reloc 功能来查找 uboot 重定位地址(或者使用 bdinfo)。

重定位地址因用户而异,我这里的重定位地址为 0x77DE5000。

重定位后的调试:

uboot 代码将对自身进行重定位,由于我们已映射符号文件存储器,因此,该重定位地址是错误的。

由此导致我们需要传递重定位地址以便调试器能够对此进行补偿:

poYBAGGYHyaAObBkAABBmke9wlg853.png

让我们使用 board_init_r 功能。

这是重定位后处理功能:

pYYBAGGYHyeAWQmeAAERYZkFfEI610.png

重定位后,board_init_r 地址将变为 0x77DE5000 + 0x801A880 = 0x7FDFF880。

如果我在 board_init_r 处添加中断点,即可看到实际地址符合预期:

pYYBAGGYHymAGpskAAAbvEqp2aI137.png

如果此时掉电并重新上电,则将命中 ATF 中的中断点,并且此时还会命中重定位后的 U-boot。

pYYBAGGYHyqAGfzPAAEfl9gJ5us334.png
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Xilinx
    +关注

    关注

    70

    文章

    2110

    浏览量

    119201
  • Zynq
    +关注

    关注

    9

    文章

    598

    浏览量

    46479
  • Vitis
    +关注

    关注

    0

    文章

    144

    浏览量

    7089
收藏 人收藏

    评论

    相关推荐

    基于开发板的U-Boot移植

    bootloader,也就是通用的bootloader。它存在于nandflash或者SD卡,它是开机上点之后,操作系统起来之前用来引导的一个程序。U-boot 的主要作用是进行内存的初始化
    发表于 01-14 14:31

    【OK210试用体验】u-boot篇 -- u-boot内存分布

    链接时确定,并与u-boot映像编译在一起。 从图可以看出,iROM运行汇编代码拷贝BL1到SDRAM,拷贝到的地址是TEXT_BASE。 u-boot的栈顶分配代码,
    发表于 09-07 16:48

    u-boot详解

    , ARTOS。这是U-BootUniversal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScal
    发表于 07-04 04:56

    eclipse调试U-boot出错,不能打开u-boot.bin

    3.7,ubuntu 12.04编译路径:$HOME/workspace/u-boot/u-boot-1.1.4bin路径:$HOME/workspace/u-boot/images
    发表于 07-02 02:32

    u-boot编译失败

    编译u-boot时出现以下错,arm-linux-ld: failed to merge target specific data of file /usr/local/arm/4.3.2/bin
    发表于 07-10 05:45

    Eclipse调试U-Boot的关键技术分析

    时,需要去掉代码重定位这一步,否则调试不了,也就是说,直接将编译好的u-boot下载到内存,然后使用Eclipse在内存调试
    发表于 07-15 05:45

    U-boot移植步骤详解!

    结构体的定义。我们需要针对Jz2440开发板增加NAND FLASH的结构体、S3C24X0_CLOCK_POWER结构体增加一个成员CAMDIVN。增加一个宏isS3C2410,用于U-Boot自动识别是s3c2410还是
    发表于 08-23 02:13

    如何在SDARM调试u-boot

    请问我有已经移植好的u-boot-1.1.6,烧入mini2440的nor flash可以正常使用。现在我想使用这个移植好的u-bootSDRAM重新
    发表于 09-25 05:45

    U-BOOT的启动流程分享

    语言不能直接访问,C运行之前需要准备堆栈),C阶段两次搬移:u-boot自搬移,内核搬移两次初始化:基本硬件初始化,大部分硬件初始化 第一条指令位置(参考u-boot.map)arch/arm/cpu/armv7/start.S
    发表于 01-18 10:17

    基于Arm可信固件Trusted Firmware-A该怎样去移植呢

    如何去实现TF-A引导u-boot启动的功能呢?基于Arm可信固件Trusted Firmware-A该怎样去移植呢?
    发表于 02-28 07:19

    ARM U-boot SPL源码简要分析

    应的start.S源码位于/u-boot/Arch/Arm/Cpu/Arm926ejs/目录下,其执行流程见下图。流程图中,关于CONFIG_SKIP_LOWLEVEL_INIT以及
    发表于 04-13 09:44

    介绍一下ART-Pi Smart的U-Boot下载及其烧录的步骤

    Smart 进行调试,所以我需要烧录 U-Boot。首先 ART-Pi Smart 的 SDK 已经提供了 U-Boot。路径 doc
    发表于 06-06 15:48

    u-boot的Makefile分析

    u-boot的Makefile分析 U-BOOT是一个LINUX下的工程,在编译之前必须已经安装对应体系结构的交叉编译环境,这里只针对ARM,编译器系列软件为arm-linux-*。
    发表于 05-17 09:16 1981次阅读

    基于ARM9的U-Boot自动识别启动实现

    嵌入式ARM9系列处理器支持U-Boot从Nor FLASH或者Nand FLASH启动,也支持U-Boot直接下载到内存中调试运行,根据U-Boo
    发表于 03-04 16:23 91次下载
    基于<b class='flag-5'>ARM</b>9的<b class='flag-5'>U-Boot</b>自动识别启动实现

    如何在 Vitis调试 Zynq UltraScale 器件启动镜像

    在本篇博文中,我们将探讨如何在 Vitis调试 Zynq UltraScale 器件启动镜像。这些启动镜像包括 ARM 可信固件 (AT
    的头像 发表于 06-01 15:35 2724次阅读
    如何在 <b class='flag-5'>Vitis</b> 中<b class='flag-5'>调试</b> Zynq UltraScale 器件启动镜像