設置堆棧 uboot內存使用圖
1、uboot第一階段start.S
設置堆棧
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */
sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* 跳過全局數據區 */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */只要將sp指針指向一段沒有被使用的內存就完成棧的設置了。
注:在配置文件tx244.h定義
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 128*1024)=192Kbyte
#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
#define CONFIG_ENV_SIZE 0x20000
2、uboot第二階段 start_armboot()
設置全局變量gd
gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
__asm__ __volatile__("": : :"memory");
memset ((void*)gd, 0, sizeof (gd_t));//將gd所指向內存區域的前gd_t所需空間 置零
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); //申請bd_t區間
memset (gd->bd, 0, sizeof (bd_t));
gd->flags |= GD_FLG_RELOC; //Code was relocated to RAM 表示代碼已經搬運到RAM中
monitor_flash_len = _bss_start - _armboot_start;//計算uboot代碼length
根據上面的代碼可以知道U-Boot內存使用情況了,如下圖所示:
注:1、用戶堆區_bss_start、_end地址如何得到?根據uboot.lds鏈接腳本,知道分佈位置。但具體地址由編譯後得到。
uboot.lds內容:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
。。。。。。。。。。。。。。。。。
. = ALIGN(4);
__bss_start = .;
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
_end = .;
}
2、查看uboot.map編譯後地址
_bss_start地址
_end地址
其中1、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 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
#ifdef CONFIG_FSL_ESDHC
unsigned long sdhc_clk;
#endif
#if 0
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long bus_clk;
phys_size_t ram_size; /* RAM size */
unsigned long reset_status; /* reset status register at boot */
#endif
void **jt; /* jump table */
} gd_t;
2、bd_t結構說明:
typedef struct bd_info {
int bi_baudrate; /* serial console baudrate */
unsigned long bi_ip_addr; /* IP Address */
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];
} bd_t;