系统初始化

来源:互联网 发布:小米盒子直播软件 编辑:程序博客网 时间:2024/05/18 14:14
系统初始化:
C/C++建立运行环境,有引导程序c_int00函数完成的。系统开始运行,跳转到c_int00,或者系统运行时调用c_int00。通常是

硬件的中断服务程序中调用c_int00。必须把c_int00与另一个对象模块链接起来。
链接完成后,连接器在可执行输出模块中将程序入口地点符号设置为c_int00。

c_int00初始化执行以下操作:
定义系统栈.stack并初始化栈指针。
初始化全局变量
调用main()函数运行C程序。

一些全局变量在程序开始运行之前必须初始化。这个初始化的过程叫做——自动初始化。
编译器在.cinit的段中建立了一个全局变量的表。

带构造函数的所有C++全局变量必须在main()之前调用他们的构造函数进行初始化,编译器构造一张全局构造函数的表,放

在.pinit段中。

初始化表:
里面分为好多字段。分别记录了初始化数据的大小,初始化数据复制的目的地址,要复制到.bss段去初始化变量的数

据,每个变量的初始化记录


分为两种方式初始化。
1运行时自动初始化: -c
.cinit段与其他段一并从目标文件加载入存储器,连接器定义了一个名为CINIT的符号,用来标识初始化表的首地址

。程序开始运行时,C启动程序将表中的数据复制给.bss段中特定的变量,这便允许将初始化数据放入ROM中,在每次程序开始

时将他复制到RAM中。
2加载时初始化: -cr
连接器将.cinit段头中的STYP_COPY置位为1,并告知加载器不要把.cinit中的表加载入存储器并将符号cinit赋值-1

,告诉启动器初始化表不在储存器中,因此启动时不执行初始化。而加载器直接把目标文件的.cinit复制到RAM的.bss中。