此处分析的是九鼎科技的x210开发板的使用的uboot。
首先要明确一点,uboot该从哪里开始分析?uboot有这么多文件,不知如何下手哇!
/*uboot的文件*/
root@ubuntu:/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
root@ubuntu:/usr/local/arm/uboot/jiuding/uboot#
这个问题很困惑,像是c语言写的代码大多是从main函数去分析,但是uboot的代码并不全是c来写的,底层的启动代码使用汇编来写的(其实你写的单片机代也有启动文件,只不过关于启动的那部分代码,厂商已经都写好了,像是STM32的单片机,在开发环境中,可以明显的看到有xxxstart.S)。因为有汇编阶段参与,因此不能直接找main。整个程序的入口取决于链接脚本中ENTRY声明的地方。ENTRY(_start)因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。uboot的链接文件,在uboot目录下的board/samsung/x210/目录下。
root@ubuntu:/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
root@ubuntu:/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文件中的代码开始执行的地方。之后我们就可以从这里开始分析了>-< 。