在i.mx6执行的第一条语句(代码第一条,可能并非CPU执行的第一条)之前,有1760个字节的头信息
其中前1024(0x400)个字节,开头4字节是0xB6 0x01 0x00 0xEA (反汇编后看到意思是 b 278006e0 <_start>),就是跳转到第1760个字节。
接下来的数据是IVT+DCD之类的数据。
调试过程:
1.复制可以运行的uboot.bin的开头1760个字节
2.自己写了个控制GPIO的汇编代码,编译并objcopy成2进制文件,编译的链接地址为0x0
3.合并两个数据,即把我写的代码放到1760地址处(0x6E0)。
4.用MFGtools把合成的bin烧写到TF卡启动
结果:代码被成功运行,GPIO接上一个LED,可以看到LED在闪烁。
我的Makefile:
arm-none-linux-gnueabi-gcc -c Start.S
arm-none-linux-gnueabi-ld -Ttext 0 -o boot.elf Start.o
arm-linux-objcopy --gap-fill=0xff -O binary boot.elf myboot.bin
cat 1.bin myboot.bin> u-boot.bin
这里的1.bin就是从uboot截取的头数据,我使用的链接地址是-Ttext 0
疑问:
1. b 278006e0 <_start>这条指令在最开始,它有没有被执行?
由于uboot的链接地址是0x27000000,所以截取的uboot的头信息的这条语句,是跳转到0x278006e0,但我编译的代码链接地址是0,所以这条指令应该不能跳转到我的代码
并且手册指出,芯片从SD启动的时候,开始地址应该是0x400,就是IVT head的地址,但就算如此,整个IVT使用的链接地址都是0x27000000(boot data的值也是相对于0x27000000),那么我的代码是如何被执行的?
|