1. 程式人生 > >Uboot中start.S原始碼的指令級的詳盡解析(二)

Uboot中start.S原始碼的指令級的詳盡解析(二)

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