4949|14

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

100分求助EBOOT中startup.s代码问题 [复制链接]

本来不好意思问这些代码问题。但是钻进了死胡同,看了差不多一天了也还是没有头绪;以前学得都比较顺畅,今天开始不停郁闷。
问题如下:

1、startup.s其中一个功能是把eboot的代码搬到RAM中运行,根据注释,我找到
startup.s中相应的代码:
;   Copy boot loader to memory

        ands    r9, pc, #0xFF000000     ; see if we are in flash or in ram--疑问:根据指令地址可以判断指令在RAM还是FLASH执行?        bne     %f20                    ; go ahead if we are already in ram

        ; This is the loop that perform copying.
        ldr     r0, = 0x38000           ; offset into the RAM
        add     r0, r0, #PHYBASE        ; add physical base
        mov     r1, r0                  ; (r1) copy destination
        ldr     r2, =0x0                ; (r2) flash started at physical address 0
        ldr     r3, =0x10000            ; counter (0x40000/4)
10      ldr     r4, [r2], #4
        str     r4, [r1], #4
        subs    r3, r3, #1
        bne     %b10

--------------------------------这里说拷贝eboot到RAM,我不理解,主要是我觉得和不符合RAM读写时序;这是都没有提到RAM读写时序啊,我真不明白它是怎么样实现拷贝eboot到RAM的功能的。麻烦前辈们指点一下。如果在广州工作的,请客吃饭也行,真的好气馁了。

最新回复

-------------------哦,想起来了,是这样子的。记起来了。  详情 回复 发表于 2008-9-1 08:32
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
10      ldr    r4, [r2], #4
        str    r4, [r1], #4
        subs    r3, r3, #1
        bne    %b10
这一段实现拷贝.就是把FLASH的0地址的内容拷到内存的#PHYABSE+0x38000地址.拷贝的大小counter (0x40000/4)
 
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
引用 1 楼 shuiii 的回复:
10      ldr    r4, [r2], #4
        str    r4, [r1], #4
        subs    r3, r3, #1
        bne    %b10
这一段实现拷贝.就是把FLASH的0地址的内容拷到内存的#PHYABSE+0x38000地址.拷贝的大小counter (0x40000/4)


--------PHYBASE         EQU     0x30000000      ; physical start
刚好和使用DNW下载EBOOT的地址0x30038000相吻合,这点我明白,谢谢shuiii 回答。
我不明白的地方是:按照RAM的数据手册,外部RAM读写时序是很严格的,这里都没有设计到这些。这就是我郁闷的地方。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
1. 根据指令地址可以判断指令在RAM还是FLASH执行?
eboot是设计在nor flash中运行的,而nor flash作为启动存储器一般是接在cpu的0地址,而sdram都会接在高位地址,比如2440 sdram只能接在bank 6/7 ,也就是0x30000000开始的地址,所以通过指令地址可以判断在RAM还是FLASH执行.
2. cpu有专用的sdram控制器,sdram的时序是由硬件实现的,不需要cpu做处理,cpu只要通过内部总线与sdram控制器沟通,具体时序由sdram控制器实现.
 
 
 

回复

41

帖子

0

TA的资源

禁止发言

5
 
引用 3 楼 Reallyu 的回复:
1. 根据指令地址可以判断指令在RAM还是FLASH执行?
eboot是设计在nor flash中运行的,而nor flash作为启动存储器一般是接在cpu的0地址,而sdram都会接在高位地址,比如2440 sdram只能接在bank 6/7 ,也就是0x30000000开始的地址,所以通过指令地址可以判断在RAM还是FLASH执行.
2. cpu有专用的sdram控制器,sdram的时序是由硬件实现的,不需要cpu做处理,cpu只要通过内部总线与sdram控制器沟通,具体时序由sdram控制器实现.


------------------------太棒了,谢谢你!这个和单片机的总线访问是类似的。2410帮我们完成了这么复杂的时序,我们减少了不少工作哦。我对ARM的结构太不了解了。闹出了不少笑话,再次谢谢Reallyu
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
mark学习
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
3楼说的有道理
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
[code]; Restart from the RAM position after copying.
        mov pc, r0            ;r0= 0x38000+#PHYBASE=0X30038000修改了PC相当于改变了存储指令地址,实现跳转
        nop                   ;疑惑:既然已经跳转到内存中执行,但是为什么后面还会执行到20 标号下的东西呢
        nop                    ;难道在内存中的函数使ARM再回来执行这个startup.s这个函数?

但是在前面有一句


///////////////////原来的代码如下
;------------------------------------------------------------------------------
;   Copy boot loader to memory

        ands    r9, pc, #0xFF000000     ; see if we are in flash or in ram
        bne     %f20                    ; go ahead if we are already in ram

        ; This is the loop that perform copying.
        ldr     r0, = 0x38000           ; offset into the RAM
        add     r0, r0, #PHYBASE        ; add physical base
        mov     r1, r0                  ; (r1) copy destination
        ldr     r2, =0x0                ; (r2) flash started at physical address 0
        ldr     r3, =0x10000            ; counter (0x40000/4)
10      ldr     r4, [r2], #4
        str     r4, [r1], #4
        subs    r3, r3, #1
        bne     %b10

        ; Restart from the RAM position after copying.
        mov pc, r0            ;r0= 0x38000+#PHYBASE=0X30038000修改了PC相当于改变了存储指令地址,实现跳转
        nop                   ;疑惑:既然已经跳转到内存中执行,但是为什么后面还会执行到20 标号下的东西呢
        nop                                                                                ;难道在内存中的函数使ARM再回来执行这个startup.s这个函数?但是就算回来,但是
        nop                                                                                ;感觉也没有这个必要啊
----------------------------下面两句说明了在执行内存中的代码的时候有执行了startup.s这个汇编代码
ands    r9, pc, #0xFF000000     ; see if we are in flash or in ram
        bne     %f20                    ; go ahead if we are already in ram

---------怎么会这样呢?麻烦指教一下。也许是我钻进了死胡同
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
调试的时候,EBOOT可能被开发人员手工放在内存中执行。与Eboot启动后,把自己从Flash拷贝到内存当中不想同
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 freasy 的回复:
调试的时候,EBOOT可能被开发人员手工放在内存中执行。与Eboot启动后,把自己从Flash拷贝到内存当中不想同

-----------谢谢,可是对于您的回答我还是不能完全理解。
因为如果没有手工放eboot到内存的话,就意味着不会调用main函数了。所以我很困惑。
没有main函数那bootloader根本完不成任务了。

VirtualStart

        mov     sp, #0x8C000000
        add     sp, sp, #0x30000        ; arbitrary initial super-page stack pointer
        b       main

        ENTRY_END

        LTORG
拷贝内存是在
b main之前进行的。
也许我的那种牵强解释是可行的
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
你的看法没错
ldr    r0, = 0x38000          ; offset into the RAM
add    r0, r0, #PHYBASE        ; add physical base

拷贝之前,这里先把拷贝后的目标地址先保存在r0里面,也就是说R0保存的是拷贝到内存之后的EBOOT首地址
拷贝完成之后
  ; Restart from the RAM position after copying.
        mov pc, r0   

这就跳转到内存当中的EBOOT入口再进来。
这样它的代码写起来简单一点。
当然,不同的EBOOT启动代码写法也不一样,这个还是要看程序员的心情^_^
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 freasy 的回复:
你的看法没错
ldr    r0, = 0x38000          ; offset into the RAM
add    r0, r0, #PHYBASE        ; add physical base
拷贝之前,这里先把拷贝后的目标地址先保存在r0里面,也就是说R0保存的是拷贝到内存之后的EBOOT首地址
拷贝完成之后
  ; Restart from the RAM position after copying.
        mov pc, r0  
这就跳转到内存当中的EBOOT入口再进来。
这样它的代码写起来简单一点。
当然,不同的EBOOT启…


-----------------感觉是这样,谢谢前辈的回复。
-----------------在这里我想问个更加弱智的问题就是为什么eboot启动2410/2440等ARM一上电就会执行startup.s这个汇编代码?这是由什么决定的?还是在哪里可以设置的?在哪里设置的?据我所知如果从Nandflash启动,一上电,ARM自动拷贝Nandflash前4K代码到内部SDRAM执行的。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
Nandflash前4K放的一个叫stelpldr的东西,它会把eboot加载到RAM里执行
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
startup.s里有一个entry指示编译器把那里放最前面,使得CPU上电后能够直接执行到EBoot中的startup.s里面的那句话(这是对于NorFlash),或者是被Nand Flash跳转到(使用Nand Flash)
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 freasy 的回复:
startup.s里有一个entry指示编译器把那里放最前面,使得CPU上电后能够直接执行到EBoot中的startup.s里面的那句话(这是对于NorFlash),或者是被Nand Flash跳转到(使用Nand Flash)


-------------------哦,想起来了,是这样子的。记起来了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表