uboot文件——crt0_64.S


简单翻译一下文件里的注释,加深理解和记忆。

一、概述

This file handles the target-independent stages of the U-Boot
start-up where a C runtime environment is needed. Its entry point
is _main and is branched into from the target's start.S file.

一言蔽之,就是提供C运行环境。

二、细节

  1. 为调用board_init_f()函数设置初始环境,这个环境只提供了一个栈和一个存放全局数据结构体的地方,两者都位于一些现有的内存中。在这个背景下,全局变量数据,初始化与未初始化的(BSS段),都是不可用的。只有已初始化的常量数据是可用的。全局数据在board_init_f()调用之前应该是0.
  2. 调用board_init_f()。这个函数为执行(指令)从系统内存准备硬件。由于系统内存尚不可用,board_init_f()必须使用当前全局数据区存放之后阶段中的数据。这些数据包含重定位目的地,将来的栈和将来的全局数据区的位置。
  3. 设置中间环境,栈和全局数据区是由board_init_f()在系统内存里分配的,但是BSS段和已初始化的非常量数据仍然不可用。
    • 对于正确的uboot(不是SPL,SPL(secondary program loader)),调用relocate_code()。这个函数从它当前的位置重定位到board_init_f()计算出的目标地址。
    • 对于SPL,board_init_f()只是返回(到crt0)。在SPL没有代码重定位。
  4. 为调用board_init_f()设置最终的环境。这个环境有BSS段(初始化为0),已初始化的非常量(初始化为预期值),和在系统内存里的栈(对SPL而言,移动栈和全局数据到RAM是可选的,参考CONFIG_SPL_STACK_R)。全局数据去保留了由board_init_f()设置的值。
TODO: For SPL, implement stack relocation on AArch64.
  1. 对于uboot(非SPL),一些CPU在这一点上还有有剩余些关于内存的工作要做,所以调用c_runtime_cpu_setup
  2. Branch to board_init_r().

更多信息可在README中的Board Initialisation Flow中查看。