uboot中gd全局變量

在uboot源碼中,按照uboot代碼流程,進入第二階段的入口函數,start_armboot, 慕名奇妙的來了一個變量gd, 初始化如下:

gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
還是真不好找到這個變量定義的地方,只有認真的閱讀代碼才知道。以下給出這個變量的定義。

DECLARE_GLOBAL_DATA_PTR;    //在board.c最上面

DECLARE_GLOBAL_DATA_PTR定義如下:
以下應用:http://hi.baidu.com/rwen2012/item/783c47cf40d23427e80f2e51

   #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8") 

這個聲明告訴編譯器使用寄存器r8來存儲gd_t類型的指針gd,即這個定義聲明瞭一個指針,並且指明瞭它的存儲位置。
register表示變量放在機器的寄存器
volatile用於指定變量的值可以由外部過程異步修改。

並且這個指針在start_armboot()(board.c)中被初始化:
    /* Pointer is writable since we allocated a register for it */
    gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));

這樣,gd就指向的一個可用的內存地址了。

==============================================================
typedef struct bd_info {
    unsigned long        bi_baudrate;
    unsigned long        bi_ip_addr;
    unsigned char        bi_enetaddr[6];
    unsigned char        bi_phy_id[4];
    struct environment_s    *bi_env;
    unsigned long        bi_board_number;
    void            *bi_boot_params;
    struct {
        unsigned long    start;
        unsigned long    size;
    }            bi_dram[CONFIG_NR_DRAM_BANKS];
    unsigned long        bi_flashstart;
    unsigned long        bi_flashsize;
    unsigned long        bi_flashoffset;
} bd_t;


#ifndef    __ASM_GBL_DATA_H
#define __ASM_GBL_DATA_H
/*
* The following data structure is placed in some memory wich is
* available very early after boot (like DPRAM on MPC8xx/MPC82xx, or
* some locked parts of the data cache) to allow for a minimum set of
* global variables during system initialization (until we have set
* up the memory controller so that we can use RAM).
*
* Keep it *SMALL* and remember to set CFG_GBL_DATA_SIZE > sizeof(gd_t)
*/

typedef    struct    global_data {
    bd_t        *bd;
    unsigned long    flags;
    unsigned long    baudrate;
    unsigned long    have_console;    /* serial_init() was called */
    unsigned long    reloc_off;    /* Relocation Offset */
    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
#if 0
    unsigned long    cpu_clk;    /* CPU clock in Hz!        */
    unsigned long    bus_clk;
    unsigned long    ram_size;    /* RAM size */
    unsigned long    reset_status;    /* reset status register at boot */
#endif
    void        **jt;        /* jump table */
} gd_t;

/*
* Global Data Flags
*/
#define    GD_FLG_RELOC    0x00001        /* Code was relocated to RAM        */
#define    GD_FLG_DEVINIT    0x00002        /* Devices have been initialized    */
#define    GD_FLG_SILENT    0x00004        /* Silent mode                */

#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")

#endif /* __ASM_GBL_DATA_H */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章