比如,我们的程序保存在硬盘,不考虑文件格式问题(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地址执行), 剩下的加载到内存地址. |