Omap138開發板下以uboot2012.04.01為例分析uboot執行(三)
阿新 • • 發佈:2018-12-20
Omap138記憶體分配總圖
board_init_f函式分析
該函式位於/uboot/arch/arm/lib目錄下:
1.分析該函式在記憶體中的位置
起始位置:c1080000
呼叫位置:c1081258
2.在da850sdi.h中,它的與系統相關的配置是以CONFIG_SYS開頭的,與板子相關的配置是以CONFIG開頭的。
3.#define CONFIG_SYS_SDRAM_BASE 0xc0000000
gd是一個全域性變數,它儲存在暫存器r8中, gd = (gd_t *) ((CONFIG_SYS_INIT_SP_ADDR) & ~0x07); -> #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000 - GENERATED_GBL_DATA_SIZE) /* Fix this */ -> #define GENERAGTED_GBL_DATA_SIZE(128) /*(sizeof(struct global_data)+15)&~15*/ -> 0xc0000000+0x1000-0x0080=0xc0000F80
4.uboot連結映象結構分析
.text程式碼段
__image_copy_end:程式碼的映象部分結束了
*(.dynsym):放了動態符號的內容,載入一些庫,elf的時候用
*(./mmutable):動態記憶體管理的單元都是以4K為單元對齊的
*(.bss)段就是可變換的資料
- 初始化函式的執行(位於/uboot/arch/arm/lib/board.c)
init_sequence中存放了初始化函式的指標
(1) arch_cpu_init():由於在da850sdi.h中,CONFIG_ARCH_CPU_INIT沒有定義,所以該函式不執行。類似的board_early_init_f(), fdtdec_check_fdt()也不執行。 (2) timer_init():(位於:\uboot\arch\arm\cpu\arm926ejs\davinci)用來初始化時鐘,使用的模式如下: /*using timer34 in unchained 32-bit mode, full speed */ (3) env_init():(位於:\uboot\common) /* 初始化環境,使用預設的環境*/ 使用default_environment[0]. 裡面包括:CONFIG_BOOTARGS,CONFIG_ETHADDR、CONFIG_SERVERIP、CONFIG_NETMASK等變數。 (4) init_baudrate();(位於/uboot/arch/arm/lib/board.c) ->getenv_ulong("baudrate", 10, CONFIG_BAUDRATE); /*取名稱為“baudrate”的環境變數,如果取不到,就設定為以十進位制表示的CONFIG_BAUDRATE的值。*/ 這個定義在default_environment[ ]中找不到,但是在da850sdi.h中可以找到CONFIG_BAUDRATE的定義。 #define CONFIG_BAUDRATE 115200 (5) serial_init()和console_init_f()這兩個初始化函式完成之後,就可以通過串列埠和uboot之間進行命令的互動了。 serial_init():(位於/uboot/common) -> get_current()->init(); -> __weak struct serial_device *default_serial_console(void) __weak的意思是如果在別的地方已經定義了,那麼此處的定義失效。 -> INIT_ESERIAL_STRUCTURE(port, name) ->{ eserial0,\ eserial0_init,\ NULL,\ eserial0__setbrg,\ eserial0__getc,\ eserial0__tstc,\ eserial0__putc,\ eserial0__puts, } console_init_f():(位於\uboot\common)用於顯示終端的初始化 (6)display_banner();用來列印版本號 (7)dram_init():(位於\uboot\arch\arm\cpu\arm926ejs\davinci) 確定可用的DDR大小為512M。 ->get_ram_size() /* * Check memory range for valid RAM. A simple memory test determines * the actually available RAM size between addresses `base' and * `base + maxsize'. */