TQ210学习笔记——uboot代码搬移

来源:互联网 发布:淘宝上女装好做吗 编辑:程序博客网 时间:2024/05/29 05:02

学习资料:TQ210开发板+国嵌教学视频

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

代码搬移:指的是启动过程中,将剩下的启动代码搬移到内存里面(对于210来说,bootloader代码大于96KB时,肯定要将BL2搬移到内存,因为210启动过程规定,BL2不能大于80KB)

本文讲的是从SRAM搬移到内存中,不是nandflash搬移到内存。原因如下:

(1)若要从nandflash搬移到内存,必须先对nandflash初始化,这部分还没学到,故暂时无法从nandflash搬移到内存

(2)只有当bootloader大于一定值时,BL1才会将BL2nandflash搬移到内存,我们现在写的uboot远小于4kb,故暂时不需要从nandflash搬移到内存,可以直接在SRAM中运行。之所以将从SRAM搬移到内存,只是是为了学习搬移方法。更规范的应该是从nandflash搬移到内存。

如何进行代码搬移?

搞清楚起点、终点、搬移方式

一、210搬移起点:

210SRAM就是IRAM,起始地址是0xd0020000。如下图


就是IRAM地址了,为什么是它?因为210启动时候,IROM内固化的程序(BL0)会将BL1自动拷贝到BL1内,也就是拷贝到96KB空间的IRAM中,IRAM就相当于2440和6410中的steppingstone了,只不过210没有这一说法罢了。看下图。



二、搬移终点:

1、连接器脚本文件中的链接地址的作用,下面介绍两个作用

1)在C语言编程中,若中途调用了摸个函数,如调用reset()函数,则PC指针就会被赋予reset的链接地址。属于绝对跳转

2)在汇编时,若用到伪指令ldr跳转到reset函数处ldr pc, =reset,则PC也会被赋予reset的链接地址。属于绝对跳转

2、关于相对跳转和绝对跳转。

(1)相对跳转  b跳转是相对跳转

跳转后,PC=当前PC+欲跳转标号跟当前PC在相对地址表中的差值(也就是链接地址的差值,这部分描述可能有问题,反正是这个意思)如下图(uboot代码)



Start是程序入口,连接器脚本中设置的地址是0x20000000。第一条语句是b reset,跳转到reset执行。整个程序编译链接后生成elf格式文件,用arm-linux-objdump反汇编,查看反汇编得到的文件,可以看到第一条语句地址(也就是bl reset这句)是0x20000000


 

reset标号所在地址(也就是跳转的目的地)是0x2000005c,如下图



如果执行的是相对跳转的话(b指令正是相对跳转),执行这条指令后,PC=当前PC+0x2000005c-0x20000000)。芯片上电后,PC值必为0故当前PC就是0。所以,执行完该语句后,PC=0+0x2000005c-0x20000000)。

(2)绝对跳转

上面1中的两个例子都是绝对跳转,执行完绝对跳转后,PC指针值就会变成链接地址了。即若果通过绝对跳转去执行reset,则执行完跳转指令后,PC=0x2000005c(跳到内存里去了)

链接起始地址,决定着程序第一行代码在内存中的位置即程序在内存的起始地址。搬移的时候,要参考链接起始地址,将代码搬移到内存中相应的位置。

链接起始地址就是代码搬移的终点。视频教程是这么讲的,但是不是特别理解,这部分后续琢磨,知道的朋友麻烦介绍下,或者给个链接我自己看。下面贴上代码搬移程序。

@专题9 代码搬移copy_to_ram:ldr r0, =0xd0020000@搬移起点ldr r1, =0x20000000@搬移终点add r3, r0, #(1024*4)@r3=起点+复制的数据量(4KB)copy_loop:ldr r2, [r0], #4@开始读数据,因为一次32位,所以读完后地址要后移4个字节str r2, [r1], #4@将读出的数据拷贝到内存中,同样一次拷贝32位,拷贝完后内存地址后移4字节cmp r0, r3@判断有没搬移完4KB数据bne copy_loopmov pc, lr@回到调用点


1 0