此處分析的是九鼎科技的x210開發闆的使用的uboot。
首先要明确一點,uboot該從哪裡開始分析?uboot有這麼多檔案,不知如何下手哇!
/*uboot的檔案*/
[email protected]:/usr/local/arm/uboot/jiuding/uboot# ls -al
total 6376
drwxr-xr-x 23 1003 1003 4096 Sep 26 20:30 .
drwxr-xr-x 3 root root 4096 Sep 26 10:51 ..
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 api
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 api_examples
-rw-rw-r-- 1 1003 1003 908 Jan 20 2012 arm_config.mk
drwxrwxr-x 3 1003 1003 4096 Sep 26 2012 board
-rw-rw-r-- 1 1003 1003 1258181 Jan 20 2012 CHANGELOG
-rw-rw-r-- 1 1003 1003 190034 Jan 20 2012 CHANGELOG-before-U-Boot-1.1.5
-rw-rw-r-- 1 1003 1003 48110 Jan 20 2012 Changelog_Samsung
drwxrwxr-x 2 1003 1003 12288 Sep 27 10:27 common
-rw-rw-r-- 1 1003 1003 6814 Jan 20 2012 config.mk
-rw-rw-r-- 1 1003 1003 15951 Jan 20 2012 COPYING
drwxrwxr-x 3 1003 1003 4096 Sep 26 2012 cpu
-rw-rw-r-- 1 1003 1003 12304 Jan 20 2012 CREDITS
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 disk
drwxrwxr-x 3 1003 1003 4096 Jan 20 2012 doc
drwxrwxr-x 20 1003 1003 4096 Sep 26 2012 drivers
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 examples
drwxrwxr-x 8 1003 1003 4096 Jan 20 2012 fs
-rw-rw-r-- 1 1003 1003 492 Jan 16 2013 .gitignore
-rwxrwxr-x 1 1003 1003 151 Jan 20 2012 image_split
drwxrwxr-x 13 1003 1003 12288 Sep 27 10:27 include
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 lib_arm
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 libfdt
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 lib_generic
-rw-rw-r-- 1 1003 1003 14125 Jan 20 2012 MAINTAINERS
-rwxrwxr-x 1 1003 1003 13693 Jan 20 2012 MAKEALL
-rw-rw-r-- 1 1003 1003 102481 Sep 26 2012 Makefile
-rwxrwxr-x 1 1003 1003 54 Sep 26 2012 mk
-rwxrwxr-x 1 1003 1003 2854 Jan 20 2012 mkconfig
-rwxrwxr-x 1 1003 1003 746 Jan 20 2012 mkmovi
drwxrwxr-x 3 1003 1003 4096 Jan 20 2012 nand_spl
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 net
drwxrwxr-x 3 1003 1003 4096 Jan 20 2012 onenand_bl1
drwxrwxr-x 3 1003 1003 4096 Jan 20 2012 onenand_ipl
drwxrwxr-x 6 1003 1003 4096 Sep 27 10:27 post
-rw-rw-r-- 1 1003 1003 135993 Jan 20 2012 README
-rw-rw-r-- 1 1003 1003 1256 Jan 20 2012 rules.mk
drwxrwxr-x 2 1003 1003 4096 Aug 2 2013 sd_fusing
-rw-r--r-- 1 root root 33436 Sep 26 20:30 System.map
drwxrwxr-x 9 1003 1003 4096 Sep 27 10:27 tools
-rwxr-xr-x 1 root root 979676 Sep 26 20:30 u-boot
-rwxr-xr-x 1 root root 393216 Sep 26 20:30 u-boot.bin
-rw-r--r-- 1 root root 1819045 Sep 26 20:30 u-boot.dis
-rw-r--r-- 1 root root 186204 Sep 26 20:30 u-boot.map
-rwxr-xr-x 1 root root 1179746 Sep 26 20:30 u-boot.srec
[email protected]:/usr/local/arm/uboot/jiuding/uboot#
這個問題很困惑,像是c語言寫的代碼大多是從main函數去分析,但是uboot的代碼并不全是c來寫的,底層的啟動代碼使用彙編來寫的(其實你寫的單片機代也有啟動檔案,隻不過關于啟動的那部分代碼,廠商已經都寫好了,像是STM32的單片機,在開發環境中,可以明顯的看到有xxxstart.S)。因為有彙編階段參與,是以不能直接找main。整個程式的入口取決于連結腳本中ENTRY聲明的地方。ENTRY(_start)是以_start符号所在的檔案就是整個程式的起始檔案,_start所在處的代碼就是整個程式的起始代碼。uboot的連結檔案,在uboot目錄下的board/samsung/x210/目錄下。
[email protected]:/usr/local/arm/uboot/jiuding/uboot/board/samsung/x210# ls -al
total 72
drwxrwxr-x 2 1003 1003 4096 Sep 27 10:27 .
drwxrwxr-x 4 1003 1003 4096 Sep 26 2012 ..
-rw-r--r-- 1 root root 23 Sep 26 20:29 config.mk
-rw-rw-r-- 1 1003 1003 13083 Jan 20 2012 flash.c
-rw-rw-r-- 1 1003 1003 442 Jan 16 2013 .gitignore
-rw-rw-r-- 1 1003 1003 16470 Jul 19 2013 lowlevel_init.S
-rw-rw-r-- 1 1003 1003 1343 Sep 26 2012 Makefile
-rw-rw-r-- 1 1003 1003 121 Jan 20 2012 smdkc110_val.h
-rw-rw-r-- 1 1003 1003 1811 Sep 26 2012 u-boot.lds
-rw-rw-r-- 1 1003 1003 6037 Jul 19 2013 x210.c
[email protected]:/usr/local/arm/uboot/jiuding/uboot/board/samsung/x210#
打開u-boot.lds,可以看出檔案中明确指出了入口位址: ENTRY(_start)。關于u-boot.lds可以看這個部落格:https://blog.csdn.net/amwha/article/details/86636910
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
25 /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
26 OUTPUT_ARCH(arm)
27 ENTRY(_start)
之後在SI中可以搜尋這個_start 字元串,可以找出這個有效的檔案是在uboot/cpu/s5pc11x/ start.S檔案中,至此,就找到了uboot的代碼開始執行的地方,就是在start.S檔案中,當然也可以記着,直接去找start.S檔案。在start.S檔案的第56行就可以直接看到_start這符号。
.globl _start
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
這裡就找到了start.S檔案中的代碼開始執行的地方。之後我們就可以從這裡開始分析了>-< 。