標籤: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的記憶體分布和全域資料結構