第4课-Linux应用程序地址布局

4.1 程序构成

在学习linux应用程序开发时,经常会遇到如下的概念:代码段、数据段、BSS段(Block Started by Symbol,又名:未初始化数据段)、堆(heap)和栈(staack)。而这些部分也是构成Linux应用程序的重要组成部分。

4.2 内存布局

当linux应用程序在内存运行的时候,以上组成部分在内存中又是如何布局的呢?

  1. 从低地址到高地址分别为:代码段、数据段、BSS段、堆、栈。
  2. 堆向高内存地址生长。
  3. 栈向低内存地址生长。
  4. 其中所有的代码段的地址(linux系统中)的初始位置都是从0x8048000开始的。这是个虚拟地址,它虽然是固定的,但是它映射的具体的地址是不一样的。

4.3 手把手教学

下面列出来我们需要的代码:addr.c

#include<stdio.h>

#include<stdlib.h>

int global_init_a=1; //全局的,初始化变量,数据段

int global_uninit_a;//全局的,没有初始化的变量,数据段

static int static_global_init_a=1; //全局的,静态的,初始化的变量,数据段

static int static_global_uninit_a; //全局的,静态的,未初始化的变量,数据段

const int const_global_a=1; //全局的,常量,代码段

int global_init_b=1; //全局的,初始化的变量

int global_uninit_b; //全局,未初始化

static int static_global_init_b=1; //全局,静态,初始化

static int static_global_uninit_b; //全局,静态,未初始化

const int const_global_b=1; //全局、常量

int main()

{

int local_init_a=1; //局部,初始化的,栈

int local_uninit_a; //局部,未初始化,栈

static int static_local_init_a=1; //局部的,静态,初始化的,数据段

static int static_local_uninit_a; //局部的,静态,未初始化的,数据段

const int const_local_a=1; //局部,常量,栈

int local_init_b=1; //局部,初始化的

int local_uninit_b; //局部,未初始化

static int static_local_init_b=1; //局部,静态,初始化

static int static_local_uninit_b; //局部,静态,未初始化

const int const_local_b=1; //局部,常量

int *malloc_p_a;

malloc_p_a=malloc(sizeof(int)); //通过malloc分配得到的局部,堆

printf("&global_init_a=%p,global_init_a=%d\n",&global_init_a,global_init_a);

printf("&global_uninit_a=%p,global_uninit_a=%d\n",&global_uninit_a,global_uninit_a);

printf("&static_global_init_a=%p,static_global_init_a=%d\n",&static_global_init_a,static_global_init_a);

printf("&static_global_uninit_a=%p,static_global_uninit_a=%d\n",&static_global_uninit_a,static_global_uninit_a);

printf("&const_global_a=%p,const_global_a=%d\n",&const_global_a,const_global_a);

printf("&global_init_b=%p,global_init_b=%d\n",&global_init_b,global_init_b);

printf("&global_uninit_b=%p,global_uninit_b=%d\n",&global_uninit_b,global_uninit_b);

printf("&static_global_init_b=%p,static_global_init_b=%d\n",&static_global_init_b,static_global_init_b);

printf("&static_global_uninit_b=%p,static_global_uninit_b=%d\n",&static_global_uninit_b,static_global_uninit_b);

printf("&const_global_b=%p,const_global_b=%d\n",&const_global_b,const_global_b);

printf("&local_init_a=%p,local_init_a=%d\n",&local_init_a,local_init_a);

printf("&local_uninit_a=%p,local_uninit_a=%d\n",&local_uninit_a,local_uninit_a);

printf("&static_local_init_a=%p,static_local_init_a=%d\n",&static_local_init_a,static_local_init_a);

printf("&static_local_uninit_a=%p,static_local_uninit_a=%d\n",&static_local_uninit_a,static_local_uninit_a);

printf("&const_local_a=%p,const_local_a=%d\n",&const_local_a,const_local_a);

printf("&local_init_b=%p,local_init_b=%d\n",&local_init_b,local_init_b);

printf("&local_uninit_b=%p,local_uninit_b=%d\n",&local_uninit_b,local_uninit_b);

printf("&static_local_init_b=%p,static_local_init_b=%d\n",&static_local_init_b,static_local_init_b);

printf("&static_local_uninit_a=%p,static_local_uninit_b=%d\n",&static_local_uninit_b,static_local_uninit_b);

printf("&const_local_b=%p,const_local_b=%d\n",&const_local_b,const_local_b);

printf("malloc_p_a=%p,*malloc_p_a=%d\n",malloc_p_a,*malloc_p_a);

while(1)

return 0;

}

运行结果:

当运行程序./addr时,若想停止下来,就按ctrl+c,就能退出来。

在另一个终端中,输入命令ps aux,显示系统的进程,找到addr的进程,我们找到的进程号是4213,输入命令cat /proc/4213/maps,显示程序的布局:

4.4 数据存放

1.代码段:代码,全局变量(const)、字符串常量。08048000-08049000

2.数据段:全局变量(初始化以及未初始化的)、静态变量(全局的和局部的、初始化以及未初始化的)。08049000-0804a000

3.堆:动态分配的区域,如malloc。0834e000-0836f000

4.栈:局部变量(初始化以及未初始化的,但是不包含静态变量)、局部只读变量(const)。

4.5 BSS段去了哪里?
         利用readelf -S 程序名,分析BSS段

我们使用file命令分析文件的格式,如下:

显示的是elf格式的32位文件,利用readelf命令可以提取addr的详细信息,如下:

转载于:https://www.cnblogs.com/free-1122/p/11342007.html

第三季-第4课-Linux应用程序地址布局相关推荐

  1. linux应用程序内存布局

    1.linux应用程序内存布局 从低地址到高地址分别为:代码段.数据段.BSS段.堆.栈 对向高内存地址生长,栈想低内存地址生长 linux中所有的应用程序都是这个布局,每个应用程序都是从0x8048 ...

  2. linux独立应用程序开发,Linux应用程序开发(一)

    Linux应用程序开发(一)---移植thttpd+Sqlite3+PHP5到arm linux(4) 移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下Cen ...

  3. 《嵌入式 Linux应用程序开发标准教程(第2版)》——第1章 Linux快速入门 1.1 嵌入式Linux基础...

    本节书摘来自异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者 华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...

  4. 《嵌入式 Linux应用程序开发标准教程(第2版)》——1.1 嵌入式Linux基础

    本节书摘来异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者:华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...

  5. Linux上程序调试的基石(2)--GDB

    3. GDB的实现  GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序.可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况.它的实现也是基于ptrace系统调用来完成的. ...

  6. 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...

    <嵌入式linux应用程序开发完全手册>中断控制器操作(外部中断)学习笔记 一.ARM中断体系 当一个"异常"发生时,或者说当收到一个中断触发信号时,ARM9将会自动完 ...

  7. Linux下程序的保护机制(checksec)

    Linux下程序的保护机制 前言 相信很多人,查看程序信息时会用到,checksec这个命令.它会给你返回如下图的结果,但是很多最开始看到的人,很多都看不懂,如果身为小白的我,跟在大佬后面比葫芦画瓢, ...

  8. Linux 应用程序开发入门

    Linux 应用程序开发入门 Neo Chen (netkiller) <openunix@163.com> 版权 © 2011, 2012 http://netkiller.github ...

  9. linux如何调试elf程序,Linux应用程序elf描述

    玩Linux的人应该明白ELF文件是一种文件格式,就好比.txt,.doc等一样,只是这个文件是按照特定信息排列组成,同样在windows上也存在一种格式,它叫PE,老的叫dos.下面我就来看看ELF ...

  10. QT接收Linux内核,QT界面程序经过网路与普通的linux应用程序进行数据传送的情况...

    有时候会遇到QT界面程序经过网路与普通的linux应用程序进行数据传送的情况:(UDP协议,非TCP协议) 个人感觉比管道.共享内存.信号量.消息队列好用 Qt udp_client 1.我们新建Qt ...

最新文章

  1. 通用AI咋发展?向大脑学习是条路子
  2. 2021-春季学习-智能车技术创新与实践-Lesson3
  3. 系统安全漏洞成云安全主威胁
  4. 基于前后端分离的Nginx+Tomcat动静分离
  5. processing pushMartix
  6. 教你怎么屏蔽掉在移动端的宽带运营商的流量劫持,屏蔽无耻的广告
  7. Linux在超级计算机领域一统天下
  8. O2O休闲零食品类白皮书
  9. Hello Quartz (第一部分)
  10. Python之数据分析(坐标刻度定位器、散点图、柱状图、颜色区域填充)
  11. Eclipse 使用常见问题汇总
  12. FFA 2021 专场解读 - 开源解决方案 / 流批一体
  13. 自定义 Yasnippet 模板
  14. 如何清空Python的List
  15. 网站建设教程:新手如何自己建网站?
  16. 模长,方向余弦,方向角、单位向量和方向导数的计算
  17. Android碎片化问题
  18. python牛顿环测量曲率半径
  19. Python输出16进制不带0x补零,整数转16进制,字符串转16进制
  20. 微信小程序:“去中心化”的社交电商,电商正转向以商品为核心

热门文章

  1. n个数中的最大值和最小值
  2. JavaScript上传文件,不打断点就上传失败
  3. 5 年迭代 5 次,抖音基于 Flink 的推荐系统演进历程
  4. hashcode值一样对象一定相同吗_硬核问题,为什么重写equals()就要重写hashCode()?
  5. html的经典语法大全,HTML语法大全
  6. java 检测 类型_[Java教程]javascript类型与类型检测
  7. django mysql debug_django mysql db 日志无输出
  8. python爬小说收费章节_python 多线程爬小说返回章节乱套。求解
  9. Python爬取图片时,urllib提示没有属性urlretrieve的问题
  10. 打造可降级的React服务端同构框架