搜索
bottom↓
回复: 3

vivi里面的 ARM boot loader

[复制链接]

出0入0汤圆

发表于 2010-8-19 14:48:22 | 显示全部楼层 |阅读模式
vivi里面的 ARM boot loader 的一段代码,如下 jump to ram 是怎么保证的呢?
=on_the_ram 是开始的那个‘steppingstone’缓存区 还是 SDRAM 的地址? 请教大家,谢谢

  bl copy_myself

  @ jump to ram //here********************
  ldr r1, =on_the_ram
  add pc, r1, #0
  nop
  nop
1: b 1b @ infinite loop

on_the_ram:

  @ get read to call C functions
  ldr sp, DW_STACK_START @ setup stack pointer
  mov fp, #0 @ no previous frame, so fp=0
  mov a2, #0 @ set argv to NULL  

  bl main @ call main

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-8-19 23:58:16 | 显示全部楼层
on_the_ram:

  @ get read to call C functions
  ldr sp, DW_STACK_START @ setup stack pointer
  mov fp, #0 @ no previous frame, so fp=0
  mov a2, #0 @ set argv to NULL   

  bl main @ call main   
为什么上面的代码就在SDRAM中执行了呢?

出0入0汤圆

发表于 2010-8-20 11:04:11 | 显示全部楼层
看一下vivi.lds就明白了

出0入0汤圆

 楼主| 发表于 2010-8-20 14:19:09 | 显示全部楼层
我明白了


首先on_the_ram这个标号的地址是在编译链接时由链接器分配的可以查看VIVI.MAP 33f000ec 就是 on_the_ram在sdram中的地址。连接器首先把HEAD.这个文件链接到 0x33f00000处这是由vivi.lds这个链接脚本指定的。
另外这里的处理是要跳转到RAM中的一个很必要的步骤,因为在bl copy_myself后,vivi本身已经被复制到内存中,而在此之前,实际上运行的是被复制到2440内部的4KB SRAM中的代码(带来的限制就是在此之前的大小不能超过4KB)。add pc, r1, #0实际上是跳转到绝对地址on_the_ram,也即0x30000xxx处,此时vivi已在SDRAM中,经过此次跳转后就可以在SDRAM继续运行下去,也不再有之前的4KB限制了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 19:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表