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中查看。

posted on   OrangeGLC  阅读(188)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示