zoukankan      html  css  js  c++  java
  • 代码从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

  • 相关阅读:
    eclipse下对中文乱码问题的一些思考
    项目已经部署,tomcat已经启动,网址也没问题,却出现404错误
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    java.lang.ClassCastException: $Proxy0 cannot be cast to javax.servlet.ServletRequestWrapper
    java 线程之-volatile
    带备注的 config
    带备注的 头文件加载文件
    带个人备注的,模板->编译文件->缓存文件
    错过一个订单后,吐槽下自己(顺便分享下书单),剧终版
    错过一个订单后,吐槽下自己(顺便分享下书单),欢迎交流
  • 原文地址:https://www.cnblogs.com/defen/p/4755805.html
Copyright © 2011-2022 走看看