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