代码从stepping stone搬移到内存
为什么要搬移代码?
如何搬移代码?
arm启动流程回顾:
2440:这里我们分析的是从nand flash 启动。2440的启动主要依赖于一个部件(SRAM),又名stepping stone.它的地址为0x0,nand flash是不能参与地址编址的,所以它是在内存以外的,当处理器上电以后,2440会自动地从nand flash 的最前端拷贝4k到stepping stone中。pc指针就会指向0x0这个地址。这里要特别注意4kb这个参数。比较大的u-boot,4k是完全不够的,所以我们把主要的硬件软件的初始化放在这4k中,剩余的则利用这4k的程序自动拷贝内存当中。这部分代码就会在内存中运行。
-----------------------------------------------------------
6410:上电之后,6410会去运行bootloader0(SROM),bootloader0会从nand flash 中拷贝8k到SRAM(stepping stone)中。这8k同样满足不了。我们需将剩下的bootloader拷贝到内存中运行。代码的拷贝工作同样需要在前8k中的代码来完成。
----------------------------------------------------
210:类似于6410
----------------------------------------------------
代码搬移主要三个地方:起点,终点,搬移方式。
我们这里的启点事stepping stone(SRAM)
2440的SRAM起始地址为0x0
6410的SRAM起始地址为S3C6410手册p116页stepping stone:0x0c000000
210:0xd0020000
讲终点之前我们需要理解什么是链接地址(如链接脚本里面的链接起始地址):arm-linux-objdump -D -s gboot.elf > dump
vim dump
reset 前面的地址就是链接地址。pc<=0x30008058
还有一个就是我们可以在汇编代码中直接修改ldr pc,=reset.(这是一个内存地址,而不是SRAM地址,那是不是意味着开发板一上电就跳转到内存中了。为解释这个问题,我们引入了相对跳转和绝对跳转。)
-------------------------------------------------
相对跳转:如b指令,相对跳转不是把连接地址直接赋值给pc,而是
跳转之前的地址+跳转之后地址的差值。
如start的地址是0x30000000,reset的地址为0x30000058,stepping stone的地址为0x0,所以跳转之后的真实地址为0x00000058(pc).
绝对跳转:例如函数调用,直接修改pc指针.
--------------------------------------------------
然后将连接的起始地址作为终点:0x50008000
---------------------------------------------------
搬移:
vi start.S
bl copy_to_ram
bl light_led
copy_to_ram:
ldr r0,=0x0c000000
ldr r1,=0x50008000
add r3,r0,#1024*4 //r0复制4k到r3
copy_loop:
ldr r2,[r0],#4 //读取四字节数据到r2
str r2,[r1],#4 //写入4字节数据到r1
cmp r0,r3 //判断r0的位置是否=r3,如果不等说明没有拷贝完。
bne copy_loop
mov pc,lr
代码从stepping stone搬移到内存的更多相关文章
- 重构改善既有代码设计--重构手法11:Move Field (搬移字段)
你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段. 动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...
- 重构改善既有代码设计--重构手法10:Move Method (搬移函数)
你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或被后者调用.在该函数最常用引用的类中建立一个有着类似行为的新函数.将旧函数编程一个单纯的委托函数,或是将旧函数完全移除. 动机: ...
- uboot搬移部分和重定位部分的代码分析
来看一下搬移部分和重定位部分的代码: relocate: /* 把U-BOOT重新定位到RAM*/ //r0=0; adr r0, _start /* r0是代码的当前位置*/ ld ...
- svn搬移到gitlab及使用
svn是一款非常简便,易用的源代码管理工具,用了这么多年,对它情有独钟.都说习惯最难改,那为何要搬移到gitlab上呢? 喜欢尝试新东西,前提还是git比较强大,svn有的它都有,svn没有的它也有. ...
- 重构第2天:方法搬移(Move Method)
现在就重构来说是非常普通的,虽然我们经常会漏掉或忽略一些需要重构的地方.方法搬移,正如所定义的那样,把方法搬移到更适合他的位置.让我们看看下面这一段重构前的代码: 理解:方法搬移,正如所定义的那样,把 ...
- poj3580 伸展树(区间翻转 区间搬移 删除结点 加入结点 成段更新)
好题.我做了很久,学了大牛们的区间搬移.主要的代码都有注释. #include<cstdio> #include<cstring> #include<iostream&g ...
- 【Java重构系列】重构31式之搬移方法
重构第二式:搬移方法 (Refactoring 2: Move Method) 毋容置疑,搬移方法(Move Method)应该是最常用的重构手段之一,正因为太常用而且较为简单,以至于很多人并不认为它 ...
- Part9---代码搬移不可少
1.回顾ARM启动流程就可知道需要执行代码搬移 2.代码搬移 1)起点:NAND FLASH,今天的起点是SRAM垫脚石.为什么?因为我们要从nandflash取搬移数据需要先对其进行初始化,二而我们 ...
- 嵌入式开发之8127---DM8127如何利用EDMA搬移数据
--------------qq:1327706646 ---------------------author:midu -------------------------------datetime ...
随机推荐
- linux下卸载apache方法小结
方法一 代码如下: 1. root@server ~]# rpm -qa|grep httpd httpd-2.2.3-11.el5_2.centos.4 httpd-manual-2.2.3-1 ...
- 【编程技巧】 iOS 5的StoryBoard(故事板)的一些用法
从StroyBoard得到一个View UIViewController *viewController = [[UIStoryboard storyboardWithName:@"Main ...
- PostgreSQL9.6.2的WINDOWS下安装
下载链接:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows 安装链接:http://www.cn ...
- struts异常:Caused by: Parent package is not defined: json-default - [unknown location]解决办法
问题描述: Unable to load configuration. - [unknown location] at com.opensymphony.xwork2.config.Configura ...
- 安利一个神器:Tmux
对于程序员来说,一个好用且高效的软件工具就如同加持了神技的游戏角色.下面就给大家介绍一个神器 Tmux 以及个人的使用总结. 一.我所认识的 Tmux 在工作中,我把 tmux 当作终端会话管理器来使 ...
- 解决 vmware workstations 14 开启虚拟机黑屏
某些朋友在使用vmware workstations 14创建或者开启虚拟机时发现黑屏,但其实系统的正常启动的,只是无画面显示. 1.以管理员方式启动命令行 2.修复LSP 在CMD中输入 netsh ...
- LinkedList 源码分析(JDK 1.8)
1.概述 LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构.和 ArrayList 一样,LinkedList 也支持空值和重复值.由于 LinkedList 基 ...
- sudo 无效命令
mac系统中由于不小心修改了/etc/sudoers下的权限为777,故而sudo命令不能使用. 解决办法 1.重新启动mac并且按command+s进入单用户界面 2.此时默认的系统状态是只读状态, ...
- 我看过得最易懂的一段AOP的解释
http://blog.csdn.net/zhangliangzi/article/details/51648032 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ...
- MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...