uboot 的gd

发布时间 2023-05-23 16:45:16作者: FBshark

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 }