该从哪里开始分析uboot?

此处分析的是九鼎科技的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文件中的代码开始执行的地方。之后我们就可以从这里开始分析了>-< 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值