uboot原始碼分析(3)

2021-05-28 02:42:54 字數 2697 閱讀 1190

正式開始了第二階段:

relocate部分的**負責把u-boot stage2的**從flash儲存器載入到記憶體,**如下:

163 #ifndef config_skip_relocate_uboot  

164relocate

165 

adr  r0,  _start 

// 獲取當前**存放位址  

00000000

166 

ldr  r1, _text_base 

// 獲取記憶體存放**位址  

33f80000

167 

cmp 

r0,  r1 

//位址相同說明程式已經在記憶體中則不需要載入

168 

beq 

stack_setup

169//開始載入

170 

ldr  r2,_armboot_start

// 獲取stage2**存放位址

171 

ldr r3,  _bss_start 

// 獲取記憶體**段起始位址  

172 

sub  r2,  r3, r2 

// 不包括向量表,u-boot的整個大小

173 

add  r2,  r0,  r2 

33f80000 size

// 計算stage2**結束位址

174 

175 

copy_loop

:  176 

ldmia  r0!,   

// 從flash複製**到記憶體  

177 

stmia r1!,   

178 

cmp  r0,  r2 

179 

blecopy_loop  

180 #endif 

181 

182 

// 在記憶體中建立堆疊  

183 

stack_setup:  

184 

ldr r0, _text_base 

185 

sub r0, r0, #cfg_malloc_len  

// 分配記憶體區域  

186 

sub r0, r0, #cfg_gbl_data_size  

187 #ifdef config_use_irq  

188 

sub r0, r0, #(config_stacksize_irq+config_stacksize_fiq)  

189 #endif  

190 

sub sp, r0, #12 

191 

192 clear_bss: 

// 初始化記憶體bss段內容為0  

193 

ldr r0, _bss_start 

// 查詢bss段起始位址  

194 

ldr  r1,  _bss_end 

// 查詢bss段結束位址  

195 

mov 

r2,  #0x00000000 

// 清空bss段內容  

196 

197  clbss_l: str r2, [r0] 

198 

add  r0,  r0,  #4  

199 

cmp  r0,  r1  

200 

ble  clbss_l  

223 

ldr  pc,  _start_armboot 

// 設定程式指標為start_armboot()函式位址  

224 

225 _start_armboot:

.word 

start_armboot //這裡是個c的函式名字,也就是入口位址

**解釋:

程式首先在165~168行檢查當前是否在記憶體中執行**,根據結果決定是否需要從flash儲存器載入**。程式通過獲取_start和_text_base所在的位址比較,如果位址相同說明程式已經在記憶體中,無須載入。

程式第170~173行計算要載入的stage2**起始位址和長度,然後在第176~179行迴圈複製flash的資料到記憶體,每次可以複製8個字長的資料。

stage2程式複製完畢後,程式第184~190行設定系統堆疊,最後在第193~200行清空記憶體bss段的內容。

relocate程式最後在223行設定程式指標暫存器為start_armboot()函式位址,程式跳轉到stage2部分執行。請注意第 225行的定義,_start_armboot全域性變數的值是c語言函式start_armboot()函式的位址,使用這種方式可以在彙編中呼叫c語言

編寫的函式。

uboot原始碼 MMC分析

1 作業系統下,mmu是開啟的,即linux驅動使用的都是虛擬位址。純裸機程式不會開啟mmu,全部使用實體地址。2 uboot早期也是純實體地址工作,但是現在的uboot開啟了mmu做了虛擬位址對映。1 linux的驅動是模組化設計。2 uboot移植了linux驅動源 3 uboot中的硬體驅動比...

u boot原始碼配置原理分析

華清遠見嵌入式學院講師。u boot的源 預設是不針對任何目標平台的,當我們要移植u boot到乙個特定的目標平台時,需要生成針對目標平台的配置檔案。u boot目前已經支援的晶元可以在include configs 下面找到。比如我們要編譯針對s3c2410晶元的u boot.bin,那麼我們就需...

u boot 原始碼分析 1 啟動過程分析

kbuild 啟動過程 第二階段 總結參考 對於uboot,我一直是雲裡霧裡的乙個狀態,這部分讓我感到自己很菜,不用縱向深入地掌握uboot整個細節,但是相對它有乙個整體流程上的把握,包括uboot的啟動啟動過程,在整個啟動過程中會涉及到哪些檔案,以此的呼叫過程是什麼?抱著這幾個問題,大量蒐集資料,...