Uboot中start.S源码的指令级的详尽解析(二)

第 2 章 start.S的总结

摘要

2.1. start.S各个部分的总结

其实关于start.S这个汇编文件,主要做的事情就是系统的各个方面的初始化。

关于每个部分,上面具体的代码实现,也都一行行的解释过了,此处不再赘述。

此处,只是简单总结一下,其实现的方式,或者其他需要注意的地方。

  1. 设置CPU模式

    总的来说,就是将CPU设置为SVC模式。

    至于为何设置CPU是SVC模式,请参见后面章节的详细解释。

  2. 关闭看门狗

    就是去设置对应的寄存器,将看门狗关闭。

    至于为何关闭看门狗,请参见后面章节的详细解释。

  3. 关闭中断

    关闭中断,也是去设置对应的寄存器,即可。

  4. 设置堆栈sp指针

    所谓的设置堆栈sp指针,这样的句子,之前听到N次了,但是说实话,一直不太理解,到底更深一层的含义是什么。

    后来,看了更多的代码,才算有一点点了解。所谓的设置堆栈sp指针,就是设置堆栈,而所谓的设置堆栈,要做的事情,看起来很简单,就只是一个很简单的动作:让sp等于某个地址值,即可。

    但是背后的逻辑是:

    首先你自己要搞懂当前系统是如何使用堆栈的,堆栈是向上生长的还是向下生长的。

    然后知道系统如何使用堆栈之后,给sp赋值之前,你要保证对应的地址空间,是专门分配好了,专门给堆栈用的,保证堆栈的大小相对合适,而不要太小以至于后期函数调用太多,导致堆栈溢出,或者堆栈太大,浪费存储空间,等等。

    所有这些背后的逻辑,都是要经过一定的编程经验,才更加容易理解其中的含义的。

    此处,也只是简单说说,更多相关的内容,还是要靠每个人自己多实践,慢慢的更加深入的理解。

  5. 清除bss段

    此处很简单,就是将对应bss段,都设置为,0,即清零。

    其对应的地址空间,就是那些未初始化的全局变量之类的地址。

  6. 异常中断处理

    异常中断处理,就是实现对应的常见的那些处理中断的部分内容。

    说白了就是实现一个个中断函数。uboot在初始化的时候,主要目的只是为了初始化系统,及引导系统,所以,此处的中断处理部分的代码,往往相对比较简单,不是很复杂。

2.2. Uboot中的内存的Layout

总结了start.S做的事情之后,另外想在此总结一下,uboot中,初始化部分的代码执行后,对应的内存空间,都是如何规划,什么地方放置了什么内容。此部分内容,虽然和start.S没有直接的关系,但是start.S中,堆栈sp的计算等,也和这部分内容有关。

下面这部分的uboot的内存的layout,主要是根据:

  1. start.S中关于设置堆栈指针的部分的代码
    	/* Set up the stack						    */
    stack_setup:
    	ldr	r0, _TEXT_BASE		/* upper 128 KiB: relocated uboot   */
    	sub	r0, r0, #CFG_MALLOC_LEN	/* malloc area                      */
    	sub	r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
    
    #ifdef CONFIG_USE_IRQ
    	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
    #endif
    	sub	sp, r0, #12		/* leave 3 words for abort-stack    */
    
    	bl clock_init
                
  2. u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\cpu\arm920t\cpu.c中的代码
    int cpu_init (void)
    {
    	/*
    	 * setup up stacks if necessary
    	 */
    #ifdef CONFIG_USE_IRQ
    	IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4;
    	FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;
        FREE_RAM_END = FIQ_STACK_START - CONFIG_STACKSIZE_FIQ - CONFIG_STACKSIZE;
        FREE_RAM_SIZE = FREE_RAM_END - PHYS_SDRAM_1;
    #else    
        FREE_RAM_END = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4 - CONFIG_STACKSIZE;
        FREE_RAM_SIZE = FREE_RAM_END - PHYS_SDRAM_1;
    #endif
    	return 0;
    }
                
  3. u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\config.mk中的定义
    TEXT_BASE = 0x33D00000

分析而得出的。

uboot的内存的layout,用图表表示就是:

图 2.1. Uboot中的内存的Layout

Uboot中的内存的Layout
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值