歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

FL2440的U-Boot在內存中的分布

如果u-boot是從nandflash啟動,硬件會自動把nandflash前0x1000Byte(即4KB)拷貝到 ‘Steppingstone’中。 ‘Steppingstone’有兩個起始地址映射一個是0x0,另一個是0x40000000。這時候PC跳轉到0x0地址處,即 ‘Steppingstone’起始位置處執行者4KB的代碼。這段代碼初始化了cpu模式和時鐘等等,有必要說下這時候的堆棧初始化這時候sp指針直接指向了0x33f0fffC(即 STACK_BASE+STACK_SIZE-4),fp是0x0也就是‘Steppingstone’的起始地址,FP寄存器及frame pointer介紹 http://www.linuxidc.com/Linux/2013-03/81247.htm。

然後又將nandflash存儲空間的起始0x0位置的到 0X60000 (#define LENGTH_UBOOT  0x60000)拷貝到0x33f80000(TEXT_BASE)。64MB的SDRAM是掛載到NGCS6上的,NGCS6的起始地址是0x30000000,也就是說SDRAM的起始地址是0x30000000,終止地址是0x34000000.因為0x34000000 - 0x33f80000 = 0x80000 是大於u-boot的代碼空間0x60000 (即LENGTH_UBOOT),0x80000 - 0x60000 = 0x20000,就是說u-boot上的高地址部分有0x20000的空著。

上面說的‘Steppingstone’中的哪4KB代碼拷貝完了自己後並沒有立即跳到0x33f80000這個位置去執行,而是接著初始化了SDRAM中的堆棧(這是第二次初始化堆棧了!),怎麼初始化的呢?我們看看首先看sp =  _TEXT_BASE - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE    /*  -(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)因為沒有用到所以注釋掉,這個u-boot沒有用到中斷  */  - 12(這個12是leave 3 words for abort-stack)= 0x33f80000 - (0x10000 + 0x4000) - 0x80 -  0xc = 0x33f6bf74(sp 沒有設置)。.rodata、.data、.got(這是什麼??先放著)、.u_boot_cmd、.bss區是在arch/arm/cpu/arm920t/u-boot.lds中定義的,貌似沒有具體值,這些是在u-boot代碼段後面,緊貼在0x33fe0000前面。

在start_armboot中有這個數據結構指針:gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t)),按上面的分析它在全局數據區(global_data)的頂部,這個指針指向的數據結構global_data如下:

typedef struct  global_data {
    bd_t        *bd;
    unsigned long  flags;
    unsigned long  baudrate;
    unsigned long  have_console;  /* serial_init() was called */
    unsigned long  env_addr;  /* Address  of Environment struct */
    unsigned long  env_valid;  /* Checksum of Environment valid? */
    unsigned long  fb_base;    /* base address of frame buffer */
#ifdef CONFIG_VFD
    unsigned char  vfd_type;  /* display type */
#endif
#ifdef CONFIG_FSL_ESDHC
    unsigned long  sdhc_clk;
#endif
#if 0
    unsigned long  cpu_clk;    /* CPU clock in Hz!    */
    unsigned long  bus_clk;
    phys_size_t ram_size;  /* RAM size */
    unsigned long  reset_status;  /* reset status register at boot */
#endif
    void        **jt;      /* jump table */
} gd_t;

Copyright © Linux教程網 All Rights Reserved