uboot移植-內存分佈

設置堆棧 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;


 

 

 

 

 

 

 

 

發佈了51 篇原創文章 · 獲贊 65 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章