有关有关程序区段的搬移,前几天系统组的主管在教我们开发环境相关的知识时有提到过,当时听的迷迷糊糊的,后来回家从头号到尾想了一遍,除了细节外,整个流程应该都了解了吧。
我认为原理很简单,就是“有设定初值的全局变量”。必须被存储在执行文件里、被烧录到ROM里,但执行者时因为这些全局变量的值可能会被程序改变,当然不能在ROM里运行,链接时必须重寻址到RAM里;就是这种“存储在ROM,在RAM执行”的特性,所以才有搬移date段的需求,而且必须在所有程序使用全局变量之前完成这件事。
我觉得比较麻烦的是LAM 与VMA的定义,我老是会把它们搞混,此外,在link script中定义可以在程序中使用的变量名称,对我个人来说,这的确是令人印象深刻的新概念。
惯于写作PC程序的工程师应该会认为“全局变量可以被设定初值”是天经地义的事情吧。却不知这是因为windows或Linux上的编译工具帮每一个程序加了称为startup code 的程序代码。startup 就像boot loader一样,负责为使用者和程序配置合理的执行环境,其中当然包含配置stack\heap的空间,以及设定全局变量的初值等。pc程序可以这么做是因为PC的CPU可以实现虚拟内存,每一个程序有自己的地址空间,所以每一个程序中各个区段的起始地址可以是一样的,为就是为什么编译工具可以白日做梦所有使用者程序通用的startup code.
哈哈,把语法弄懂之后,会发现其是很简单的。LAM 和VAM 的观念不要搞混,总之记得前者是存储地址,后者是执行地址就不会弄错了。 |