=============================== 博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
在嵌入式系统中,内存资源非常有限,只有熟悉代码在内存中的布局才可以更大限度地利用嵌入式内存资源。这篇文章主要分为两部分,首先贴图说明,进程内存布局,继而代码论证。
1 贴图
1)代码段(text 段 r):存放程序的全部二进制指令
2)data段(initialized data r/rw):存放已经初始化的全局变量和已经初始化的static 局部变量,字符串常
量(r)
3)bss段(uninitialized data rw):未初始化的全局变量和未初始化的static 局部变量,运行时初始化为0
4)堆段(heap):malloc 等函数动态分配,free 函数释放,如果不是释放,程序运行完,os自动释放。heap
地址向上生长。
5)栈段(stack):编译器自动分配释放,主要存局部变量,子函数,函数参数,使用完子函数就会自动释放,
当运行其他子函数,将覆盖已经释放的区域。stack 地址向下生长。
2 代码验证
#include<stdio.h>
char *text_p = "hello world !!!"; /* ro data */
int data_a =0; /* data*/
int bss_b; /* bss*/
void test(void) /* stack*/
{
static int data_c = 0; /* data*/
static int bss_g; /* bss*/
int stack_d = 0; /* stack*/
printf("data address :&data_c =%p\r\n",&data_c);
printf("bss address::&bss_g =%p\r\n",&bss_g);
printf("stack address :&stack_d=%p\r\n",&stack_d);
}
int main(void)
{
int stack_e; /*stack*/
char *heap_p = (char *)malloc(4); /*heap*/
char *heap_pp = (char *)malloc(4);/*heap*/
printf("text address :&main =%p\r\n",&main);
printf("text address :&text_p =%p\r\n",text_p);
printf("data address :&data_a =%p\r\n",&data_a);
printf("bss address::&bss_b =%p\r\n",&bss_b);
test();
printf("stack address :&stack_e=%p\r\n",&stack_e);
printf("stack address :&test =%p\r\n",&test);
printf("heap address :&heap_p =%p\r\n",heap_p);
printf("heap address :&heap_pp=%p\r\n",heap_pp);
return 0;
}
* 编译:root@yi-desktop:/home/yi# gcc 1127.c -o 1127
1)size 命令看内存分布![]()
![]()
2)readelf 命令看elf目标文件,命令详解可以看这篇文章: http://man.linuxde.net/readelf
root@yi-desktop:/home/yi#readelf 1127 -a (显示所有信息)![]()
![]()
![]()
![]()
![]()