了解引导加载程序结构的好工具或方法?

电器工程 嵌入式 软件 引导加载程序 调试
2022-02-02 12:14:41

我最近发现了我一直在使用运行U-boot的 Atmel AT91SAM9G20 SBC (一个开源引导加载程序)处理的一个令人讨厌的错误的原因。问题的核心是 U-boot 期望硬件的配置与我构建的不同,因此一些设备寄存器配置错误。

现在我已经解决了问题,我需要调整 U-boot 以正确配置寄存器。我可以通过在程序末尾添加几行代码来盲目地做到这一点,但这很混乱。

这让我想到了我的问题:我怎样才能弄清楚 U-boot 如何比从 main() 开始并读取所有文件中所有可能的代码路径更有效?我尝试在文件中四处寻找并查看相关标识符附近的代码。事实证明这是无效的;似乎大部分代码都是我不关心的子系统的驱动程序。我现在实际上了解引导加载程序如何工作得很好,但我希望存在比我天真的方法更好的方法。

2个回答

有几种工具/策略可能会有所帮助:

  • 更好地理解源代码的工具:

    • cscope是一个用于探索 C 代码的工具,它类似于 grep 但理解语法
    • 调用图生成器绘制函数调用结构图
    • Fenris看起来很有趣,虽然我没试过
  • 运行时分析

    • 使用调试器逐步浏览有趣的部分并分析发生了什么
    • 使用 gcc 的检测功能在每个函数的进入/退出时调用一大块好东西。例如。http://ndevilla.free.fr/etrace/
  • 编写自己的迷你引导加载程序

    • 我经常发现理解某件事的最好方法是自己重新创造它

不幸的是,没有万能的秘方。

你是如何配置它为 AT91 构建的?

代码树的设计似乎使得任何体系结构特定的东西都位于“arch/(cpu class)/(cpu type)/...”树中。我在 arch/arm/cpu/arm926ejs/at91... 下找到了 AT91 代码...您要更改的特定于变体的东西不在那里吗?在该目录中没有太多可查看的内容,尤其是因为几乎一半的文件是特定于 AT91 变体的。

对不起,如果这很明显......但你没有提到检查这个。

我还没有看过 uBoot 代码树,但是你的帖子吓到我了。我的一个后备项目最终涉及在定制的 iMX233 PCB 上使用 uBoot 和 Linux。我很想获得这种关于 uBoot 架构和特定于变体的东西的隔离程度以及这将是多么痛苦的反馈。