uboot-step 9 代碼搬移不可少
這篇文章主要介紹了關于代碼搬移的一些問題:
- 為什么要進行代碼搬移
- 從哪里搬移代碼
- 搬移代碼到哪里去
- 搬移代碼的大小是多少
1.為什么進行代碼搬移
要回答這個問題,首先要來了解下s3c6410的啟動方式:
根據芯片手冊中的描述,6410的啟動方式可以分為SROM (8/16 bit),OneNand,MODEM,IROM啟動等4種,其中IROM啟動又可以分為SD/MMC,OneNAND.NAND等幾種,一般都采用從NANDflash中啟動。圖片下面是選擇啟動設備為IROM時的處理器啟動流程

boot.png
- a.處理器上電后,當選擇從IROM中啟動時,會運行片內rom中由芯片廠商固化好的程序BL0
- b.片內Rom中的程序BL0會根據處理器特定引腳的狀態(tài)去判斷處理器的啟動設備是什么,例如flash,sd卡等
- c.接著會將啟動設備中前4Kb大小的代碼拷貝到內部sram中即steppingstone中,所拷貝的這段代碼稱為BL1
- d.當BL0拷貝BL1到steppingstone之后,便會跳轉到steppingstone中去執(zhí)行BL1的代碼
- e.BL1中的代碼最大只有4KB,而一般的bootloader大小都超過了4KB,因此BL1中的代碼需要將剩余的bootloader代碼(被稱為BL2)拷貝搬移到內存中
- f.完成搬移之后就會跳轉到內存中的BL2執(zhí)行后續(xù)代碼
了解了處理器的啟動流程后,我們也就知道了進行代碼搬移的原因....
2.從哪里搬移代碼
一般情況下正宗的uboot 搬移代碼應該是從nandflash 中搬移剩余的代碼到內存中,但是現(xiàn)在所編寫的代碼大小還遠遠達不到4KB的大小,因此,BL0已經將所有的代碼搬移到了stepping stone中,而且nandflash還沒有進行初始化,沒辦法從nanflash中讀取剩余的數據代碼,因此暫時我們應該是從stepping stone 中開始搬移代碼,而stepping stone所在地址為0xc000000
3.搬移代碼到哪里去
當然,這個比較簡單,明顯是將代碼搬移到內存中去,內存的起始地址為0x50000000,為了給搬移內核代碼預留空間,因此我們將代碼搬移到內存的0x8000偏移地址處。即0x50008000
4.搬移代碼的大小
這個也比較簡單,因為BL0最多拷貝了4KB大小的數據,因此這里我們也拷貝這么多
5.代碼實現(xiàn)
copy_to_ram:
ldr r0, =0x0c000000 @stepping stone 地址,代碼搬移開始地址
ldr r1, =0x50008000 @內存目標地址
add r3, r0, #1024*4 @搬移結束時stepping stone 中的位置
copy_loop:
ldr r2, [r0], #4
str r2, [r1], #4
cmp r0, r3
bne copy_loop
mov pc, lr