u-boot代码分析--第一节

Posted weirdo-xo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了u-boot代码分析--第一节相关的知识,希望对你有一定的参考价值。

u-boot代码分析--第一节

编者:weirdo

时间:2020-5-12

QQ:2651293248

标题:u-boot代码分析第一节


1. u-boot.lds文件 ??

	这里指的是顶层目录下面的u-boot.lds,这里需要注意的是这个文件是根据arch/arm/cpu/armvx/对应的u-boot.lds模板生成的,在不严格的情况下可以使用arch/arm/cpu/armvx/下的u-boot.lds作为u-boot链接的参考文件,但是如果需要准确的u-boot.lds文件的话还是需要参考顶层目录下的u-boot.lds文件。

2. u-boot.map文件 ??

	这个文件是一个地址映射的文件,在这个文件中详细的定义了在u-boot编译后各个段映射的地址以及代码链接的起始地址。在这个文件的前半部分是定义每一个build-in.o中的段的一个虚拟地址,在经过链接器链接代码后,生成了后半部分的那个真实的链接地址信息,特别需要注意的是这里的u-boot.map是在编译后才动态产生的。每一次重新编译后都会重新的生成这个文件。

3. _start标号 ??

	以前分析的u-boot代码中,中断向量表定义在arch/arm/cpu/armvx/start.S文件中,所以一直也就直接使用这个文件进行分析,但是在新的版本的u-boot中把这个中断向量表定义在了:arch/arm/lib/vectors.S中,这里也是和u-boot.lds的第一段链接的代码相互契合,所以下一次分析u-boot代码时还是从对应版本的u-boot.lds中开始分析,通过第一段链接代码确定代码运行起始点。
	
	可以使用如下的命令来查找某个不清楚的标号
  		grep -nR "label"
  		
  注意如果比较确定代码的大概位置的话应该在大概代码所在目录下进行搜索,减小搜索的时间消耗,如果是在不确定代码的位置,那就只有在u-boot的全局搜索。

u-boot-2012-10z中读_start.S的定义: arch/arm/cpu/arm920t/start.S

.globl _start
_start:	b	start_code
	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

第一段链接代码:

 .text :
 {
  __image_copy_start = .;
  arch/arm/cpu/armv7/start.o (.text)
  *(.text)
 }

? 可以看到这里的u-boot.lds中第一段链接代码就是在指定文件中,链接脚本和对应的代码相互契合。

u-boot-2017-x版本的_start标号:arch/arm/lib/vectors.S

	.section ".vectors", "ax"
_start:

#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
	.word	CONFIG_SYS_DV_NOR_BOOT_CFG
#endif

	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

第一段链接代码:

.text :
 {
  *(.__image_copy_start)
  *(.vectors)
  arch/arm/cpu/armv7/start.o (.text*)
  *(.text*)
 }

? 可以看到这里没有指定第一段代码在那个目录下的那个文件,但是这里却在第一段代码中制定了代码需要编译到那个段中,可以看到vectors.S中的代码真是链接到了链接脚本中指定的(.vectors)段中。

4. 第一段代码的小分析 ??

? 在第一段代码中,定义的是一个中断向量表,在CPU上电复位的时候,开始执行这里的第一行代码,也就是跳转到reset 标号的位置,剩下的代码会在对应的中断发生时跳转到这里,再次执行跳转(可以看到更改了PC)到对应的具体中断处理函数。还有需要注意的是,这里的中断向量表会在CPU启动后加载到内存的高地址存放,防止某些代码错误的更改这里的跳转表---中断向量表。

? 有了这里的知识后,就知道了需要跳转到start.S文件中进行下一步的代码分析。

5. 总结 ??

1. u-boot.lds:详细的定义了代码链接的过程,其中有一些导出变量---链接地址

2. u-boot.map:代码链接是的地址映射文件,在这个文件中可以查找所有链接代码的地址信息

3. grep 命令:由于u-boot代码非常庞大(其实还行),当有一些未知标号的时使用该命令查找
	grep -nR ‘label‘
	
4. _start:这是代码入口点---第一行执行的代码,由于u-boot版本的不同,入口点所在的文件有所区别,这里可以使用u-boot.lds进行分析第一段链接代码。

以上是关于u-boot代码分析--第一节的主要内容,如果未能解决你的问题,请参考以下文章

图解U-Boot:第一阶段源码分析

u-boot-2014-07 代码流程分析

u-boot.2012.10——mini2440(启动流程分析)

Linux嵌入式驱动学习之路⑤u-boot启动流程分析

U-BOOT-2016.07移植 (第一篇) 初步分析

10th.U-boot——代码结构分析