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

[复制链接]
 楼主| ilovemysel 发表于 2008-5-26 20:59 | 显示全部楼层 |阅读模式
关于加载域和执行域,我想了1天没想明白,请指教下。。HOHO。。。
 楼主| ilovemysel 发表于 2008-5-26 21:02 | 显示全部楼层

大大

比方说,我不用分散加载,<br />自己设置r0_base和rw_base地址,<br />我看网络上很多资料上有这么一段<br /><br />LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=|Image$$RO$$Limit|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Get&nbsp;pointer&nbsp;to&nbsp;ROM&nbsp;data&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=|Image$$RW$$Base|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;and&nbsp;RAM&nbsp;copy&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;=|Image$$ZI$$Base|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Zero&nbsp;init&nbsp;base&nbsp;=&gt&nbsp;top&nbsp;of&nbsp;initialised&nbsp;data&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Check&nbsp;that&nbsp;they&nbsp;are&nbsp;different&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%F1&nbsp;<br />0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Copy&nbsp;init&nbsp;data&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDRCC&nbsp;&nbsp;&nbsp;r2,&nbsp;[r0],&nbsp;#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;--&gt&nbsp;LDRCC&nbsp;r2,&nbsp;[r0]&nbsp;+&nbsp;ADD&nbsp;r0,&nbsp;r0,&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STRCC&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1],&nbsp;#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;--&gt&nbsp;STRCC&nbsp;r2,&nbsp;[r1]&nbsp;+&nbsp;ADD&nbsp;r1,&nbsp;r1,&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;<br />1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=|Image$$ZI$$Limit|&nbsp;;&nbsp;Top&nbsp;of&nbsp;zero&nbsp;init&nbsp;segment&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0&nbsp;<br />2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Zero&nbsp;init&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STRCC&nbsp;&nbsp;&nbsp;r2,&nbsp;[r3],&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%B2&nbsp;<br /><br />这里是将rw的内容移动到rw_base中,是不是?
computer00 发表于 2008-5-26 21:12 | 显示全部楼层

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

  
 楼主| ilovemysel 发表于 2008-5-26 21:13 | 显示全部楼层

恩?<br />恩。好的,谢谢。<br />不知道有谁知道,困惑了我一天了。
high 发表于 2008-5-27 12:23 | 显示全部楼层

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

比如,我们的程序保存在硬盘,不考虑文件格式问题(pe结构),硬盘里关于这个程序区域就是加载域.&nbsp;硬盘是无法xip(本地执行)的.需要加载到内存.&nbsp;内存就是执行域了.<br /><br />嵌入式的程序保存在flash,&nbsp;如果不能本地执行的,&nbsp;也是要从flash加载到ram执行&nbsp;.nor&nbsp;flash在xip的时候ro段可以不要加载.<br /><br />&nbsp;rw段是表示数据段,里面是全局变量,&nbsp;zi里面是初始化值是0的全局变量.既然是变量,&nbsp;不管这个段存在nand&nbsp;还是&nbsp;nor,&nbsp;一定要加载到ram中.&nbsp;所以启动代码把rw加载到内存中指定位置,哪里开始是rw段,这由rw_base指定,如果不指定的话,紧挨在ro段后面的就是rw.&nbsp;zi紧挨rw段.所以那一段代码就是把rw移动到ram,并且把zi段清零.<br /><br />前面的都是连续加载的情况,&nbsp;有时候,需要分散加载,&nbsp;通过分散加载配置,可以指定个别段加载到特别指定的位置.&nbsp;比如,一些bootloader,&nbsp;vivi,&nbsp;uboot这些,&nbsp;当他们在nand&nbsp;flash启动的时候,可能需要分散加载.&nbsp;把最基本的启动代码加载到0地址(arm从0地址执行),&nbsp;剩下的加载到内存地址.
 楼主| ilovemysel 发表于 2008-5-27 17:27 | 显示全部楼层

回high斑竹

high斑竹,仔细看了你的回复,我还是有点不是很理解。<br /><br />比方说,我有一个.c的文件,里面有A,B,C三个全局变量,那么在编译器编译完毕<br /><br />后,生成的CODE和只读的数据应该是会自动放置在R0区(假设从0x0-0x3000&nbsp;0000是<br /><br />实际的flash区,0x4000&nbsp;0000-0x41FFF&nbsp;FFFF是ram区),那么A,B,C三个全局变量<br /><br />应该编译后会放置在ram区吧?<br /><br />如果是这样,启动代码何必要搬移数据到RW_BASE(假设从0x4000&nbsp;0000开始)?它<br /><br />不是已经自动的在ram区了么?<br /><br />如果不是这样,那么按书上说RO后RW后ZI,那么A,B,C三个全局变量可能被放置<br /><br />在R0后,也就是说有可能是放在flash区?&nbsp;然后启动代码才要把这些数据搬移到<br /><br />实际的rw_base的地方去,是不是?<br /><br />说的有点乱。。呵呵。。不知道哪里理解错了。。<br /><br /><br />
high 发表于 2008-5-28 14:30 | 显示全部楼层

rw is not in ram after compiling

*rw*&nbsp;also&nbsp;locate&nbsp;at&nbsp;flash/disk&nbsp;after&nbsp;*ro*&nbsp;section,&nbsp;not&nbsp;ram.&nbsp;&nbsp;you&nbsp;can&nbsp;open&nbsp;a&nbsp;*bin*&nbsp;file&nbsp;to&nbsp;check.
computer00 发表于 2008-5-29 10:17 | 显示全部楼层

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

在编译之后,这些初始化值还是被保存在ROM中,对应的应该就是加载域的RW段。<br />当程序要开始运行时,需要先将这些初始化值复制到RAM对应的地址去,而<br />&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Copy&nbsp;init&nbsp;data&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDRCC&nbsp;&nbsp;&nbsp;r2,&nbsp;[r0],&nbsp;#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;--&gt&nbsp;LDRCC&nbsp;r2,&nbsp;[r0]&nbsp;+&nbsp;ADD&nbsp;r0,&nbsp;r0,&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STRCC&nbsp;&nbsp;&nbsp;r2,&nbsp;[r1],&nbsp;#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;--&gt&nbsp;STRCC&nbsp;r2,&nbsp;[r1]&nbsp;+&nbsp;ADD&nbsp;r1,&nbsp;r1,&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;<br />这段代码就是干这活的,它将加载域中的RW段复制到了执行域中的RW段(位于RAM中)去。<br /><br />而对于ZI段,则不需要复制数据,只需要将对应的RAM清0即可。而下面这段代码就是负责这个的。<br />&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=|Image$$ZI$$Limit|&nbsp;;&nbsp;Top&nbsp;of&nbsp;zero&nbsp;init&nbsp;segment&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;#0&nbsp;<br />2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Zero&nbsp;init&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;STRCC&nbsp;&nbsp;&nbsp;r2,&nbsp;[r3],&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%B2&nbsp;<br /><br /><br /><br />在加载域中,RO、RW、ZI段都被放在ROM中。而在运行域中,RW、ZI段都要复制到RAM中,<br />至于RO段,则根据具体情况来看,如果不能在ROM中执行,则必须复制到RAM中去运行。<br />有时为了加快执行速度(例如中断处理程序等),也可将RO段部分或者全部复制到RAM中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部