1. 程式人生 > >uboot分析之uboot啟動過程分析

uboot分析之uboot啟動過程分析

1.拿到uboot的原始碼之後,一般需要經過四個步驟:

(1)解壓縮

(2)打補丁:patch -p? < ..補丁檔案

解釋:?用數字替代,表示忽略掉前幾級目錄。

(3)配置:因為uboot可以支援很多種晶片,需要將其配置為支援特定的晶片

解釋:這一步一般就是執行make config,config是特定的一個配置檔案。

(4)編譯

2.在uboot下,如果想檢視有哪些可用的命令,可以輸入?或者輸入help,然後回車即可。

若想檢視某個命令的具體用法,那麼輸入“? 命令”即可。

3.設定uboot的bootdelay

set bootdelay 5

saveenv

reset

4.uboot的功能是為了啟動核心,uboot需要從flash讀取核心到記憶體,然後啟動核心。

uboot在啟動核心之前需要完成的初始化工作一般包括關閉看門狗,初始化時鐘,初始化SDRAM等。

uboot在擁有基本的功能的同時還擁有網路驅動,usb驅動,燒寫flash,串列埠驅動等等一些輔助的功能。

uboot可以理解為一個微控制器程式。

5.分析uboot的組織結構,最簡單的方法就是分析makefile。

make 100ask24x0_config的時候就相當於是執行makefile檔案裡面目標為100ask24x0_config的這條指令。

配置時執行的操作是新建了一些連結檔案等。

指令碼檔案中:>表示新建一個檔案,>>表示追加內容到一個檔案。

6.生成的uboot裡面,如果要檢視檔案存放的先後順序,就需要去看uboot的連結檔案。

連結檔案中的*,一般表示所有檔案的意思,比如*(.text)就表示所有檔案的程式碼段。

 7.uboot 要完成的功能:

硬體相關初始化:

關閉看門狗、初始化時鐘、初始化SDRAM(設定棧、讓SP指向記憶體中某個位置)

軟體相關初始化:

從flash讀出核心、啟動核心

8.uboot閱讀第一個檔案:cpu/arm920t/start.s

uboot第一階段:

跳轉到reset第一件事情就是將CPU設定為svc32模式、關看門狗、關中斷、判斷SDRAM是否被初始化(判斷程式碼的位置是否在SDRAM)、關flash、關MMU、初始化儲存控制器、設定棧、初始化時鐘、把uboot程式碼讀取到RAM中、清除bss段(初始化值為0的值,比如未初始化的全域性變數)、呼叫start_armboot。

_bss_start = .;//.表示當前地址。

判斷SDRAM是否被初始化擴充說明:如果是上電執行,程式碼從nand flash拷貝過來,_start的地址為0,如果是用模擬器下載到SDRAM,那麼_start的地址為連結地址(對應於SDRAM中的一個地址)。

判斷是否從nor flash啟動的方法:如果從nor flash啟動,那麼0地址的資料不可寫(必須遵守一定的時序),如果從nand flash啟動,前4KB的內容已經拷貝到SRAM中,0地址是可以寫的。

uboot第二階段:

第二階段從start_armboot開始:

nor flash以及nand flash的初始化、環境變數(如果flash上有設定好的環境變數,那麼就使用flash上設定的,否則使用預設的環境變數)、進入main_loop函式、s=getenv("bootcmd")、run_command(s,0)。

怎麼讀取flash中的核心以及怎麼啟動?

答:bootcmd環境變數中有詳細的方法。讀取核心:nand read.jffs2 0x30007FC0 kernel;啟動核心:bootm 0x30007FC0。