uboot启动第一阶段——start.S
一:引入start.S
? ? u-boot整個程序的入口取決于鏈接腳本u-boot.lds中ENTRY聲明的地方。ENTRY(_start)因此 _start符號是整個程序的入口。
二:分析start.S
? ??
從SD卡和nand啟動是需要16字節校驗頭(mkv210image.c就是為了計算這個校驗頭),dnw下載方式不需要校驗頭。這16字節在目前只能起到占位的功能,內容是不對的,還需要后面去計算校驗和填充。
?
?
構建異常向量表,這個異常表順序是CPU設計時決定的,是硬件決定的。這些異常應該被處理,如果不處理這些這些異常,程序會跑飛。復位異常的代碼是 b reset ,因此在CPU復位后真正去執行的有效代碼是reset處的代碼,因此reset符號處,才是真正有意義代碼的開始處。
異常處理程序指針。其中,.balignl 16,0xdeadbeef? .balignl 16 是以16字節對齊,如果沒有對齊,用0xdeadbeef這個數字來填充,這個填充沒有什么特別的意義。為什么要對齊呢?有時候是為了提高訪問效率,有時候是硬件的要求。
?
?
TEXT_BASE在makefile配置階段@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk進行設置的。這就是我們指定程序的鏈接地址,這是一個虛擬地址。
CFG_PHY_UBOOT_BASE也是鏈接地址,但是和TEXT_BASE不同的是,CFG_PHY_UBOOT_BASE是物理地址。
?
?
armboot_start后面重定位的時候會用到。_bss_start是bss段的起始地址,_bss_end是bss段的結束地址。
?
?
后面就開始真正分析,啟動之后開始運行的程序reset
設置CPU運行SVC模式,禁止IRQ和FIQ。其實s5pv210上電默認就是在SVC模式,這里用軟件重新設置一下,是為了保證代碼的完整性,兼容更多的硬件。
設置L2 cache
刷新icache和dcache
關閉MMU
?
?
讀取啟動信息,并且判斷啟動方式。最后將判斷出來的啟動方式存進專門用來存儲信息的寄存器中。
?
?
在sram中設置棧指針,因為馬上要開始調用C語言函數
?
?
調用C語言函數,用于初始化底層外設,包括關看門狗、時鐘、DDR和串口。這部分完全屬于裸機層面的開發,這里不展開分析。
?
?
這個是開發板供電鎖存,具體看開發板的設計,不用太糾結于此
?
?
再一次設置棧指針,由于之前已經初始化過DDR,因此現在可以將棧指針設置到DDR中,內存更大了。
?
?
判斷在sram中運行還是在DDR中運行,如果在sram中運行則表示冷啟動。冷啟動的情況下需要對代碼進行重定位,反之不要。
?
?
判斷啟動方式,準備從啟動介質中將代碼重定位到DDR中
?
?
假設我們是從SD卡中啟動uboot的,我們的程序就會跳轉到mmcsd_boot進行運行
這部分代碼就是將uboot從SD卡中將程序拷貝到DDR中,然后跳轉到after_copy
?
?
設置轉換表基地址,并且使能MMU。以后再操作內存的時候,就將使用虛擬內存地址。轉換表基地址具體怎么設置不做分析,但是為了以后分析方便,將對應關系給出來
?
?
重新設置棧指針,這次將棧指針設置到uboot上方2MB的地方,使得內存規劃地更加緊湊,之后開始清理bss段。
?
?
萬事具備之后,使用一個遠跳轉,跳轉到DDR中去運行。
?
至此uboot第一部分的使命就結束了。
總結
以上是生活随笔為你收集整理的uboot启动第一阶段——start.S的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中加入scrip代码,HTML
- 下一篇: Modbus节点地址规则