当前位置:   article > 正文

2020-12-19_config_spl_reloc_stack

config_spl_reloc_stack

SPL和U-boot的代码流

请阅读以下这篇文章,您将了解SPL和U-boot的代码流。

板初始化流程:
这是板的预期启动流程。这两者都适用
SPL和U-Boot正确(即它们都遵循相同的规则)。
注意:“SPL”代表“Secondary Program Loader”,如中所述,更多详细信息,请参阅本文件。
目前,SPL主要使用单独的代码路径,但是函数名每个功能的作用是相同的。一些板或架构
可能与此不符。至少大多数ARM板CONFIG_SPL_FRAMEWORK符合这一点。

执行通常是从特定于体系结构的(而且可能是特定于CPU)start.S文件,例如:

-arch/arm/cpu/armv7/start.S
-arch/powerpc/cpu/mpc83xx/start.S
- arch /mips/cpu/start.S
  • 1
  • 2
  • 3

等等。从这里可以调用三个函数:目的和这些功能的限制如下所述。

lowlevel_init():
-目的:基本初始化以允许执行到达board_init_f()
-无global_data或BSS
-没有堆栈(ARMv7可能有一个堆栈,但很快就会被移除)
-不得设置SDRAM或使用控制台
-必须只执行最低限度的操作才能继续执行board_init_f()
-这几乎是不需要的
-从此函数正常返回
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
board_init_f():
-目的:设置机器准备运行board_init_r():i.e. SDRAM和串行UART
- global_data可用
-堆栈在SRAM中
-BSS不可用,因此不能使用全局/静态变量,仅堆栈变量和global_data
  • 1
  • 2
  • 3
  • 4
  • 5

非SPL特定注释:
-调用dram_init()来设置dram。如果已经在SPL中完成什么也做不了

SPL特定注释:

  • 根据需要提供版本,您可以用自己的函数重写整个board_init_f()函数
    -在极端情况下,可以在此处调用preloader_console_init()
    -应该设置SDRAM,以及使UART工作所需的任何东西
    -这些不需要清除BSS,它将由crt0.S完成
    -必须从此函数正常返回(不要调用直接board_init_r())

这里BSS被清除。对于SPL,如果定义了CONFIG_SPL_STACK_R,则此时,堆栈和global_data将重新定位到下面配置文件栈地址。对于非SPL,U-Boot被重新定位为在内部的顶部。

board_init_r():
-用途:主执行,通用代码
- global_data 可用
-SDRAM可用
-BSS可用,可以使用所有静态/全局变量
-执行最终继续到main_loop()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

非SPL特定注释:
-U-Boot被重新定位到内存顶部,现在正在从那里运行。

SPL特定注释:
-如果定义了CONFIG_SPL_STACK_R并且CONFIG_SPL_STACK_R_ADDR指向SDRAM,则堆栈在SDRAM中是可选的

-这里可以调用preloader_console_init()-通常是通过定义CONFIG_SPL_BOARD_INIT,然后提供包含此调用的spl_board_init()函数
-加载U-Boot或(在falcon模式下)Linux

如果您在当前的PSDK U-boot上找不到确切的代码流,请探索如何从grep命令的优势中获益。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/130005
推荐阅读