U-boot中的gd結構體

U-boot中有一個用來保存很多有用信息的全局結構體--gd_t(global data縮寫),其中包括了bd變量,可以說gd_t結構體包括了u-boot中所有重要全局變量。
對於ARM平臺這個結構體的定義大致如下:
include/asm-arm/global_data.h
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 */

void
**jt;
/* jump table */
} gd_t;

在U-boot中使用gd結構之前要用先用宏DECLARE_GLOBAL_DATA_PTR來聲明。這個宏的定義如下:
include/asm-arm/global_data.h
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")

從這個宏的定義可以看出,gd是一個保存在ARM的r8寄存器中的gd_t結構體的指針。


對於Linux Kernel,在使用U-boot傳遞來的gd中的bd時用的是arm_bd,因爲:

在arch/arm/kernel/setup.c文件中:
void __init setup_arch(char **cmdline_p)
{
……

struct tag *tags = (struct tag *)&init_tags;

struct machine_desc *mdesc;

char *from = default_command_line;

void *bd_offset = NULL;
……

save_bd(bd_offset);
……
}

save_bd():
void __init save_bd(void* addr)
{

memcpy((char *)__res,
(char *)addr,
sizeof(bd_t));

arm_bd = (bd_t *)__res;
}

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