1. 程式人生 > >u-boot學習(三):u-boot原始碼分析

u-boot學習(三):u-boot原始碼分析

前面兩節已經知道,u-boot其實就是一個大的微控制器程式,它負責啟動核心,主要包括硬體方面的一些初始化。下面就以u-boot-1.2.0為例對u-boot原始碼進行詳細的分析。

u-boot的啟動分為兩個階段,第一階段的程式碼就是上一節所說的連結檔案裡的第一個檔案start.S檔案,它是由組合語言編寫的。第二階段的程式碼是用c語言編寫的。

分析start.S檔案:

設定CPU的模式為管理模式(set the cpu to SVC32 mode)--->關閉看門狗( turn off the watchdog)--->遮蔽中斷(mask all IRQs by setting all bits in the INTMR - default)--->設定FCLK:HCLK:PCLK的時鐘比例(FCLK:HCLK:PCLK = 1:2:4)--->關閉CACHE、MMU(flush v4 I/D caches、disable MMU stuff and caches)--->初始化SDRAM(lowlevel_init),為了過載u-boot程式碼--->過載程式碼--->設定棧(Set up the stack),包括清bss段--->跳轉到start_armboot,進行第二階段的初始化

在第一階段的記憶體使用情況可用下圖所示:

對於u-boot初始化要注意一下幾點:

1、u-boot初始化中,設定CPU為SVC模式,但s3c2440有7中模式,為何不是設定為其他模式,原因如下:中止和未定義模式首先可以排除,因為這兩種模式是非正常模式,此處程式是正常執行的,不應該設定CPU為其中任何一種模式,所以可以排除。對於快中斷和中斷模式來說,此處uboot初始化的時候,也沒啥中斷要處理和能夠處理,而且即使是註冊了終端服務程式後,能夠處理中斷,那麼這兩種模式,也是自動切換過去的,所以,此處也不應該設定為其中任何一種模式。理論上可以設定為使用者模式,但由於此模式無法直接訪問很多的硬體資源,而uboot初始化,就必須去訪問這類資源,所以此處可排除。系統模式與使用者模式相比,所用的暫存器是一樣的,但增加了一些訪問在使用者模式下不能訪問的資源。管理模式本身屬於特權模式,本身就可以訪問那些受控的資源,比系統模式還多了些自己模式下的影子暫存器,所以,相對系統模式來說,可以訪問的資源能力相同,但擁有更多的硬體資源。還有另外一個原因:uboot作為一個Bootloader來說,最紅目的是為了啟動Linux的kernel,在做好準備工作跳轉到kernel之前,本身就要滿足一些條件,其中一個條件就是要求CPU處於管理模式的。所以,uboot在最初的初始化階段,就將CPU設定為管理模式,也是最合適的。

2、為何要關閉看門狗:看門狗的硬體邏輯就是硬體上有個記錄超時功能,需要使用者每隔一段時間去對其進行一定操作,比如往裡寫一些固定的值,俗稱“喂狗”,如果超過一定時間沒有喂狗,就會系統重啟。此處關閉看門狗是為了避免另外寫一段喂狗程式


u-boot第二階段流程圖如下所示: