1. 具体分布细节由编译器决定
2. 分布图
3. 静态局部变量通常被存放在程序的.data段中。
一般地,静态局部变量定义在函数体内,在函数执行时,它会在静态存储区分配内存,并且只被初始化一次。因为静态局部变量是在编译阶段产生的,而非执行期间动态生成的,所以它们的空间在编译阶段就已经被确认。这与.bss段中的变量不同,.bss段中的变量是未经初始化的全局或者静态变量,其内存空间也被系统预留,但是在程序加载时内存中并没有给定初值。
因此,静态局部变量需要在程序启动时进行初始化,通常的做法是将静态局部变量的初始值存放在程序的.data段中。程序加载时,会将.data段中的内容复制到已分配的内存位置,从而完成对静态局部变量的初始化。当程序执行到相应函数时,静态局部变量便位于已经初始化的数据段中,并可以正常使用。
4. 静态全局变量既可以存储在程序的.bss段中,也可以存储在.data段中,具体取决于它是否初始化。
如果静态全局变量被显式初始化(例如int x = 1;),那么它会被存储在程序的.data段中。.data段是用来存放已经初始化的全局变量、静态变量等数据的段。该段在程序加载时就会被加入到程序的内存空间中,并且相应的数据也会被加载进来。对于已经初始化的全局变量和静态变量,其具体的值在程序启动时就已经确定,因此可以直接保存在.data段中。
而如果静态全局变量没有被显式初始化(例如int x;),那么它会被存储在程序的.bss段中。.bss段是用来存放未初始化的全局变量、静态变量等数据的段。该段在程序加载时也会被加入到程序的内存空间中,并且相应的数据会被初始化为0。由于未初始化的全局变量和静态变量在程序启动时并没有确定其具体的值,因此可以通过简单地将它们的地址清零来完成初始化,从而避免在程序加载时浪费内存空间来存储它们的初始值。
需要注意的是,很多编译器在实现时会将程序的.bss段和.data段合并为一个共同的数据段,因此静态全局变量的存储方式也可能会有所不同。
5. 程序在内存中的分布通常受多种因素的影响,例如编译器的设置、程序代码和数据段的大小、启动代码、链接脚本等。在ARM架构下,程序通常被划分为以下三个部分:
5.1 文本段(text segment):文本段包含程序的机器指令,通常以只读的方式存储在内存中。这些指令是可执行的代码,通常被加载到指令高速缓存中以提高程序执行的效率。
5.2 数据段(data segment):数据段存储程序中的静态变量和全局变量,以及已初始化的常量数据。数据段通常是可读写的,它的地址通常在程序启动时由链接脚本进行定义和分配。
5.3 堆栈段(stack segment):堆栈段用于存储函数调用期间的局部变量、函数参数、返回地址和其他临时值。堆栈段通常位于内存的较低端,并在程序运行时自动增长(通常是向下)。堆栈的大小通常在程序启动时由启动代码或链接脚本进行设置和分配。
在程序运行时,操作系统或者硬件负责将程序的各个部分从磁盘或者其他存储介质中加载到内存中,并按照内存映射表进行映射和设置。程序在运行时通过访问这些存储区域来执行指令、读取和写入数据以及处理函数调用等操作。