KEIL中__main函数的执行操作及初始化规则问询
__main函数在用户main()执行前的具体操作
__main是ARM系列编译器(如Keil MDK的ARMCC/ARMCLANG)提供的启动阶段入口函数,会在用户编写的main()运行前自动执行,核心操作如下:
- RW变量复制:将存储在Flash中的RW(读写属性)全局/静态变量,完整复制到RAM的指定区域——因为Flash是只读介质,RW变量需要可读写空间,这一步是必须的。
- BSS段清零:把BSS段(未初始化的全局/静态变量区域)的所有字节置为0,符合C语言标准中未初始化静态变量默认值为0的要求。
- 栈与堆的初始化:
- 栈的基础初始化通常在更早的启动汇编代码完成,但__main会确认栈指针的合法性;
- 堆的初始化是__main的关键操作,会根据工程配置(或分散加载文件)设置堆的起始地址和大小,为后续
malloc、free等动态内存操作提供可用空间。
- 运行时环境初始化:
- 初始化编译器依赖的运行时组件,比如启用FPU后的浮点运算库;
- 执行全局构造逻辑:包括C++中静态对象的构造函数,以及C语言里用
__attribute__((constructor))标记的初始化函数。
- 分散加载规则执行:如果工程中使用了分散加载文件(Scatter File)来自定义内存区域划分(比如指定某部分变量到特定RAM块、代码到不同Flash分区),__main会严格遵循分散加载文件的定义,完成对应区域的RW复制、BSS清零等操作,保证每个内存区域的变量都被正确初始化到指定位置。
内容的提问来源于stack exchange,提问作者George Ma
相关产品推荐
相关产品推荐

