酒店网站建设论文,科技小论文怎么写,互联网营销师考试,百度关键词搜索引擎一. uboot启动流程涉及函数 之前文章简单分析了 uboot启动流程的开始#xff0c;从链接脚本文件 u-boot.lds 中#xff0c;我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start函数。
_start函数#xff1a;调用了 reset 函数#xff0c;reset 函数内部…一. uboot启动流程涉及函数 之前文章简单分析了 uboot启动流程的开始从链接脚本文件 u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start函数。
_start函数调用了 reset 函数reset 函数内部最终调用了 save_boot_params_ret 函数。
save_boot_params_ret 函数
① 将处理器设置为SVC模式并且关闭FIQ和IRQ.
② 设置中断向量。
③ 初始化CP15 cpu_init_cp15 调用了 cpu_init_crit 函数。 其中 cpu_init_crit 函数 调用了函数 lowlevel_init函数。
本文继续简单分析 lowlevel_init函数即cpu_init_crit 函数 所调用的函数做了什么
本文继上一篇文章的分析地址如下
uboot启动流程涉及reset函数_凌肖战的博客-CSDN博客 二. lowlevel_init 函数详解 lowlevel_init 函数在文件 arch/arm/cpu/armv7/lowlevel_init.S 中定义内容如下
18 ENTRY(lowlevel_init)
19 /*
20 * Setup a temporary stack. Global data is not available yet.
21 */
22 ldr sp, CONFIG_SYS_INIT_SP_ADDR
23 bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
24 #ifdef CONFIG_SPL_DM
25 mov r9, #0
26 #else
27 /*
28 * Set up global data for boards that still need it. This will be
29 * removed soon.
30 */
31 #ifdef CONFIG_SPL_BUILD
32 ldr r9, gdata
33 #else
34 sub sp, sp, #GD_SIZE
35 bic sp, sp, #7
36 mov r9, sp
37 #endif
38 #endif
39 /*
40 * Save the old lr(passed in ip) and the current lr to stack
41 */
42 push {ip, lr}
43
44 /*
45 * Call the very early init function. This should do only the
46 * absolute bare minimum to get started. It should not:
47 *
48 * - set up DRAM
49 * - use global_data
50 * - clear BSS
51 * - try to start a console
52 *
53 * For boards with SPL this should be empty since SPL can do all
54 * of this init in the SPL board_init_f() function which is
55 * called immediately after this.
56 */
57 bl s_init
58 pop {ip, pc}
59 ENDPROC(lowlevel_init) 第 22 行设置 sp 指向 CONFIG_SYS_INIT_SP_ADDR CONFIG_SYS_INIT_SP_ADDR 在 include/configs/mx6ullevk.h 文件中在 mx6ullevk.h 中定义如下 234 #define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR
235 #define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE
236
237 #define CONFIG_SYS_INIT_SP_OFFSET \
238 (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
239 #define CONFIG_SYS_INIT_SP_ADDR \
240 (CONFIG_SYS_INIT_RAM_ADDR CONFIG_SYS_INIT_SP_OFFSET) 上面的宏 IRAM_BASE_ADDR 和 IRAM_SIZE 在文件 arch/arm/include/asm/arch-mx6/imx-regs.h 中有定义其实就是 IMX6UL/IM6ULL 内 部 ocram 的首地址和大小如下所示 71 #define IRAM_BASE_ADDR 0x00900000
......
408 #if !(defined(CONFIG_MX6SX) || defined(CONFIG_MX6UL) || \
409 defined(CONFIG_MX6SLL) || defined(CONFIG_MX6SL))
410 #define IRAM_SIZE 0x00040000
411 #else
412 #define IRAM_SIZE 0x00020000
413 #endif 如果 408 行的条件成立的话 IRAM_SIZE0X40000 当定义了 CONFIG_MX6SX 、CONFIG_MX6U 、 CONFIG_MX6SLL 和 CONFIG_MX6SL 中的任意一个的话条件就不成立 在 .config文件 中定义了 CONFIG_MX6UL 所以条件不成立 IRAM_SIZE0X20000128KB 。 可以得到如下值 CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR 0x00900000 。 CONFIG_SYS_INIT_RAM_SIZE 0x00020000 128KB 。 还需要知道 GENERATED_GBL_DATA_SIZE 的值在文件 include/generated/generic-asm-offsets.h 中有定义如下 9 #define GENERATED_GBL_DATA_SIZE 256
10 #define GENERATED_BD_INFO_SIZE 80
11 #define GD_SIZE 248可以看出GENERATED_GBL_DATA_SIZE256。 综上所述 CONFIG_SYS_INIT_SP_ADDR 值如下 CONFIG_SYS_INIT_SP_OFFSET 0x00020000 – 256 0x1FF00
CONFIG_SYS_INIT_SP_ADDR 0x00900000 0X1FF00 0X0091FF00 如下图所示为 sp指针的值 此时 sp 指向 0X91FF00 这属于 IMX6UL/IMX6ULL 的内部 ram 。 通过 lowlevel_init.S文件可以看出 第 23 行对 sp 指针做 8 字节对齐处理 第 34 行 sp 指针减去 GD_SIZE GD_SIZE 同样在 generic-asm-offsets.h 中定了大小为 248。 第 35 行对 sp 做 8 字节对齐此时 sp 的地址为 0X0091FF00-2480X0091FE08 此时 sp 位 如下 lowlevel_init.S 文件中的 lowlevel_init 函数 第 36 行将 sp 地址保存在 r9 寄存器中。 第 42 行将 ip 和 lr 压栈 第 57 行调用 s_init 函数。 第 58 行将第 36 行入栈的 ip 和 lr 进行出栈并将 lr 赋给 pc 。 下一篇文章分析
lowlevel_init函数调用的函数s_init 函数 save_boot_params_ret函数调用的函数 _main