uboot 最重要的变量存储结构体gd

本文详细解析了U-Boot中全局数据结构gd_t及bd_t的定义与使用方法,并介绍了如何通过特定宏定义将全局数据指针存储于寄存器中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直用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;

具体内容就看后面注释了,都是初始化用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值