工作学习小记--C 语言进程内存布局
2015-11-27 23:59
281 查看
=============================== 博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
在嵌入式系统中,内存资源非常有限,只有熟悉代码在内存中的布局才可以更大限度地利用嵌入式内存资源。这篇文章主要分为两部分,首先贴图说明,进程内存布局,继而代码论证。
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 (显示所有信息)
在嵌入式系统中,内存资源非常有限,只有熟悉代码在内存中的布局才可以更大限度地利用嵌入式内存资源。这篇文章主要分为两部分,首先贴图说明,进程内存布局,继而代码论证。
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 (显示所有信息)
相关文章推荐
- 杭电2544-Dijkstra算法
- hibernate基于外键的双向1-1关系映射
- 南大软院大神养成计划第十二天
- linux 安装wordpress 无故往外发送大量垃圾邮件
- java异常处理和设计
- 戴旭:未来十年可能惨不忍睹,中国尚未意识到危机的逼近
- 用多种方法交换两个数的值
- C程序的基本结构
- 你写的return null正确吗?
- Leyni, LOLI and Toasts
- 数据库采用多表连接查询,对应javaBean文件连接方式
- jlink_v8原理图
- apt-get
- 3-读书笔记----iOS开发指南:从零基础到App Store上架--iOS表视图
- OFDM的个人笔记
- 1111
- UINavigationController-导航栏主题设置
- 设计模式七之适配器模式和外观模式1
- 大家一起数钢镚
- 在Linux上安装Memcached服务