【问题标题】:U-Boot. Where does it all begin?U型启动器。这一切从哪里开始?
【发布时间】:2013-08-30 00:39:38
【问题描述】:

这里是新手问题。

我在看一个u-boot板文件,里面有很多功能。
例如; board_mmc_init(), enet_board_init(), setup_splash_img(),

这些函数中的大多数都不是从板文件中调用的。他们从其他地方接到电话。但我不知道在哪里。

在 Linux 内核板文件中有一个机器结构。在那里我们可能有.init_machine = myboard_init. 然后myboard_init(void) 将调用其他函数,这些函数又会调用其他函数。我觉得这种风格很容易阅读。

我的问题是; u-boot 是否有 .init_machine? 的等价物我在哪里可以看到一切“开始”的地方?谁把所有这些松散的函数都放在一个 u-boot 中 boardfile?

-安迪

【问题讨论】:

    标签: u-boot


    【解决方案1】:

    首先,uboot 会从指定 CPU 的 start.S 开始,像这样: http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/start.S;h=ef62fc83270a327bc7df970f598540f1d7ce0fe2;hb=HEAD

    它会做一些诸如“异常向量”设置、缓存设置等的事情。

    然后它会跳转到 http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=arch/arm/lib/crt0.S 做一些 c 运行时设置,

    然后它会回到start.S,在一些杂项之后,你可以参考cmets, 它将跳转到 lowlevel_init.S http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/lowlevel_init.S;h=82b2b86520eb2b2d63c2478145b625a49f931542;hb=HEAD

    然后.. 它将进入 soc(在 ARM 中很常见) init,如下所示: http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/mx6/soc.c

    在 soc init 完成后,它会进入一些板相关的 init, 在板子初始化中,它会调用一些外围设备/驱动程序初始化。

    希望这会给您的 uboot 进程带来一些帮助。

    【讨论】:

    • Uboot 主要不是链接静态程序,不像linux内核那样。所以你可能需要小心 Makefile 和链接脚本。
    【解决方案2】:

    我有一个带有 bcm283x Broadcom 架构和 arm1176 arm 核心的树莓派板。 所以start.S位于arch/arm/cpu/arm1176/start.S。这将初始化关键寄存器并禁用 mmu。 接下来它将执行lowlevel_init,然后分支到_main,这是在树莓派位于arch/arm/lib/crt0.S的情况下定义的 这会初始化堆栈指针和全局数据,并调用 board_init_f 来初始化系统 RAM(DRAM)以执行 u-boot 代码。它应该使用 global_data 指针来执行。

    【讨论】:

      【解决方案3】:

      在 u-boot-2013.04 上,board_mmc_init 从驱动程序/mmc/mmc.c 调用,函数 mmc_initialize(...)。

      要找到这个,“grep -r”(递归)是你的朋友。

      “我在哪里查看一切'开始'的地方?”

      不确定,但请查找 ENTRY(_start) 行。

      【讨论】:

        猜你喜欢
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多