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