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第二階段流程圖如下所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章