uboot-step 9 代碼搬移不可少

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,224評論 25 708
  • 1:InputChannel提供函數創(chuàng)建底層的Pipe對象 2: 1)客戶端需要新建窗口 2)new ViewRo...
    自由人是工程師閱讀 5,717評論 0 18
  • 1 內存尋址 1.1 物理地址、虛擬地址以及線性地址 物理地址: 物理內存的內存單元地址 虛擬地址: 程序員看到的...
    瘋狂小王子閱讀 3,126評論 3 21
  • 今天晚上回家后小姑娘看見我就紅了眼圈,上午的數學單元測試時間不夠,最后一道題的最后一小問沒來得及做,前面也沒...
    三胖二狗的幸福Life閱讀 289評論 0 1
  • 聽過許多道理,卻依然過不好這一生。 我是一個聽著教導長大的孩子,嗯,是的,不是因為我從小插科打混,逃課泡吧,相反,...
    落時_半夏閱讀 605評論 0 0

友情鏈接更多精彩內容