欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

u-boot之start.S分析(四)

时间:2023-04-30

接下来紧挨着u-boot之start.S分析(三)最后的代码分析

再次设置栈

skip_hw_init:stack_setup:#if defined(CONFIG_MEMORY_UPPER_CODE)ldrsp, =(CFG_UBOOT_base + CFG_UBOOT_SIZE - 0x1000)#elseldrr0, _TEXT_basesubr0, r0, #CFG_MALLOC_LENsubr0, r0, #CFG_GBL_DATA_SIZE #if defined(CONFIG_USE_IRQ)subr0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsubsp, r0, #12#endif

通过查询可知,我们是定义了CONFIG_MEMORY_UPPER_CODE的,因此栈指针sp被设置为CFG_UBOOT_base + CFG_UBOOT_SIZE - 0x1000,即为0xc3e00000+2x1024x1024-0x1000=0xC3FFF000,对应的真实地址为0x33fff000意思就是在uboot的地址上加2M再减4K的地方,由于ARM是满减栈,因此从此位置开始往下大约2M就是栈的使用空间

清理BSS段

clear_bss:ldrr0, _bss_startldrr1, _bss_endmov r2, #0x00000000

_bss_start和_bss_end来源于链接器脚本(中间省略一层定义的描述)

、= ALIGN(4);__bss_start = .;.bss : { *(.bss) }_end = .;

启动start_armboot

clbss_l:strr2, [r0]addr0, r0, #4cmpr0, r1bleclbss_lldrpc, _start_armboot_start_armboot:.word start_armboot

至此,第一阶段分析完成start_armboot函数位于uboot/lib_arm/board.c中,是一个C语言函数最后通过lpr远跳转指令执行函数start_armboot远跳转的含义就是这句话加载的地址和当前运行地址无关,而和链接地址有关 在u-boot之start.S分析(一)中,将栈设置到了内部的SRAM中,大概只有8K大小,uboot在此执行部分代码在u-boot之start.S分析(三)中,将栈重新设置到了已经初始化完成的DDR中最后再重新规划DDR的使用,重新设置栈,设置完成后跳转到DDR中执行第二阶段。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。