栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

再次设置栈

skip_hw_init:
	
stack_setup:
#if defined(CONFIG_MEMORY_UPPER_CODE)
	ldr	sp, =(CFG_UBOOT_base + CFG_UBOOT_SIZE - 0x1000)
#else
	ldr	r0, _TEXT_base		
	sub	r0, r0, #CFG_MALLOC_LEN	
	sub	r0, r0, #CFG_GBL_DATA_SIZE 
#if defined(CONFIG_USE_IRQ)
	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
	sub	sp, 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:
	ldr	r0, _bss_start		
	ldr	r1, _bss_end		
	mov r2, #0x00000000		

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

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

启动start_armboot

clbss_l:
	str	r2, [r0]		
	add	r0, r0, #4
	cmp	r0, r1
	ble	clbss_l
	
	ldr	pc, _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中执行第二阶段。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743472.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号