打印

Computer00有空,进来看看,有问题请教

[复制链接]
1826|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ilovemysel|  楼主 | 2008-5-26 20:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ilovemysel|  楼主 | 2008-5-26 21:02 | 只看该作者

大大

比方说,我不用分散加载,
自己设置r0_base和rw_base地址,
我看网络上很多资料上有这么一段

LDR            r0, =|Image$$RO$$Limit|        ; Get pointer to ROM data 
    LDR            r1, =|Image$$RW$$Base|        ; and RAM copy 
    LDR            r3, =|Image$$ZI$$Base|         
        ;Zero init base => top of initialised data 
                         
    CMP            r0, r1                            ; Check that they are different 
    BEQ            %F1 

    CMP            r1, r3                            ; Copy init data 
    LDRCC   r2, [r0], #4            ;--> LDRCC r2, [r0] + ADD r0, r0, #4 
    STRCC   r2, [r1], #4                   ;--> STRCC r2, [r1] + ADD r1, r1, #4 
    BCC            %B0 

    LDR            r1, =|Image$$ZI$$Limit| ; Top of zero init segment 
    MOV            r2, #0 

    CMP            r3, r1                            ;Zero init 
    STRCC   r2, [r3], #4 
    BCC            %B2 

这里是将rw的内容移动到rw_base中,是不是?

使用特权

评论回复
板凳
computer00| | 2008-5-26 21:12 | 只看该作者

我也没研究过这个啊,没搞过什么分散加载。也不知道什么

使用特权

评论回复
地板
ilovemysel|  楼主 | 2008-5-26 21:13 | 只看该作者

恩?
恩。好的,谢谢。
不知道有谁知道,困惑了我一天了。

使用特权

评论回复
5
high| | 2008-5-27 12:23 | 只看该作者

偶觉得很多概念可以比对我们熟悉的模式

比如,我们的程序保存在硬盘,不考虑文件格式问题(pe结构),硬盘里关于这个程序区域就是加载域. 硬盘是无法xip(本地执行)的.需要加载到内存. 内存就是执行域了.

嵌入式的程序保存在flash, 如果不能本地执行的, 也是要从flash加载到ram执行 .nor flash在xip的时候ro段可以不要加载.

 rw段是表示数据段,里面是全局变量, zi里面是初始化值是0的全局变量.既然是变量, 不管这个段存在nand 还是 nor, 一定要加载到ram中. 所以启动代码把rw加载到内存中指定位置,哪里开始是rw段,这由rw_base指定,如果不指定的话,紧挨在ro段后面的就是rw. zi紧挨rw段.所以那一段代码就是把rw移动到ram,并且把zi段清零.

前面的都是连续加载的情况, 有时候,需要分散加载, 通过分散加载配置,可以指定个别段加载到特别指定的位置. 比如,一些bootloader, vivi, uboot这些, 当他们在nand flash启动的时候,可能需要分散加载. 把最基本的启动代码加载到0地址(arm从0地址执行), 剩下的加载到内存地址.

使用特权

评论回复
6
ilovemysel|  楼主 | 2008-5-27 17:27 | 只看该作者

回high斑竹

high斑竹,仔细看了你的回复,我还是有点不是很理解。

比方说,我有一个.c的文件,里面有A,B,C三个全局变量,那么在编译器编译完毕

后,生成的CODE和只读的数据应该是会自动放置在R0区(假设从0x0-0x3000 0000是

实际的flash区,0x4000 0000-0x41FFF FFFF是ram区),那么A,B,C三个全局变量

应该编译后会放置在ram区吧?

如果是这样,启动代码何必要搬移数据到RW_BASE(假设从0x4000 0000开始)?它

不是已经自动的在ram区了么?

如果不是这样,那么按书上说RO后RW后ZI,那么A,B,C三个全局变量可能被放置

在R0后,也就是说有可能是放在flash区? 然后启动代码才要把这些数据搬移到

实际的rw_base的地方去,是不是?

说的有点乱。。呵呵。。不知道哪里理解错了。。


使用特权

评论回复
7
high| | 2008-5-28 14:30 | 只看该作者

rw is not in ram after compiling

*rw* also locate at flash/disk after *ro* section, not ram.  you can open a *bin* file to check.

使用特权

评论回复
8
computer00| | 2008-5-29 10:17 | 只看该作者

RW段是有初始化值的全局变量,它有个初始化值的

在编译之后,这些初始化值还是被保存在ROM中,对应的应该就是加载域的RW段。
当程序要开始运行时,需要先将这些初始化值复制到RAM对应的地址去,而
  CMP            r1, r3                            ; Copy init data 
    LDRCC   r2, [r0], #4            ;--> LDRCC r2, [r0] + ADD r0, r0, #4 
    STRCC   r2, [r1], #4                   ;--> STRCC r2, [r1] + ADD r1, r1, #4 
    BCC            %B0 
这段代码就是干这活的,它将加载域中的RW段复制到了执行域中的RW段(位于RAM中)去。

而对于ZI段,则不需要复制数据,只需要将对应的RAM清0即可。而下面这段代码就是负责这个的。
   LDR            r1, =|Image$$ZI$$Limit| ; Top of zero init segment 
    MOV            r2, #0 

    CMP            r3, r1                            ;Zero init 
    STRCC   r2, [r3], #4 
    BCC            %B2 



在加载域中,RO、RW、ZI段都被放在ROM中。而在运行域中,RW、ZI段都要复制到RAM中,
至于RO段,则根据具体情况来看,如果不能在ROM中执行,则必须复制到RAM中去运行。
有时为了加快执行速度(例如中断处理程序等),也可将RO段部分或者全部复制到RAM中。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

17

帖子

0

粉丝