u-boot中有一个用来保存很多有用信息的全局结构体-gd_t(global data缩写),
其中包括了bd变量,可以说gd_t结构体包括了u-boot中所有重要全局变量。
- 它是一个内核启动参数,是内核的一个重要的数据结构,它是一个结构体,它保存着内核启动所需要的重要参数,诸如串口波特率,有无控制台,环境变量地址.......
- 它的值一般要又有bootloader进行传递初始化。
对于ARM平台这个结构体的定义大致如下:
1 include/asm-arm/global_data.h 2 3 typedef struct global_data { 4 bd_t *bd; 5 unsigned long flags; 6 unsigned long baudrate; 7 unsigned long have_console; /* serial_init() was called */ 8 unsigned long reloc_off; /* Relocation Offset */ 9 unsigned long env_addr; /* Address of Environment struct */ 10 unsigned long env_valid; /* Checksum of Environment valid? */ 11 unsigned long fb_base; /* base address of frame buffer */ 12 13 #ifdef CONFIG_VFD 14 unsigned char vfd_type; /* display type */ 15 #endif 16 17 #if 0 18 unsigned long cpu_clk; /* CPU clock in Hz! */ 19 unsigned long bus_clk; 20 phys_size_t ram_size; /* RAM size */ 21 unsigned long reset_status; /* reset status register at boot */ 22 #endif 23 void **jt; /* jump table */ 24 } gd_t
bd_info (bd_t 类型)在include\asm-arm\u-boot.h 中定义
1 typedef struct bd_info { 2 int bi_baudrate; /* serial console baudrate */ 3 unsigned long bi_ip_addr; /* IP Address */ 4 unsigned char bi_enetaddr[6]; /* Ethernet adress */ 5 struct environment_s *bi_env; 6 ulong bi_arch_number; /* unique id for this board */ 7 ulong bi_boot_params; /* where this board expects params */ 8 struct /* RAM configuration */ 9 { 10 ulong start; 11 ulong size; 12 }bi_dram[CONFIG_NR_DRAM_BANKS]; 13 #ifdef CONFIG_HAS_ETH1 14 /* second onboard ethernet port */ 15 unsigned char bi_enet1addr[6]; 16 #endif 17 } bd_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文件中:
1 void __init setup_arch(char **cmdline_p) 2 { 3 …… 4 struct tag *tags = (struct tag *)&init_tags; 5 struct machine_desc *mdesc; 6 char *from = default_command_line; 7 void *bd_offset = NULL; 8 …… 9 save_bd(bd_offset); 10 …… 11 } 12 13 save_bd(): 14 15 void __init save_bd(void* addr) 16 { 17 memcpy((char *)__res, 18 (char *)addr, 19 sizeof(bd_t)); 20 arm_bd = (bd_t *)__res; 21 }