那麼在載入我們的os之前程式究竟做了哪些事情呢?
接下來,就詳細的敘述一下,u-boot第一階段的啟動過程:
(1)設定異常向量表:表中存放的是一些跳轉指令,可以跳轉到相關的異常處理函式。
(2)設定arm的核位svc(管理模式),禁止irq,fiq異常的產生。
(3)關閉cache ,mmu。關閉cache是因為此時我們用cpu所呼叫的過程中cache還沒有儲存相關的有效內容,
所以要關閉它,而mmu記憶體管理單元,是把虛擬的位址對映為實際的實體地址,當然這是在載入os之後才能完成的事情。
(4)關閉看門狗。我們都知道看門狗的作用,此時就是為了防止系統自動的復位所以才關閉的。
(5)設定向量中斷控制器:
1 禁止所有的中斷。
2 設定所有的中斷型別為irq.
3 清除公共向量位址暫存器。
(6)初始化uart的gpio口,為了之後串列埠的正常使用,所以初始化串列埠是必須的。
(7)初始化系統的時鐘,這裡面需要注意的是,系統時鐘必須在載入作業系統之前給初始化了,若在載入os之後才初始化,此時容易導致記憶體的不穩定,當然後果極為可能就是系統over了。
(8)初始化ddr記憶體控制器,為之後要把引導引導程式載入到記憶體做好鋪墊。
(9)判斷u_boot是否已經在記憶體中執行,該步是為了防止,之前已經把bootloader載入到了記憶體中而設定的。
若已經存在,怎直接設定棧,反之,搬移u-boot到記憶體位址。
(10) 設定棧。記住,棧是從上往下壓的。
(11)清除.bss段,.bss段中本來存放的是未初始化的全域性變數,以及未初始化的靜態變數,所以剛開始的時候
在nand flash中是未知的,所以在拷貝bootloader到記憶體的時候,我們並沒有把.bss段給拷貝到記憶體中去,而是在拷貝過去之後,我們一步步的把.bss段給清0了。
(12)設定pc到記憶體中的相應位置,也就是把第一階段bootloader的大小給偏移過去的第二階段的bootloader的地方,去執行接下來的操作。
其中我們需要注意的是,我們常常從nand flash啟動,但是u-boot預設的常常是從nor flash啟動,這樣就需要我們自己手動的將nand flash啟動的**新增進去。
u boot移植啟動流程詳細分析(2)
學習底層的東西,首要的就是去了解他的架構,整體的思路知道了,就會在出現問題的時候有很清晰的思路,知道 出的問題,以及程式是如何執行的,相信做到上面的,所遇到的問題,大都會迎刃而解了吧,高手是有很多的,所謂的高手,不過也就那樣吧,努力努力也是可以趕超的。之前,介紹了u boot的第一階段的啟動流程,那...
const詳細分析
最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...
約數詳細分析
約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...