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 可执行文件结构与进程结构

    Linux可执行文件结构 在 Linux 下,程序是一个普通的可执行文件,以下列出一个二进制可执行文件的基本情况: 可以看出,此可执行文件在存储时(没有调入到内存前)分为代码区(text).数据区(d ...

  2. 《Linux系统编程:Linux 可执行文件结构与进程结构》

    Linux可执行文件结构 在 Linux 下,程序是一个普通的可执行文件,以下列出一个二进制可执行文件的基本情况: 可以看出,此可执行文件在存储时(没有调入到内存前)分为代码区(text).数据区(d ...

  3. Windows进程与线程学习笔记(一)—— 进程结构体

    Windows进程与线程学习笔记(一)-- 进程结构体 进程结构体 EPROCESS +0x000 Pcb : _KPROCESS +0x1b0 Peb : Ptr32 _PEB 练习 解题步骤 第一 ...

  4. 【Linux系统编程】进程内存模型

    00. 目录 文章目录 00. 目录 01. Linux可执行程序结构 02. Linux进程结构 03. 存储类型总结 04. 附录 01. Linux可执行程序结构 在 Linux 下,程序是一个 ...

  5. linux内核 current当前进程指针 task_struct结构介绍

    尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 <asm/current.h> 中定义 ...

  6. 【Linux 内核】进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )

    文章目录 一.task_struct 结构体 二.task_struct 结构体代码示例 一.task_struct 结构体 在 Linux 操作系统 中 , 进程 作为 调度的实体 , 需要将其抽象 ...

  7. linux 进程管理 ppt,Linux内核结构与进程管理.ppt

    Linux内核结构与进程管理.ppt Linux 内核结构与进程管理,Linux系统结构Linux kernel 开放源代码的linux操作系统内核,目前版本为2.6,Linux内核组成1. 进程调度 ...

  8. linux 环境下的进程间的通信——消息队列传输结构体

    linux 环境下的进程间的通信方式主要有:管道,有名和无名管道, 这种方式适用于具有亲缘关系的进程之间的通信: 信号: 消息队列: 共享内存: 信号量: 套接字: 这次主要涉及消息队列: 1. 需要 ...

  9. linux 源码目录结构 文件系统目录结构

    学习Linux也有一段时间了,具体来整理一下Linux源码的目录结构和文件系统的目录结构,以便加深记忆. 一.Linux源码的目录结构 首先上一张截图,如下所示: 再看各个文件的介绍,借用一下其他资源 ...

  10. 蓝桥云课linux入门4:目录结构及文件基本操作

    目录 1.内容 2.Linux目录结构 2.1 FHS标准 2.2 目录路径 路径 绝对路径 相对路径 3.Linux文件的基本操作 3.1新建 新建空白文件 新建目录 3.2复制 复制文件 复制目录 ...

最新文章

  1. 《剑指offer》数组中出现次数超过一半的数字
  2. [转载].NET平台微服务项目汇集
  3. python中的array函数作用_Python中的Array | 数组2(简介和功能)
  4. leetcode题库:2.两数相加
  5. 移动互联网新协议 GTP 中被曝多个高危漏洞,影响4G和5G 用户
  6. async spring 默认线程池_Spring定时任务高级使用篇
  7. 抢先式多线程网络蜘蛛
  8. e-mobile服务器地址显示无法登陆,E-Mobile服务器安装设置手册.doc
  9. php 图片木马检测
  10. pdf编辑软件哪个好
  11. kermit的安装和配置
  12. 漏洞扫描原理及X-Scan使用
  13. HQL和Criteria
  14. 网络社区中的相关概念
  15. 【图解数据结构与算法】数据结构与算法知识点整理 Data Structures and Algorithms
  16. rockbox主题包安装_WaveCN.com - 站长手记 - 站长手记 - Rockbox Utility介绍及Rockbox快速安装简介...
  17. 架构分析:「转转云平台」的 Kubernetes 实践
  18. 网络摄像头python_Python OpenCV 调用网络摄像头
  19. 远程控制电脑----向日葵(下载安装教程)
  20. APP崩溃以及为什么会出现崩溃

热门文章

  1. jsp和servlet面试题
  2. 百科不全书之Python进阶
  3. java 图片合并成pdf_Java多张图片合成PDF
  4. STM32解析SBUS信号例程详解
  5. 快递100快递公司编码表
  6. 超强免费OCR文字识别工具推荐
  7. 这12款开源数据分析应用软件值得关注
  8. vcpkg快速入门手册
  9. Python人脸识别考勤打卡系统
  10. 用计算机模拟宇宙,科学家尝试利用计算机模拟整个宇宙的演化