.text .data .bss .stack 和 heap
- 1.1 代码->可执行文件
- 1.2 ELF可执行文件的结构
- 1.3 内存区域
- 1.4 各段在内存中的位置
1.1 代码->可执行文件
一个程序从代码到可执行文件的过程,包括 预处理、编译、汇编,链接。可执行文件有多重类型,有ELF, BIN等。
ELF:Executable and Linkable Format
1.2 ELF可执行文件的结构
最常规的包含:
ELF头:包含ELF头的大小、目标文件的类型、.text .data .bss 等文件的位置和大小等信息
.text :程序代码区,已经编译好的机器代码。放在flash上,断电不失。
.romdata: 一些只读数据。有些时间可以直接放到.text。放在flash上,断电不失。
.data:已经初始化的全局变量和静态变量(static修饰)放在flash上,断电不失。
.bss :未初始化的全局变量和初始化为0的全局变量
1.3 内存区域
当一段程序要执行的时候,需要加载到内存。
而这段程序在内存中存放的位置并不是来连续的。会根据ELT文件描述的信息,把程序加载到内存对应的区域。程序在内存中也会被放到对应的区域。比如 ELF文件的.text会被 放到内存的.text段。
.text段 一定是会被限定为只读的。如果代码段被改写会是很恐怖的。这段内存区域一定是只读的,如果是可写的话,可能会被踩内存等非预期的改写。在SRAM上。
.data. 运行时也会从flash加载到SRAM上。
.bss 链接或运行时,该区域整段可能被初始化为0
.stack 栈是程序在运行时动态分配的。这是一个先入后出的结构,这种结构天然的适合保存 程序在运行期间的函数调用栈和 函数参数。栈是从高地址往低地址分配的。因此栈内存放的东西越多,栈顶指针的地址越小。
.heap 堆是由程序动态申请的内存空间。这是一个先入先出的结构。堆是从低地址往高地址分配的。
1.4 各段在内存中的位置
图片引用自:https://zhuanlan.zhihu.com/p/502569736