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系统编程】Linux 可执行文件结构与进程结构相关推荐

  1. Linux系统编程(六)守护进程

    Linux系统编程(六)守护进程 一.进程组 概念 二.会话 创建会话的条件 守护进程 概念 守护进程模型 创建守护进程 一.进程组 概念 进程组,也称之为作业.代表一个或多个进程的集合.每个进程都属 ...

  2. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  3. Linux系统编程(二)孤儿进程和僵尸进程

    Linux系统编程(二) 一.exec函数族 1.exec函数 二.孤儿进程和僵尸进程 三.wait和waitpid 1.wait函数 2.waitpid函数 一.exec函数族 exec函数使用时, ...

  4. LINUX系统编程 LINUX 虚拟内存

    LINUX 虚拟内存 以32位操作系统为例子,因为64位系统虚拟地址过大为2^64,32位仅仅为2^32=4G更利于描述,但是原理东西都一样 这首先要从程序和进程之间的关系开始,我们一般写好一段C\C ...

  5. Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)

    对比 进程 线程 fork pthread_create exit (10) pthread_exit (void *) wait (int *) pthread_join (,void **)阻塞 ...

  6. 嵌入式Linux系统编程学习之十二守护进程

    文章目录 前言 一.守护进程的特性 二.daemon 进程的编程规则 1.创建子进程,父进程退出 2.在子进程中创建新会话 前言   daemon 运行在后台,也称作"后台服务进程" ...

  7. Linux系统编程--2(环境变量,进程控制)

    环境变量 环境变量 是指在操作系统中用来指定操作系统运行环境的一些参数 每个人用电脑的习惯不一样,比如一般把文件放到磁盘,怎么管理文件,用什么编译器,所以,环境变量就是根据每个人使用操作系统的习惯来规 ...

  8. Linux系统编程:习题,父子进程通过信号通信,实现交替数数

    Linux练习题,父子进程通过信号通信,实现交替数数. 习题思路 父子进程交替发信号进行驱动从而实现数数,值得注意的是 不管是父进程或者子进程谁先发送信号 都会面临一个问题,另外一个进程的信号捕捉函数 ...

  9. Linux系统编程——Linux系统调用

    系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组"特殊"接口.用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务,比如用户可以 ...

  10. linux终端和执行进程的关系,Linux系统编程第04期:打通进程与终端的任督二脉

    本课程是<嵌入式工程师自我修养>自学教程六步走中的第3步:Linux系统编程第04期. 进程,是Linux系统中任务调度运行的基本单元:一个程序的运行,都要被操作系统包装成"进程 ...

最新文章

  1. 心辽阔了,人生才能辽阔
  2. 服务器不响应Ajax,web前端:解决在IE11浏览器下,JQuery的AJAX方法不响应问题
  3. linux使用权限模式启动mongodb,Linux安装MongoDB启动及常见问题解决
  4. flash挂载到系统 spi_jffs2根文件系统挂载不上spi flash
  5. Jmeter响应断言介绍
  6. 使用 JWT 来保护你的 SpringBoot 应用
  7. java学习二---对象和内存管理
  8. 三层交换机对链路层数据帧的处理
  9. Fiddler抓包工具版面认识(一)
  10. birt脚本for循环语句_Python入门第7课,循环结构学习,for语句range函数的3种用法
  11. 值得推荐的C/C++框架和库 转
  12. 部分关键字--this/extends/super/static/final/abstract/访问权限总结
  13. 车牌识别算法_向滥用远光灯说不,易泊车牌识别算法了解一下?
  14. 最新emoji表情代码大全_7张最新有创意好看的早上好问候动画表情图片 暖心的早安问候祝福动态图片表情大全...
  15. 匹配滤波器的仿真——原理说明与仿真
  16. Strategy(策略)
  17. 富爸爸穷爸爸第二章的思考
  18. PIC16F887 单片机 灯光控制系统 PROTEUS 基于单片机的灯光控制系统
  19. 《R数据科学》学习笔记|Note5:使用dplyr进行数据转换(下)
  20. Android热更新

热门文章

  1. HDU-2159 FATE 二维背包
  2. java:蓝桥杯,矩形面积交
  3. css怎么使元素绝对定位有过度效果_小猿圈web前端讲解div+css绝对定位和相对定位...
  4. C语言程序练习- L1-040 最佳情侣身高差 (10分)
  5. 中级统计师基础知识中计算机,【2014年中级统计师《统计基础理论及相关知识》预习:计算机操作系统】- 环球网校...
  6. int*类型和int类型_mysql8.0.19中在navicat客户端中int、bigint等类型设置长度保存后为0...
  7. linux下什么文件不能修改,Linux和Unix下root也不能修改文件与目录的命令
  8. 微信支付H5支付开发文档
  9. 现代3D图形编程学习-关于本书(译)
  10. JS实现全选、反选、不选