正式開始了第二階段:
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的啟動啟動過程,在整個啟動過程中會涉及到哪些檔案,以此的呼叫過程是什麼?抱著這幾個問題,大量蒐集資料,...