内存管理 bss data text

本文深入探讨单片机程序的组成,详细讲解bss、data及text段的作用与存放内容,通过实例验证未初始化与已初始化全局变量的存储位置,以及代码指令的存放区域。

单片机的程序是怎么组成的呢,代码又是如何存放的呢?带着疑问,今天我们来学习下bss data text都是什么。

0x01.bss

.bss(block started by symbol)段是用来存放已经初始化为0或者未初始化的全局变量的内存区域,属于静态内存分配。

接下来编写代码来验证一下。

代码如下:

#include <stdio.h>

int bss_data[1024*1024];

int main(int argc,char * argv[])
{
 return 0;
}

接下来我们编译一下,看看输出信息,使用命令

gcc -g bss.c -o bss

使用命令

size bss
 text data bss dec hex filename
 1055 272 4194336 4195663 40054f bss

1024*1024 = 4194336

可见bss这个未初始化的全局数组被存放在了bss段中。

bss段只占用运行内存,并不占用可执行文件大小。

0x02 .data

未初始化的全局变量放在了bss段,那么其他的全局变量呢,相信你已经猜到了,data段(data segment)就是用来存放已经初始化的全局变量的。

将上面的代码中,bss数组初始化为1,再编译一下看看就会发现之前的bss段大小,全部转移到了data段中,神奇!

data段不仅占用可执行文件的大小,也要占用运行内存。

0x03 .text

text段是用来存放代码的内存区域,这个区域是可执行的,我们编写的代码指令都会放在这个区域,感兴趣的同学可以参考步骤一来编译一下,查看下text段的大小。

在程序的内存布局中,`text`、`data` 和 `bss` 是三个关键的组成部分,它们分别用于存储不同的数据类型和代码,并对程序的性能和资源使用产生影响。 ### text `text` 通常用于存储程序的可执行指令。这部分内容是只读的,以防止程序意外修改自身的指令。在嵌入式系统或操作系统中,`text` 的内容通常位于非易失性存储器(如Flash)中,因为不需要频繁更改[^1]。 ### data `data` 用于存储已初始化的全局变量和静态变量。这些变量的值在编译时已经确定,并且会占用实际的存储空间。例如,声明一个 `int count = 10;` 会将这个变量分配到 `data` 中。由于 `data` 需要保存具体的数值,它会占用一定的存储资源[^1]。 ### bss `bss` 用于存储未初始化的全局变量和静态变量。这类变量在程序启动时会被自动初始化为零。与 `data` 不同,`bss` 不占用实际的存储空间,仅在运行时占用RAM。因此,对于资源受限的系统(如单片机),减少 `bss` 的大小可以有效节省宝贵的RAM资源。例如,未初始化的数组或变量会被放置在 `bss` 中,这有助于优化内存使用。 ### 内存优化策略 为了优化内存使用,开发人员通常会关注 `bss` 的大小。由于 `bss` 最终会占用RAM,而RAM是一种稀缺资源,特别是在嵌入式系统中,因此应尽量减少不必要的全局变量和静态变量的数量。此外,可以通过将一些变量移到堆栈或动态分配内存的方式,进一步优化内存使用。 ### 示例代码:查看信息 以下是一个简单的C语言示例,展示了如何通过链接脚本或工具查看程序中的 `text`、`data` 和 `bss` 的信息: ```c #include <stdio.h> // 已初始化的全局变量将被放入.data int initialized_var = 20; // 未初始化的全局变量将被放入.bss int uninitialized_var; int main() { // 局部变量通常分配在栈上 int stack_var = 30; printf("Initialized variable address: %p\n", (void*)&initialized_var); printf("Uninitialized variable address: %p\n", (void*)&uninitialized_var); printf("Stack variable address: %p\n", (void*)&stack_var); return 0; } ``` 在编译后,可以通过工具如 `size` 或者查看生成的 `.map` 文件来获取详细的信息: ```bash size your_program.elf ``` 输出可能类似于: ``` text data bss dec hex filename 1200 300 50 1550 60e your_program.elf ``` ### 系统级符号表文件 `/proc/kallsyms` 与 `System.map` 在Linux内核中,`/proc/kallsyms` 和 `System.map` 是两个重要的符号表文件。`/proc/kallsyms` 包含了内核模块的符号以及静态代码的符号表,而 `System.map` 仅包含静态代码的符号表。这两个文件在调试和分析内核问题时非常有用,尤其是在跟踪地址和函数名之间的映射关系时[^3]。 ### 总结 理解 `text`、`data` 和 `bss` 的作用及其对内存的影响,可以帮助开发人员更好地优化程序的内存使用,尤其是在资源受限的环境中。通过合理管理全局变量和静态变量的使用,可以显著减少 `bss` 的大小,从而节省RAM资源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值