uboot启动第二阶段——start_armboot
首先看一個gd_t這個結構體,global_data顧名思義就是全局數據,主要保存了uboot的配置信息
bd:板子相關信息? ??flags:相關標志位? ??baudrate:串口波特率? ??have_console:控制臺初始化? ??reloc_off:重定位偏移量? ??env_addr:環境變量地址? ??env_valid:環境變量校驗成功? ??fb_base:幀緩沖基地址? ? jt:一些函數入口
?
?
這是一個非常巧妙的用法,將gd的地址保存在r8寄存器中。這樣做的好處是,可以方便地在不同的文件中進行調用,并且經常頻繁調用的數據存在寄存器中效率會很高。
?
?
從中我們可以看出uboot的內存排布是下面這樣的
?
?
結合start.S和u-boot.lds,可以知道這句代碼用于計算鏡像大小。
但是分析的時候很容易將C語言調用匯編標志和匯編調用匯編標志搞混,具體分析方法參照我的上一篇博客。
博客鏈接地址為:https://blog.csdn.net/lushoumin/article/details/82866957。
?
?
很顯然在遍歷函數指針數組,并調用所有函數,下面看一下init_sequence這個數組內容
很顯然是在做一些初始化工作:
cpu_init:什么也沒干
board_init:初始化dm9000網卡,初始化機器碼和啟動參數地址
interrupt_init:初始化定時器4
env_init:初始化環境變量,就是設置默認環境變量
init_baudrate:初始化串口波特率
serial_init:前面已經初始化過串口,這里什么也沒干
console_init_f:初始化控制臺,就是讓控制臺標志位置1
display_banner:顯示uboot信息
print_cpuinfo:打印時鐘信息
checkboard:打印開發板信息
init_func_i2c:初始化i2c
dram_init:初始化DDR信息
display_dram_config:打印DDR信息
?
?
板子上根本沒有norflash,所以這些代碼沒有實際價值
?
?
初始化動態內存區域,其實就是清空堆區
?
?
初始化MMC或者初始化nandflash,取決于配置
?
?
重定向環境變量,即將環境變量從存儲介質中重定向到DDR中
?
?
從環境變量中獲取IP地址和MAC地址
?
?
初始化設備驅動鏈表,并且將一些設備加入鏈表。事實上,這里我們只是將串口設備加入鏈表
?
?
初始化很多的函數入口地址,事實上整個uboot都沒有發現調用這些入口,所以沒什么大用,可以不看
?
?
初始化控制臺,這里初始化完之后,uboot就可以使用控制臺了
?
?
由于沒有配置中斷,因此這句代碼會指向一個空函數
?
?
指向了一個空函數
?
?
網卡相關初始化,事實上板子用的dm9000網卡已經在前面初始化過了,這里其實什么也沒干
?
?
這玩意兒是搞LCD的logo用的,不用管它
?
?
這個是更新程序用的,將程序從SD里面燒錄的相應介質中
?
?
到這里start_armboot的使命就結束了,下面將跳進main_loop函數中進行命令解析和操作。
總結
以上是生活随笔為你收集整理的uboot启动第二阶段——start_armboot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LwIP之动态内存池
- 下一篇: 为什么“消费降级”突然火了?数字基尼系数