U-Boot。它的起源在哪里?

7
新手问题。
我在查看一个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板文件中混杂在一起的那些函数?
3个回答

18

首先,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,在执行一些其他杂项之后(可以参考注释),它将跳转到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中非常常见), 如下所示:

http://git.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=blob;f=arch/arm/cpu/armv7/mx6/soc.c

完成SoC初始化后,将进行一些与板子相关的初始化。在板子初始化中,将调用一些外围设备/驱动程序的初始化。

希望这可以对您的u-boot进程有所帮助。


Uboot并不像Linux内核那样大多是链接静态程序。因此,您可能需要仔细查看Makefile和链接脚本。 - Jiejing Zhang

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指针来执行。

0
在u-boot-2013.04中,board_mmc_init从drivers/mmc/mmc.c中调用,函数为mmc_initialize(...)。
要找到这个,可以使用“grep -r”(递归)命令。
“我应该去哪里查看所有东西的'开始'位置?”
不确定,但可以查找ENTRY(_start)行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接