一、Linux可执行文件结构

在 Linux下,程序是一个普通的可执行文件,以下列出一个二进制可执行文件的基本情况:

可以看出,此可执行文件在存储时(没有调入到内容)分为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分。各段基本内容说明如下

代码区

存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。

代码区的指令包括操作码和操作对象(或对象地址引用)。如果是立即数(即是具体的数值),将直接包含在代码中,如果是局部数据,将在运行时在栈区分配空间,然后再引用该数据的地址,如果是未初始化数据区和数据区,在代码中同样将引用该数据的地址。
全局初始化数据区/静态数据区(数据段)

该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。

例如,一个不在任何函数内声明(全局变量),如下:

int count = 100;

使得变量 count 根据其初始值被存储初始化数据区中。

在任意位置定义静态变量方式如下:

static int num = 200;

这声明了一个静态数据并初始化,如果在任意函数体外声明,则表示其为一个静态全局变量,如果在函数体内(局部),则表示其为一个局部静态变量。另外,如果在一个函数名前加上 static,则表示此函数只能再当前文件中被调用。

未初始化数据区(又叫 BSS 区)

存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)。

例如,一个不在任何函数内声明的未初始化变量。

long sum[1000];

将 sum 存储到未初始化数据

二、Linux进程结构

在 Linux 系统下,如果将某个可执行文件加载到内存运行,则将演变成一个或多个进程(多个进程的原因是进程在运行时可以再创建新的进程,但加载时只有一个进程)。进程是 Linux 事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源。进程的环境由当前系统状态及其父进程信息决定和组成的。

下图为可执行文件存储结构和 Linux 进程基本结构(部分)的对照图。

一个进程是一个运行着的程序段,一个进程主要包括在内存中申请的空间,代码(加载的程序,包括代码段,数据段,BSS),堆,栈,以及内核提供的内核进程信息结构体

task_struct (位置在 /usr/include/linux/sched.h)、打开的文件、上下文信息以及挂起的信号等。

(1)代码区(text segment)。加载的是可执行文件代码段,其加载到内存中的位置由加载器完成。
(2)全局初始化数据区/静态数据区(Data Segment)。加载的是可执行文件数据段,存储于数据段(全局初始化,静态初始化数据)的数据的生存周期为整个程序运行过程。
(3)未初始化数据区(BSS)。加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。
(4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。
(5)堆区(heap)。用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。

系统之所以分成这么多个区域,主要基于以下考虑

  • 代码段和数据段分开,运行时便于分开加载,在哈佛体系结构的处理器将取得更好得流水线效率。
  • 代码时依次执行的,是由处理器 PC 指针依次读入,而且代码可以被多个程序共享,数据在整个运行过程中有可能多次被调用,如果将代码和数据混合在一起将造成空间的浪费。
  • 临时数据以及需要再次使用的代码在运行时放入栈中,生命周期短,便于提高资源利用率。
  • 堆区可以由程序员分配和释放,以便用户自由分配,提高程序的灵活性。

C 各存储类型比较

Linux系统编程 -- 可执行文件结构与进程在内存中的分布相关推荐

  1. Linux系统编程(三)进程间的通信

    Linux系统编程(三)进程间的通信 一.为什么需要进程之间的通信(IPC)? 二.管道 1.概念 2.特质 3.原理 4.局限性 5.代码 2.读入数据 三.共享存储映射 注意事项 父子进程通信 一 ...

  2. linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数

    linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...

  3. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  4. 【Linux系统编程】浅谈进程地址空间与虚拟存储空间

    早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...

  5. 初始Linux—Linux系统编程第三节——初始进程

    目录 冯 · 诺依曼体系结构 操作系统:Operator System(OS) 进程的基本概念 进程标识符 通过系统调用创建进程-fork初识 进程状态 僵尸进程 孤儿进程 进程优先级 环境变量 和环 ...

  6. 嵌入式Linux系统编程学习之二十二内存映射

    文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言   内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...

  7. 【Linux系统编程】线程与进程的比较

    在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至少包含一个线程. 进程, ...

  8. Linux系统编程第六节——进程的替换(execl、exelp、execle、execv、execvp、execve)

    本节的内容很简单,就是研究一下进程替换的有关内容即可. 也不存在什么导图了,因为就这一个知识点. 先说一下什么叫进程替换. 说白了,就是一个进程还没有运行完,被掉包了,被换掉了,换成了执行另外一个进程 ...

  9. linux系统编程 mmap无亲缘关系进程通信

    在无亲缘关系的前提下,两个进程必须是对同一个文件进行创建映射区操作. 对映射区进行写操作: 1 #include<stdio.h>2 #include<string.h>3 # ...

  10. Linux系统编程28:进程间通信之共享内存和相关通信接口(ftok,shmget,shmctl,shmat,shmdt)

    文章目录 (1)管道和共享内存的区别 (2)先组织,再描述 (3)进程间通信相关接口 A:ftok(获取唯一标识码) B:shmget(创建共享内存) C:shmctl(控制共享内存) D:shmat ...

最新文章

  1. MySQL单机多实例部署详解之------利用mysqld_multi配置实现
  2. 获取sqlserver数据库中所有库、表、字段名的方法
  3. 浏览器对F5的微观处理
  4. java gui 移动_JavaGUI如图:当鼠标按left按钮,右边的字会移动到左边按 爱问知识人...
  5. mac怎么安装python开发环境搭建_Mac OS搭建Python开发环境
  6. MyBatis使用动态SQL语句
  7. 最短路 spfa算法
  8. 乐高大颗粒作品23:磁悬浮列车
  9. shell脚本:从1加到100的几种实现方式
  10. 从0开始使用Git:Win10下使用Git配置并关联Gitbub远程仓库全教程与踩坑分析
  11. 会议OA项目之我的审批签字功能
  12. “我只警告一次,下次我会直接忽略你发的垃圾,懂?”Linus 精彩炮轰语录集锦...
  13. GPT硬盘分区命令parted
  14. 关于定量控制污水流量计的安装、维护与定期比对及计量
  15. 计算机考试成表格,2010年职称计算机考试:Word创建表格
  16. 安卓全屏java模拟器如何安装_使用Android 模拟器运行自定义Rom
  17. 学Python该看什么书?所有方向的精华好书推荐,18年老程序员倾囊相授!
  18. iOS10 相关适配问题
  19. 搜狗输入法词库php词库怎么用,中州韵输入法导入搜狗词库(示例代码)
  20. 起来,起来........

热门文章

  1. VS 2017 产品密钥
  2. 201771010112罗松《面向对象程序设计(java)》第十周学习总结
  3. mxonline实战14,全局搜索,修改个人中心页面个人资料信息
  4. 前端页面——Cookie与Session有什么差别
  5. MySql中的count函数
  6. HCIE-Security Day12:补充包过滤和安全策略的概念
  7. CocosCreator2.3.1切换场景出现Failed to load scene ‘xxx‘ because ‘xxx‘ is already being loaded问题的解决方案
  8. MySQL存储过程(三)——存储过程分支流控语句
  9. 防火墙透明模式下虚拟系统配置实例
  10. Python3 批量创建文件、修改文件名及回滚操作