ZHCADC5A June 2013 – June 2020
加载程序并开始执行程序时,有许多系统特定的方面。本节说明了常见于大多数系统的一般过程方面,重点介绍了特定于 MSP430 的项目。
这些步骤可以通过结合使用离线代理(例如基于主机的加载器)、目标系统(例如操作系统)的运行时组件或链接到程序本身的库组件(例如自引导代码)来执行。
加载程序通常包括四组操作:创建过程映像、初始化执行环境、执行程序和执行终止操作。
创建过程映像包括将程序及其子组件复制到存储器中,并在需要时执行重定位。这些步骤必须由某些外部代理执行,例如基于主机的加载器或操作系统。
初始化执行环境中的一些步骤必须在程序开始运行之前(即在调用 main 之前)进行。这些步骤可由外部代理或程序本身执行。同样,终止操作在 main 返回(或调用 exit)时发生,并且可在外部执行或由程序执行。
表 12-1、表 12-2 和表 12-3 列出了创建、初始化和终止程序的步骤。虽然步骤的顺序不是绝对的,但必须遵守一定的依赖性。
步骤 | ||
---|---|---|
1. | 确定每个可加载段的地址。在裸机或非动态系统中,这通常是段的程序标头的 p_vaddr 字段中的地址。有关其他注意事项,请参阅节 12.1。 | |
2. | 初始化存储器系统并分配存储器。 | |
3. | 将每段的内容复制到存储器中。如果某个段有未填充空间(即其文件大小小于其存储器大小),则将未填充空间初始化为 0。 | |
4. | Marshall 命令行实参和环境变量。此步骤特定于平台。 |
步骤 | ||
---|---|---|
5. | 设置 SP。SP (R1) 应设置为符号 _ _TI_STACK_END 的值,在 8 字节边界上正确对齐。 | |
6. | 初始化变量。对于基于 ROM 的自引导系统,需要通过某种机制将基于 RAM(读写)的变量初始化为其初始值。此机制特定于工具链和平台。Chapter14说明了在 TI 工具中实现的一种此类机制。 | |
7. | 执行初始化调用。通常,这些调用是对模块中定义的全局对象的构造函数的调用。指向初始化函数的指针存储在表中。此表由一对全局符号分隔:_ _TI_INITARRAY_Base 和 _ _TI_INITARRAY_Limit。 | |
8. | 分支到入口点。入口点在 ELF 标头的 e_entry 字段中指定。在具有某些基础软件结构(例如操作系统)的系统上,入口点通常是 main 函数。在裸机系统上,此表列出的大多数初始化步骤可以由程序本身通过在执行 main 函数之前执行的库代码来执行。在此情况下,ELF 入口点是该代码的地址。例如,TI 工具提供了一个名为 _c_int00 的条目例程,此例程会在过程映像创建后开始步骤 10(设置 SP)中的序列。 |
步骤 | ||
---|---|---|
9. | 执行 atexit 调用。以与注册相反的顺序调用由 atexit 注册的函数。 |