之前做了一个关于TI德州仪器AM3505 zcn的项目,我们的板子是参照德仪的LOGIC板子来的。德仪的ARM启动流程大概分为三级启动:SRAM内部启动代码(固化在A8内部的)---》x-Loader---》Uboot,接下来就是引导系统了,我也是刚刚接触这个方面的东西的,把我看X-Loader的一些经验写下来,供大家参考。
分析X-loader的时候,大家可能会有点没有头绪,刚接触,可能连入口函数都会找不到,我刚开始就是这样子的,不要紧。X-loader的大部分代码是汇编代码,可能不懂汇编的同学最好预先补充一下汇编的知识,其实,准备一个PDF的汇编指令大全就ok了,不懂再去百度。
在茫茫多的代码中,我们想知道最终执行的时候是从哪里开始执行的,我们可以首先看编译的连接文件:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/omap3/start.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
这里面定义了编译输出文件的架构
OUTPUT_ARCH(arm
),和编译的入口函数
ENTRY(_start),其他的我这里暂时不讨论。这样我们就得到了入口函数了:
_start
.globl _start
_start:
b reset
ldr pc, _hang
ldr pc, _hang
ldr pc, _hang
ldr pc, _hang
ldr pc, _hang
ldr pc, _hang
ldr pc, _hang
接下来你可以用代码查看工具加载X-loader工程,我用的是source insight,全局搜索一下_start你就可以在Start.S这个