uboot原始碼第一階段分析(感性認識)
原始碼位置 cpu/arm920t/start.S 這個檔案我們一般稱之為 uboot的第一階段程式碼,是 ARM GNU 彙編寫成的,我們如何理解程式碼構思思路
以現實社會中的火車作為例項來類比執行的系統,這樣方便理解記憶。
cpu(火車頭)以管理模式(SVC32 模式)
整個單板就像一列飛速疾馳的火車,一旦上電以後,他將飛快的速度執行,就是沒有程式碼,他也照樣以一定的頻率(速度)跑。火車執行一般分為幾種模式,無人駕駛,有人駕駛。因為此時沒有程式碼的指引,所以我們的cpu(火車頭)必須有人來操作他的執行(當然是為了車上的乘客的安全著想了),這種模式我們稱之為(管理模式 SVC32 模式,全權管理火車的所有部件,具有至高無常的權利,可以操作所有的硬體裝置)
關閉看門狗 關閉所有中斷
車執行以後,我們需要關閉所有的報警裝置,和一些外面的干擾,因為此時車上沒有指令,除了駕駛人員,其他什麼人都沒有,沒人其他的人來處理外界的,所以索性遮蔽所有的干擾。
初始化時鐘(車執行的速度)
此時火車的執行在一個相對安靜的狀態,不過,此時的速度是太慢了,所以還需全面提升車的速度,這就需要駕駛人員來配置各個車廂速度的比例,來重新配置整個火車的執行速度。
相信我們的車此時以高速疾馳在鐵軌之上,我們引導linux kernel 的終極任務還將繼續把。也就是還要完成更生層次的任務啦,天將降大任於斯人也,所以我們還得把車頭配置一下,來適應更加複雜的任務。這就是cpu的深度初始化
CPU深度初始化
深度初始化,那得想想cpu裡面到底有什麼,這樣才知道深度初始化啥啊!cpu裡面有 mmu(記憶體管理單元)、cashe ,以及一些必要的暫存器組(RS);我們此時應該清楚ashe ,關閉MMU,暫存器組在設定svc32模式、中斷以及時鐘的時候已經配置過了。
初始化記憶體
cpu此時才是真正的整裝待發,萬事俱備,只是少一些連續的0101010011100這些的二進位制數來配置裡面的上百門的開關,驅動外部電路。也就是說此時 程式是關鍵的部分咯。那麼,程式是在我們的NAND或者是NOR裡面的,程式的執行必須要在sdram裡面呀,所以,需要程式,帶讓程式有處可放,記憶體的初始化是當務之急。
重定位程式碼
程式碼有了好的執行環境(SDRAM),此時程式不得不被請君入座咯,程式碼的重定位說的就是將FLASH中的程式碼複製到 SDRAM中。
設定棧幀
感慨今日長櫻在手,試問合適傅住蒼龍。英雄寶劍在手,無處施展。程式碼是有了,但是執行C程式碼還需要特殊的要求,就是設定 棧 ,棧的作用就是為函式的呼叫提供了短暫的儲存空間,儲存 返回地址,區域性變數,以及中間資料,呼叫返回之後就會釋放,至關重要。
清除bss段
按道理說此時應該直接呼叫C函式進入uboot第二階段的程式碼的。可是,ELF可執行檔案有一個特殊的段,這個段儲存著未初始化的全域性變數和靜態變數,這些變數的值是需要在執行的時候才確定的,所以我們必須要這個區域清零。
呼叫 _armboot_start 進入第二階段程式碼