ivt主要包含(詳見< 8.6.1.1: image vector table structure >):
名稱含義
header
ivt頭部,標識ivt和ivt長度
entry
第一條指令的入口位址,即uboot的入口
dcddcd資料的位址,緊跟在boot data後面
boot data
boot data的位址,boot data緊跟在ivt後面
csfcsf的位址
boot data包含:
名稱含義
start
啟動資料載入到記憶體的位址
length
啟動資料載入到記憶體的長度
plugin
...
entry(_start) //表明uboot的入口位址
....text :
...
上述的u-boot.lds**片段,我們獲取到兩個資訊:
a.uboot的入口位址是_start(它的定義是在cpu/arm_cortexa8/start.o中)
b.uboot.bin第乙個存放的是board/freescale/mx6q_riot/flash_header.o裡面的**,第二個存放的是cpu/arm_cortexa8/start.o裡的**.
根據上面的分析我們知道,在uboot之前有乙個program image,所以我們不難猜到board/freescale/mx6q_riot/flash_header.o裡定義的就是program image.
2. 開啟board/freescale/mx6q_riot/flash_header.s:
...
.section
".text.flasheader", "x"
b _start //跳轉到uboot入口位址
.org config_flash_header_offset //此處定義為ivt的偏移量0x400
ivt_header:
.word
0x402000d1
/*tag=0xd1, len=0x0020, ver=0x40*/
.word _start //uboot入口位址
reserv1:
.word
0x0dcd_ptr:
.word dcd_hdr
boot_data_ptr:
.word boot_data
self_ptr:
.word ivt_header
.word
0x0reserv2:
.word
0x0boot_data:
.word text_base //uboot載入到記憶體的位址
image_len:
.word _end_of_copy - text_base + config_flash_header_offset //uboot載入到記憶體的長度
plugin:
.word
0x0...
dcd_hdr:
.word
0x40e001d2
/* tag=0xd2, len=59*8 + 4 + 4, ver=0x40 */
write_dcd_cmd:
.word
0x04dc01cc
/* tag=0xcc, len=80*8 + 4, param=0x04 */
.../* dcd */
可以看到ivt,boot data,dcd以及偏移量等關鍵資訊,與上面的分析完全吻合.
我們可以通過hexdump列印一下已編譯好的uboot.bin再次核對:
$ hexdump -n 2048 u-boot.bin0x00000000 的值是0xea000186,這是一條彙編指令,即flash_header.s中定義的b _start一致.0000000 0186 ea00 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
* 0000400 00d1 4020 0620 2780 0000 0000 042c 2780
0000410 0420 2780 0400 2780 0000 0000 0000 0000
0000420 0000 2780 9f98 0006 0000 0000 01d2 40e0
0000430 01cc 04dc 0e02 7407 0c00 0000 0e02 5407
0000440 0000 0000 0e02 ac04 0000 3000 0e02 b004
0000450 0000 3000 0e02 6404 0000 3000 0e02 9004
0000460 0000 3000 0e02 4c07 0000 3000 0e02 9404
0x00000004~0x000003ff都是0x00000000,與flash_header.s中的定義.org config_flash_header_offset一致.
0x00000400的值是0x402000d1,與flash_header.s中的定義ivt_header: .word 0x402000d1一致.
… 所以燒寫的時候,一定要把u-boot.bin燒寫到emmc的最前端,這樣子片內啟動**才能正常啟動uboot.
i.mx6 solo晶元引入了program image的資料結構,用於指示片內rom的啟動**從何處載入uboot並且跳轉到何處進入uboot。在uboot原始碼中定義了program image資料結構,並且鏈結的時候被鏈結到u-boot.bin的最開始的位置。燒寫uboot的時候也應該將uboot燒寫到儲存裝置的最低端方可正常啟動。
1.i.mx6 solo資料手冊《imx6sdlrm.pdf》
IMX6Solo啟動流程 Linux 核心啟動 二
上篇我們說到uimage的生成流程,核心真正的入口位址是在arch arm boot compressed中,所以我們首先看下該目錄下面的vmlinux.lds。text 入口位址就是 start 段,定義在head.s中。在這裡要注意一下乙個段是 piggydata 它的定義在piggy.gzip...
IMX6ULL啟動流程
假設板子設定為sd tf卡啟動,boot rom程式會做什麼?把程式從sd tf卡讀出來,執行。從 讀?從sd tf卡讀,這需要先初始化sd tf卡 根據efuse或gpio的設定初始化sd tf卡。讀到 去?讀到記憶體即ddr去,這需要先初始化ddr。除了初始化啟動裝置 初始化ddr,還需要初始化...
IMX6ULL uboot啟動分析(六)
已經對board init f函式進行了簡單介紹,在這個函式當中,會呼叫一系列的函式去初始化一些早期的板子外設和gd結構體的成員變數,但是board init f函式並沒有將所有的外設進行初始化,還有一些後續的工作需要完成,這些工作就是由board init r函式去完成。在介紹board init...