野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9391|回复: 1

[求助] imx6ull uboot 的 relocate_code 问题

[复制链接]
发表于 2021-10-27 10:34:19 | 显示全部楼层 |阅读模式
1火花
老师,您好。我在分析imx6ull的uboot启动流程时,有几个问题麻烦老师帮忙看一下,谢谢。

1. uboot在执行完 relocate_code 后,此时DDR里面是不是有两份uboot镜像了?
2. uboot在执行完 relocate_code 后,又重新设置了向量表,然后清除了bss段,接着跳转到了 board_init_r 进行外设的初始化。在这里执行的 board_init_r  从哪里可以看出来运行的是DDR中 relocate_code 后的uboot,而不是iROM加载的那份uboot呢?

  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. *  crt0 - C-runtime startup Code for ARM U-Boot
  4. *
  5. *  Copyright (c) 2012  Albert ARIBAUD <albert.u.boot@aribaud.net>
  6. */

  7. #include <config.h>
  8. #include <asm-offsets.h>
  9. #include <linux/linkage.h>
  10. #ifdef CONFIG_CPU_V7M
  11. #include <asm/armv7m.h>
  12. #endif

  13. /*
  14. * This file handles the target-independent stages of the U-Boot
  15. * start-up where a C runtime environment is needed. Its entry point
  16. * is _main and is branched into from the target's start.S file.
  17. *
  18. * _main execution sequence is:
  19. *
  20. * 1. Set up initial environment for calling board_init_f().
  21. *    This environment only provides a stack and a place to store
  22. *    the GD ('global data') structure, both located in some readily
  23. *    available RAM (SRAM, locked cache...). In this context, VARIABLE
  24. *    global data, initialized or not (BSS), are UNAVAILABLE; only
  25. *    CONSTANT initialized data are available. GD should be zeroed
  26. *    before board_init_f() is called.
  27. *
  28. * 2. Call board_init_f(). This function prepares the hardware for
  29. *    execution from system RAM (DRAM, DDR...) As system RAM may not
  30. *    be available yet, , board_init_f() must use the current GD to
  31. *    store any data which must be passed on to later stages. These
  32. *    data include the relocation destination, the future stack, and
  33. *    the future GD location.
  34. *
  35. * 3. Set up intermediate environment where the stack and GD are the
  36. *    ones allocated by board_init_f() in system RAM, but BSS and
  37. *    initialized non-const data are still not available.
  38. *
  39. * 4a.For U-Boot proper (not SPL), call relocate_code(). This function
  40. *    relocates U-Boot from its current location into the relocation
  41. *    destination computed by board_init_f().
  42. *
  43. * 4b.For SPL, board_init_f() just returns (to crt0). There is no
  44. *    code relocation in SPL.
  45. *
  46. * 5. Set up final environment for calling board_init_r(). This
  47. *    environment has BSS (initialized to 0), initialized non-const
  48. *    data (initialized to their intended value), and stack in system
  49. *    RAM (for SPL moving the stack and GD into RAM is optional - see
  50. *    CONFIG_SPL_STACK_R). GD has retained values set by board_init_f().
  51. *
  52. * 6. For U-Boot proper (not SPL), some CPUs have some work left to do
  53. *    at this point regarding memory, so call c_runtime_cpu_setup.
  54. *
  55. * 7. Branch to board_init_r().
  56. *
  57. * For more information see 'Board Initialisation Flow in README.
  58. */

  59. /*
  60. * entry point of crt0 sequence
  61. */

  62. ENTRY(_main)

  63. /*
  64. * Set up initial C runtime environment and call board_init_f(0).
  65. */

  66. #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
  67.         ldr        r0, =(CONFIG_SPL_STACK)
  68. #else
  69.         ldr        r0, =(CONFIG_SYS_INIT_SP_ADDR)
  70. #endif
  71.         bic        r0, r0, #7        /* 8-byte alignment for ABI compliance */
  72.         mov        sp, r0
  73.         bl        board_init_f_alloc_reserve        // 为malloc和gd_data留出空间
  74.         mov        sp, r0
  75.         /* set up gd here, outside any C code */
  76.         mov        r9, r0       
  77.         bl        board_init_f_init_reserve        // 初始化gd结构体

  78.         mov        r0, #0
  79.         bl        board_init_f

  80. #if ! defined(CONFIG_SPL_BUILD)

  81. /*
  82. * Set up intermediate environment (new sp and gd) and call
  83. * relocate_code(addr_moni). Trick here is that we'll return
  84. * 'here' but relocated.
  85. */

  86.         ldr        r0, [r9, #GD_START_ADDR_SP]        /* sp = gd->start_addr_sp */
  87.         bic        r0, r0, #7        /* 8-byte alignment for ABI compliance */
  88.         mov        sp, r0
  89.         ldr        r9, [r9, #GD_BD]                /* r9 = gd->bd */
  90.         sub        r9, r9, #GD_SIZE                /* new GD is below bd */

  91.         adr        lr, here
  92.         ldr        r0, [r9, #GD_RELOC_OFF]                /* r0 = gd->reloc_off */
  93.         add        lr, lr, r0
  94. #if defined(CONFIG_CPU_V7M)
  95.         orr        lr, #1                                /* As required by Thumb-only */
  96. #endif
  97.         ldr        r0, [r9, #GD_RELOCADDR]                /* r0 = gd->relocaddr */
  98.         b        relocate_code
  99. here:
  100. /*
  101. * now relocate vectors
  102. */

  103.         bl        relocate_vectors

  104. /* Set up final (full) environment */

  105.         bl        c_runtime_cpu_setup        /* we still call old routine here */
  106. #endif
  107. #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_FRAMEWORK)
  108. # ifdef CONFIG_SPL_BUILD
  109.         /* Use a DRAM stack for the rest of SPL, if requested */
  110.         bl        spl_relocate_stack_gd
  111.         cmp        r0, #0
  112.         movne        sp, r0
  113.         movne        r9, r0
  114. # endif
  115.         ldr        r0, =__bss_start        /* this is auto-relocated! */

  116. #ifdef CONFIG_USE_ARCH_MEMSET
  117.         ldr        r3, =__bss_end                /* this is auto-relocated! */
  118.         mov        r1, #0x00000000                /* prepare zero to clear BSS */

  119.         subs        r2, r3, r0                /* r2 = memset len */
  120.         bl        memset
  121. #else
  122.         ldr        r1, =__bss_end                /* this is auto-relocated! */
  123.         mov        r2, #0x00000000                /* prepare zero to clear BSS */

  124. clbss_l:cmp        r0, r1                        /* while not at end of BSS */
  125. #if defined(CONFIG_CPU_V7M)
  126.         itt        lo
  127. #endif
  128.         strlo        r2, [r0]                /* clear 32-bit BSS word */
  129.         addlo        r0, r0, #4                /* move to next */
  130.         blo        clbss_l
  131. #endif

  132. #if ! defined(CONFIG_SPL_BUILD)
  133.         bl coloured_LED_init
  134.         bl red_led_on
  135. #endif
  136.         /* call board_init_r(gd_t *id, ulong dest_addr) */
  137.         mov     r0, r9                  /* gd_t */
  138.         ldr        r1, [r9, #GD_RELOCADDR]        /* dest_addr */
  139.         /* call board_init_r */
  140. #if CONFIG_IS_ENABLED(SYS_THUMB_BUILD)
  141.         ldr        lr, =board_init_r        /* this is auto-relocated! */
  142.         bx        lr
  143. #else
  144.         ldr        pc, =board_init_r        /* this is auto-relocated! */
  145. #endif
  146.         /* we should not return here. */
  147. #endif

  148. ENDPROC(_main)
复制代码


回复

使用道具 举报

 楼主| 发表于 2021-10-27 15:03:38 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-3 14:35 , Processed in 0.030087 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表