• 第二季-专题9--代码搬移不可少


    专题9--代码搬移不可少

    1. ARM启动流程回顾

    假设都是从nand flash启动的

    2440:从nand flash启动需要垫脚石(SRAM)的作用,垫脚石只有4kb。u-boot的大小一般就有100kb左右,垫脚石先将nand flash中的4kb内容拷贝其中,之火垫脚石将多余的内存拷贝到内存中。

    6410:它一上电就会在SROM中运行bootloader0,将nand flash中的8kb拷贝到内存(SRAM)中,利用这8kb的内存将剩余的内存全部拷贝。

    210;它本身也有烧写好的bootloader0(在SROM中),拷入垫脚石之后,先将nand flash中的内容拷贝到IRAM中(96kb),当96kb大小不够时,再将所有的内容拷贝到内存中。

    2440、6410和210的垫脚石都不能满足bootloader的大小,需要代码的搬移。

    1. 代码搬移编程

    (1)起点:SRAM(0地址处开始),也就是垫脚石。

    我们自己编写的bootloader大小不到4KB,在第一步会全部搬移进入SRAM垫脚石之中。实际上这样可以直接就在垫脚石中运行,但是为了显示过程,我们还是将它放在内存中运行。

    垫脚石的起始地址在不同开发板之间是不同的。

    2440:0x0000000

    6410:0x0C000000

    210:0xD0020000

    (2)终点

    连接地址:

    在我们使用链接器脚本的时候,我们会在开头(以2440为例)加上. = 0x30000000,使用反汇编指令,我们会开到在_start之前就显示这个地址。当程序执行到这一步的时候,就会将这个值传给PC指针。

    绝对跳转:

             直接修改PC指针这种跳转。

    相对跳转:

             b和bl用的就是间接跳转,不是讲跳转的地址直接赋值给pc指针,而是将跳转之间的差值加给pc指针。

    (3)程序:

    reset:

             bl set_svc

             bl disable_watchdog

             bl disable_interrupt

             bl disable_mmu

             bl init_clock

             bl init_sdram

             bl copy_to_ram

             bl light_led

    copy_to_ram:

             ldr r0, =0x0   @起点

             ldr r1, =0x30008000    @终点

             add r3, r0, #1024*4   @假设复制4Kb的内容

    copy_loop:               @循环语句

             ldr r2, [r0], #4    @读出来

             str r2, [r1], #4    @写进去

             cmp r0, r3       @对比

             bne copy_loop    @没完成复制的话重新循环

             mov pc, lr

  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/free-1122/p/11452037.html
Copyright © 2020-2023  润新知