TQ210学习笔记——uboot代码搬移
来源:互联网 发布:淘宝上女装好做吗 编辑:程序博客网 时间:2024/05/29 05:02
学习资料:TQ210开发板+国嵌教学视频
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
代码搬移:指的是启动过程中,将剩下的启动代码搬移到内存里面(对于210来说,bootloader代码大于96KB时,肯定要将BL2搬移到内存,因为210启动过程规定,BL2不能大于80KB)
本文讲的是从SRAM搬移到内存中,不是nandflash搬移到内存。原因如下:
(1)若要从nandflash搬移到内存,必须先对nandflash初始化,这部分还没学到,故暂时无法从nandflash搬移到内存
(2)只有当bootloader大于一定值时,BL1才会将BL2从nandflash搬移到内存,我们现在写的uboot远小于4kb,故暂时不需要从nandflash搬移到内存,可以直接在SRAM中运行。之所以将从SRAM搬移到内存,只是是为了学习搬移方法。更规范的应该是从nandflash搬移到内存。
如何进行代码搬移?
搞清楚起点、终点、搬移方式
一、210搬移起点:
210的SRAM就是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@回到调用点
- TQ210学习笔记——uboot代码搬移
- 嵌入式学习笔记3—代码搬移
- 嵌入式学习-uboot-lesson8-代码搬移
- S5PV210(TQ210)学习笔记——系统时钟和串口
- S5PV210(TQ210)学习笔记——内存配置(DDR2)
- S5PV210(TQ210)学习笔记——Nand配置
- S5PV210(TQ210)学习笔记——按键驱动程序
- S5PV210(TQ210)学习笔记——输入子系统驱动
- S5PV210(TQ210)学习笔记——LCD驱动编写
- S5PV210(TQ210)学习笔记——触摸屏驱动编写
- S5PV210(TQ210)学习笔记——USB HOST移植
- S5PV210(TQ210)学习笔记——Nand flash驱动编写
- S5PV210(TQ210)学习笔记——Nand驱动之HWECC
- S5PV210(TQ210)学习笔记——内存配置(DDR2)
- S5PV210(TQ210)学习笔记——USB HOST移植
- S5PV210(TQ210)学习笔记——LCD驱动编写
- S5PV210(TQ210)学习笔记——触摸屏驱动编写
- S5PV210(TQ210)学习笔记——按键驱动程序
- 第五届山东省ACM angry_birds_again_and_again(积分)
- android NDK开发编译C++文件出现Type 'jint' could not be resolved和Unresolved inclusion: <jni.h>的解决办法
- openGL 填充样式
- 面试之路(31)-操作系统之信号量
- 先来先服务和短作业优先算法
- TQ210学习笔记——uboot代码搬移
- Android内存泄漏
- dynamic proxy
- Oracle EBS OM Transaction
- shell脚本--语法
- C++-作业五
- Porter Algorithm ---------词干提取算法
- iOS开发 - 第02篇 - UI进阶 - 02 - TableView
- yii2下拉框带搜索功能