uboot 之 gd分析

先看定义: 在 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 */
	#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;
	
	/*
	 * Global Data Flags
	 */
	#define	GD_FLG_RELOC	0x00001		/* Code was relocated to RAM		*/
	#define	GD_FLG_DEVINIT	0x00002		/* Devices have been initialized	*/
	#define	GD_FLG_SILENT	0x00004		/* Silent mode				*/
	
	#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")

赋初值:在board.c里有:

void start_armboot (void)
	{
		init_fnc_t **init_fnc_ptr;
		char *s;
	#ifndef CFG_NO_FLASH
		ulong size;
	#endif
	#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
		unsigned long addr;
	#endif
	
		/* Pointer is writable since we allocated a register for it */
		gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
		/* compiler optimization barrier needed for GCC >= 3.4 */
		__asm__ __volatile__("": : :"memory");
	
		memset ((void*)gd, 0, sizeof (gd_t));
		gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
		memset (gd->bd, 0, sizeof (bd_t));
	
		monitor_flash_len = _bss_start - _armboot_start;
	
		for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
			if ((*init_fnc_ptr)() != 0) {
				hang ();
			}
		}

引用的地方。

#include <common.h>
#include <exports.h>

DECLARE_GLOBAL_DATA_PTR;//先声明

static void dummy(void)
{
}

unsigned long get_version(void)
{
	return XF_VERSION;
}

void jumptable_init (void)
{
	int i;

	gd->jt = (void **) malloc (XF_MAX * sizeof (void *));//后使用
	for (i = 0; i < XF_MAX; i++)
		gd->jt[i] = (void *) dummy;

	gd->jt[XF_get_version] = (void *) get_version;
	gd->jt[XF_malloc] = (void *) malloc;
	gd->jt[XF_free] = (void *) free;
	gd->jt[XF_getenv] = (void *) getenv;
	gd->jt[XF_setenv] = (void *) setenv;
	gd->jt[XF_get_timer] = (void *) get_timer;
	gd->jt[XF_simple_strtoul] = (void *) simple_strtoul;
	gd->jt[XF_udelay] = (void *) udelay;
#if defined(CONFIG_I386) || defined(CONFIG_PPC)
	gd->jt[XF_install_hdlr] = (void *) irq_install_handler;
	gd->jt[XF_free_hdlr] = (void *) irq_free_handler;
#endif	/* I386 || PPC */
#if (CONFIG_COMMANDS & CFG_CMD_I2C)
	gd->jt[XF_i2c_write] = (void *) i2c_write;
	gd->jt[XF_i2c_read] = (void *) i2c_read;
#endif	/* CFG_CMD_I2C */
}

所以,综上所述,gd是一个指针,这个指针存放在通用寄存器 R8中,在start_armboot函数里面,对这个指针赋初值,让个这个指针指向一块内存。在需要引用这个指针的时候,只需要调用这个宏,然后就可以使用gd指向内存区域的成员变量了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值