天天看點

該從哪裡開始分析uboot?

此處分析的是九鼎科技的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檔案中的代碼開始執行的地方。之後我們就可以從這裡開始分析了>-< 。