u-boot移植(二)---修改前工作:代碼流程分析1


一、代碼執行總體流程圖

1.1 代碼路徑 

  • U-boot.lds (arch\arm\cpu) 

  • vectors.S (arch\arm\lib) 

  • start.S (arch\arm\cpu\arm920t) 

  • lowlevel_init.S (board\samsung\jz2440) 

  • crt0.S (arch\arm\lib)

  • relocate.S (arch\arm\lib) 

  • Board_init.c (common\init) 

  • Board_f.c (common) 

  • Jz2440.h (include\configs) 

  • Generic-asm-offsets.h (include\generated) 

1.2 啟動代碼流程圖

  

 

二、鏈接文件

  目錄:u-boot-2017.03/arch/arm/cpu

  文件:u-boot.lds

  編寫好的 .lds 文件,在用 arm-Linux-ld 連接命令時帶 -Tfilename 來調用執行,如:arm-linux-ld-Tnand.lds x.o y.o -o xy.o

  也用-Ttext參數直接指定連接地址,如 arm-linux-ld-Ttext 0x30000000 x.o y.o -oxy.o

  既然程序有了兩種地址,就涉及到一些跳轉指令的區別。 
  ARM匯編中,常有兩種跳轉方法:b跳轉指令、ldr指令向PC賦值。 
  要特別注意這兩條指令的意思: 
  1> b step:b跳轉指令是相對跳轉,依賴當前PC的值,偏移量是通過該指令本身的bit[23:0]算出來的,這使得使用b指令的程序不依賴於要跳到的代碼的位置,只看指令本身。 
  2> ldr pc, =board_init_r :該指令是一個偽指令編譯后會生成以下代碼:ldr pc, [pc, #8]

    從內存中的某個位置讀出數據並賦給PC,同樣依賴當前PC的值,所以可以用它實現從Flash到RAM的程序跳轉。

  2種方式指明程序地址,這里分析下第二種方式,在根目錄 Makefile文件有如下一行:

  

  在文件 include/configs/jz2440.h 有定義:

  

  我們在這里可以用下面的命令生成 u-boot.dis文件(注意交叉編譯器的名字):

  arm-2440-linux-gnueabi-objdump -D -m arm u-boot > u-boot.dis

  

  在0 地址執行的是 _start.S文件,然后跳轉到reset執行,接着定義異常向量表:

  

  在u-boot.lds 腳本中並沒有指定基地址, 根目錄下的 u-boot 腳本是由 arch/arm/cpu/u-boot.lds 在編譯的時候生成的,所以如果要修改u-boot.lds 需要找到正確的地方。

  u-boot.lds 分析:  1 #include <config.h>

 2 /* 指定輸出可執行文件是elf格式,32位ARM指令,小端模式 */  3 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")  4 OUTPUT_ARCH(arm) /* 指定輸出文件的的平台體系為ARM */  5 ENTRY(_start) /* 指定可執行映像文件的起始段的段名是 _start,這里跳轉到vector.S執行 */  6 SECTIONS  7 {  8 /DISCARD/ : { *(.rel._secure*) }  9 /* 指定可執行的 image 文件的全局入口點,通常這個地址都發給你法rom(flash)0x0位置。  10  * 必須使編譯器知道這個地址,一般不修改此處,而是修改其它地方的宏定義*/  11 . = 0x00000000;  12 . = ALIGN(4);  13  .text :  14  {  15 /* 映像文件賦值起始地址,它在文件 arch/arm/lib/sections.c 中定義:  16  * char __image_copy_start[0] __attribute__((section(".__image_copy_start")));*/  17 *(.__image_copy_start)  18 /* arch/arm/lib/vectors.S 里有一句:.section ".vectors" */  19 /* 這里的 vectors 是讓vector.S 鏈接的二進制文件的開頭部分 */  20 *(.vectors)  21 CPUDIR/start.o (.text*) /* 執行 start.S */  22 *(.text*) /* 其他代碼 */  23  }  24  25 . = ALIGN(4);  26 /* 只讀數據段,所有的只讀數據段都放在這個位置 */  27 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }  28  29 . = ALIGN(4);  30 /* 可讀寫數據段,所有的可讀寫數據段都放在這個位置 */  31  .data : {  32 *(.data*)  33  }  34  35 . = ALIGN(4);  36  37 . = .;  38  39 . = ALIGN(4);
    /* U-BOOT命令段 */
40 .u_boot_list : { 41 KEEP(*(SORT(.u_boot_list*))); 42 } 43 44 . = ALIGN(4); 45 46 .image_copy_end : 47 { 48 *(.__image_copy_end) 49 } 50
    /* 相對動態信息段 */ 51 .rel_dyn_start : 52 { 53 *(.__rel_dyn_start) 54 } 55 56 .rel.dyn : { 57 *(.rel*) 58 } 59 60 .rel_dyn_end : 61 { 62 *(.__rel_dyn_end) 63 } 64 65 .end : 66 { 67 *(.__end) 68 } 69 70 _image_binary_end = .; 71 72 /* 73 * Deprecated: this MMU section is used by pxa at present but 74 * should not be used by new boards/CPUs. 75 */ 76 . = ALIGN(4096); 77 .mmutable : { 78 *(.mmutable) 79 } 80 81 /* 82 * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c 83 * __bss_base and __bss_limit are for linker only (overlay ordering)

     * bss段,里面放置的是初始值為0的全局變量和靜態變量,這些變量不會保存在
        * 二進制文件中

 84 */  85  86  .bss_start __rel_dyn_start (OVERLAY) : {  87 KEEP(*(.__bss_start));  88 __bss_base = .;  89  }  90  91  .bss __bss_base (OVERLAY) : {  92 *(.bss*)  93 . = ALIGN(4);  94 __bss_limit = .;  95  }  96  97  .bss_end __bss_limit (OVERLAY) : {  98 KEEP(*(.__bss_end));  99  } 100 101 .dynsym _image_binary_end : { *(.dynsym) } 102 .dynbss : { *(.dynbss) } 103 .dynstr : { *(.dynstr*) } 104 .dynamic : { *(.dynamic*) } 105 .plt : { *(.plt*) } 106 .interp : { *(.interp*) } 107 .gnu.hash : { *(.gnu.hash) } 108 .gnu : { *(.gnu*) } 109 .ARM.exidx : { *(.ARM.exidx*) } 110 .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) } 111 }

  鏈接執行,首先是進入到arch/arm/vector.S 中執行,在其中執行 _start.S_start.S 的首行就跳轉到 start.S 中的 reset 中去執行了。

  這里沒有執行SPL,若要加上SPL,則還需要加上 nandflash 

  鏈接腳本暫時的流程為:

  

  跳轉A處,A代碼在Vector.S中,執行_start.S代碼,下一節看 _start.S的代碼,並分析其過程。

 

備注:后續會更新此文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM