一直用source insight找gd变量的定义都没找到,后来发现例如typedef int (init_fnc_t) (void); 以及#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")之类si都是无法辨别为定义的。所以比较难找
经过不懈努力终于发现了定义位置。我用的是arm板子,该定义在cpu/sam-arm/Global_data.h中定义
先定义一个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;
然后在后面用#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")将gd的位置存储在r8寄存器中,
这个宏信息量比较大啊。
gd_t结构体中包含了另外一个比较重要的结构体bd_t,该定义在U-bot.h中定义
typedef struct bd_info {
int bi_baudrate;
/* serial console baudrate */
unsigned long bi_ip_addr;
/* IP Address */
unsigned char bi_enetaddr[6]; /* Ethernet adress */
struct environment_s *bi_env;
ulong bi_arch_number;
/* unique id for this board */
ulong bi_boot_params;
/* where this board expects params */
struct /* RAM configuration */
{
ulong start;
ulong size;
} bi_dram[CONFIG_NR_DRAM_BANKS];
#ifdef CONFIG_HAS_ETH1
/* second onboard ethernet port */
unsigned char bi_enet1addr[6];
#endif
} bd_t;
具体内容就看后面注释了,都是初始化用的。