嵌入式内存分布详解

前言

硬件程序调试比较看重内存的分布情况,可以通过编译输出文件来分析运行时的数据结构
如有疑问,欢迎指正,谢谢

内存分布图
  • 代码段 (Text segment):存放程序执行代码的区域,设计在低地址防止堆栈溢后覆盖现象,嵌入式系统中也就是ROM区
  • 初始化数据段(Initialized data segment):简称data段,存放程序中已经初始化全局初始化静态变量
  • 未始化数据段(Uninitialized data segment):简称bss段,存放程序中未初始化全局未初始化静态变量,该区域会在程序载入时由内核清零
  • 栈(Stack):存放局部变量,自动分配与释放,函数调用时进行内存的分配,调用结束时进行释放
  • 堆(Heap):动态内存块,主动分配(malloc/realloc),需要手动释放(free);可以使用brk和SBR调整大小
    在这里插入图片描述
代码论证

1. C源码样列

#include <stdio.h>
int main(void)
{
    printf("Memory Test!");
    return 0;
}
  • 使用GCC编译后,代码段text占用97字节,初始化数据段data为0字节,未初始化数据段bss占用0字节
    在这里插入图片描述

2. 代码上增加不初始化静态全局变量

#include <stdio.h> 
static int a;
int main(void) 
{ 
    return 0; 
} 
  • 使用GCC编译后,未初始化数据段bss增加到4字节,刚好是一个整型变量的占用空间
    在这里插入图片描述

3. 增加全局变量并赋初值

#include <stdio.h> 
static int a;
int b = 1;
int c = 2;
int main(void) 
{ 
    return 0; 
} 
  • 使用GCC编译后,未初始化数据段bss仍然为4字节,初始化数据段data为8字节
    在这里插入图片描述

4.分析目标文件

#include <stdio.h>
static int a;
int b;
int c = 1;
int d = 2;

const char *str = {"Memory Test1"};

int main(void)
{
    int e = 0;
    e += 1;
    printf("%s",str);
    return 0;
}

通过GCC进行编译,通过objdump指令查看可执行文件
在这里插入图片描述

  • .text对应的是汇编的指令
  • .data数据段对应的就是全局变量c、d,值分别为1与2
  • .rodata段存放了Memory Test1字符串常量
  • .bss段未打印,不占用目标文件

在这里插入图片描述
在这里插入图片描述

  • 上图中.bss段大小为4,但是代码定义了两个未初始化的变量,这个和编译器具体实现有关系

结论

  • BSS段不保存到目标文件中,所以不占用目标文件的任何空间
  • 数据段保存到目标文件中
  • 局部变量在运行时进行创建
嵌入式内存压力测试是为了确保硬件上的内存没有问题,并且方便以后定位内存相关的问题。在这里,我们可以使用memtester软件进行嵌入式设备上的内存压力测试。 要进行嵌入式内存压力测试,可以按照以下步骤进行操作: 1. 首先,从memtester的官网(http://pyropus.ca/software/memtester/)上下载并解压软件。 2. 接下来,需要配置和编译memtester。由于是在嵌入式设备上运行,所以需要指定相应的交叉工具编译链。修改根目录下的“conf-cc”和“conf-ld”文件,将默认编译器改为目标编译器,然后使用make命令进行编译。 3. 将编译好的可执行文件导出到目标板上。可以通过nfs服务器挂载或者将可执行文件放到根文件系统中重新烧录。推荐使用nfs服务器挂载的方式进行导出。 4. 最后,运行memtester程序。使用命令"memtester [-p 内存物理起始地址] [测试内存大小B/K/M/G] [测试次数]"进行测试。其中,测试内存大小要指定,并且不要超过可用内存大小。物理起始地址和测试次数可以省略,如果省略物理地址,memtester会随机选择空闲内存进行测试;如果省略测试次数,memtester会一直进行测试,直到手动结束。在测试之前,可以使用free命令查看可用内存大小。 需要注意的是,memtester会对内存进行与运算、或运算等操作,以校验数据是否出错。它会将要测试的内存分成两部分,并赋予相同的数据。然后,对其中一部分进行运算,与另一部分进行对比。如果内存没有出错,两部分对应地址的数据应该相等,否则会报错。值得一提的是,在没有指定物理地址时,报错会打印出0x开头的地址,这是出错内存单元相对于起始内存地址的偏移量,而不是实际的物理地址。 综上所述,嵌入式内存压力测试使用memtester软件能够帮助我们确保内存的稳定性,并为以后的问题定位提供便利。以下是进行嵌入式内存压力测试的步骤: 1. 下载并解压memtester软件。 2. 配置和编译memtester,指定交叉工具编译链。 3. 导出编译好的可执行文件到目标板。 4. 运行memtester程序,使用合适的命令参数进行内存压力测试。 记得在测试之前,检查可用内存大小,以便指定合适的测试内存大小。 http://pyropus.ca/software/memtester/ 引用 引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值