u-boot的記憶體分布和全域資料結構

來源:互聯網
上載者:User

標籤:ash   cloc   進位   size   環境變數   white   拷貝   分布   應該   

U-boot,除非在RAM中調試,一般情況下都是從flash中執行一段代碼,然後將flash中儲存的代碼和資料搬移到ram中,然後跳轉到ram中執行。當然這應該也是一般的bootloader的執行方式,大家都差不多,但是各個bootloader的記憶體規劃(棧,堆之類的)也 不太一樣,而且u-boot還在記憶體空間中規划了一些用於存放環境變數和一些資料結構的空間,所以如果不瞭解一下的話,直接看代碼的話就會有一點迷糊。有必要先介紹一下。關於u-boot的記憶體分布,或者說記憶體映射,網上有人畫了一幅圖,比較的清晰,如下: 上面的圖上其實漏了一個部分,就是在flash中,一般情況在緊跟U-boot映像的後面,還有一個存放環境變數的地區(不過這個地區好像是可選可不選的),一般都是在flash中取一個sector來存放環境變數。
  • U-boot映像:U-boot燒寫進flash的映像,在uboot的術語中,這部分的大小叫做monitor_size.所以在uboot中,這個二進位檔案就叫做monitor.這個U-boot映像會被運送到RAM中,也可以看見RAM中有一塊也是U-boot映像。
  • 環境變數地區:環境變數存放在flash和RAM中各一份,在flash中一般存放在緊隨Monitor也即U-boot鏡像的下一個sector中,儲存一些諸如IP地址等資訊,在程式被拷貝到RAM中時,環境變數也同時被拷貝到RAM中。
  • CFG_MALLOC_LEN:這個地區是用來存放堆資料和環境變數的,這個地區是緊接著RAM中的U-boot鏡像的,也可以看出,在U-boot的基地址往下開闢了這一段地區。環境變數在本來儲存在FLASH中,在系統初始化的時候,flash中的這些環境變數也同樣被複製到RAM中,在系統啟動並執行時候,可以修改RAM中的值來改變系統的環境變數,但是掉電重啟後,還是用的FLASH中的設定值,當然也可以寫flash來改變預設的環境變數。
  • GBL_DATA_SIZE:這個地區是緊接著CFG_MALLOC_LEN資料區段的,從圖上也可以看出來,這一段是用來存放一個gd_t資料結構的,這個資料是一個uboot中用到的資料結構,用來存放系統的一些資訊,在下面會列出這個資料結構
  • 另外,在SDRAM_BASE開始的地址上,一般存放著二級跳轉中斷向量,這些中斷向量一般是用來為uclinux等作業系統用的。
  • 其他的如棧的分布如所示。
 下面列出在uboot中使用的gt_d資料結構的定義(arm):值的含義也是比較的直觀
 1 typedef struct  global_data { 2   bd_t            *bd; 3   unsigned long   flags; 4   unsigned long   baudrate; 5   unsigned long   have_console;   /* serial_init() was called */ 6   unsigned long   reloc_off;      /* Relocation Offset */ 7   unsigned long   env_addr;       /* Address  of Environment struct */ 8   unsigned long   env_valid;      /* Checksum of Environment valid? */ 9   unsigned long   fb_base;        /* base address of frame buffer */10   #ifdef CONFIG_VFD11     unsigned char   vfd_type;       /* display type */12   #endif13   #if 014     unsigned long   cpu_clk;        /* CPU clock in Hz!             */15     unsigned long   bus_clk;16     unsigned long   ram_size;       /* RAM size */17     unsigned long   reset_status;   /* reset status register at boot */18   #endif19   void            **jt;           /* jump table */20 } gd_t; 
其中flags的可選項如下:
1 /*2 * Global Data Flags3 */4 #define GD_FLG_RELOC    0×00001         /* Code was relocated to RAM            */5 #define GD_FLG_DEVINIT  0×00002         /* Devices have been initialized        */6 #define GD_FLG_SILENT   0×00004         /* Silent mode                          */
其中bd_t資料結構的定義如下:
 1 typedef struct bd_info { 2   int                 bi_baudrate;    /* serial console baudrate */ 3   unsigned long       bi_ip_addr;     /* IP Address */ 4   unsigned char       bi_enetaddr[6]; /* Ethernet adress */ 5   struct environment_s               *bi_env; 6   ulong               bi_arch_number; /* unique id for this board */ 7   ulong               bi_boot_params; /* where this board expects params */ 8   struct                              /* RAM configuration */ 9   {10     ulong start;11     ulong size;12   } bi_dram[CONFIG_NR_DRAM_BANKS];13   #ifdef CONFIG_HAS_ETH114     /* second onboard ethernet port */15     unsigned char   bi_enet1addr[6];16   #endif17 } bd_t;

u-boot的記憶體分布和全域資料結構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.