打印
[ZLG-ARM]

关于初始化C运行环境的

[复制链接]
2273|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaowang|  楼主 | 2007-9-14 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ads高手好:easyarm2210里有个关于启动C语言运行的启动文件,有点迷惑!
         IMPORT    |Image$$RO$$Limit|  
          IMPORT    |Image$$RW$$Base|   
          IMPORT    |Image$$ZI$$Base|   
         IMPORT    |Image$$ZI$$Limit|  

        IMPORT    Main         ; 声明C程序中的Main()函数
        
        

AREA    Start,CODE,READONLY    ; 声明代码段Start
        ENTRY             ; 标识程序入口
        CODE32            ; 声明32位ARM指令    
            
Reset    LDR    SP,=0x40003F00       

             ; 初始化C程序的运行环境
        LDR        R0,=|Image$$RO$$Limit|   
        LDR        R1,=|Image$$RW$$Base|      
        LDR        R3,=|Image$$ZI$$Base|      
            
        CMP    R0,R1
        BEQ    LOOP1
LOOP0    CMP    R1,R3      
        LDRCC   R2,[R0],#4             
         STRCC   R2,[R1],#4                 
         BCC     LOOP0
        
LOOP1    LDR        R1,=|Image$$ZI$$Limit| 
        MOV        R2,#0
        
LOOP2    CMP     R3,R1
        STRCC   R2,[R3],#4
        BCC        LOOP2
        
        B        Main    ; 跳转到C程序代码Main()函数
        
        END
上面声明的四个变量的值在哪里能看到啊,还有从比较R0,R1到下面的一段程序是实现什么功能? 初始化C语言运行环境还需要什么配置吗?先谢谢

相关帖子

沙发
ruraliter| | 2007-9-14 16:13 | 只看该作者

我的解释

这4个变量,是编译器定义的
可以通过描述文件来定义其值
IMPORT    |Image$$RO$$Limit|  
IMPORT    |Image$$RW$$Base|   
IMPORT    |Image$$ZI$$Base|   
IMPORT    |Image$$ZI$$Limit|  

编译完成之后,连接器会生成三个基本的段,分别是RO,RW,ZI。其中RO,RW会在image中顺序存储.但是,RW,ZI在运行开始时并不位于指定的RW位置,因此必须初始化

r0放的是代码底部的地址,也就是RW在image的起始地址
r1是要拷贝的地址,也就是真正的RW的地址

比较r0和r1,就是判断这两个地址是否一致,如果一致说明已经拷贝好了(由其他的逻辑完成)

使用特权

评论回复
板凳
gaowang|  楼主 | 2007-9-14 21:04 | 只看该作者

还有疑问

谢谢ruraliter的热心解答,但是我还是不太懂;我单步运行的时候,上面R0,R1,R3的值都是预先设置好的,如果在内部Ram中运行的话,值分别是
 R0=0x400000080
 R1=0x400003000
 R3=0x400003000
  也就是说他们的偏移量是固定的,如果固定的话,那C语言程序很大的话,不是造成占用RW的地址了吗?那RW的数据就会错误啊!不太懂,还望指点一下.
另外ZI段在程序中起什么作用啊?

使用特权

评论回复
地板
gaowang|  楼主 | 2007-9-14 21:25 | 只看该作者

了解一点

对不起,刚才查了一下,了解了很多.
  ZI是未初始化的全局变量(对于GNU工具,对应的概念是 TEXT,DATA和BSS)。Bootloader要将RW段复制到RAM中,并将ZI段清零。

但是对具体是怎么工作的,还望继续指教.

使用特权

评论回复
5
gaowang|  楼主 | 2007-9-15 09:11 | 只看该作者

继续询问

又看了看书,又理解了一点,原来编译器还有   
 |Image$$RO$$Base|         
 |Image$$RW$$Limit|
  这些值有些是在编译器器里你自己设置好的,R0段拷贝的是代码,RW拷贝的是可读写的变量,ZI拷贝的是未初始化的全局变量,在初始化C环境里ZI是要清零的,所以按顺序放的是R0,RW,ZI,所以LOOP1和LOOP2是在RW紧接着R0的条件下给ZI段清零.
  但是有点不明白,假设第一次比较R1和R3的时候,R1<R3,下面的代码起什么作用,也就是LOOP0的功能是什么?  
  希望有人能够解答,非常感谢

使用特权

评论回复
6
gaowang|  楼主 | 2007-9-16 20:12 | 只看该作者

自己顶下

使用特权

评论回复
7
pluto1113| | 2010-4-19 15:41 | 只看该作者
http://kellycan.blogbus.com/logs/10962408.html
看看这个吧,你会学到不少东西的。

使用特权

评论回复
8
午夜粪车| | 2010-4-19 21:00 | 只看该作者
楼上的博客?不错啊

使用特权

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

本版积分规则

13

主题

32

帖子

0

粉丝