Linux可执行文件与进程的虚拟地址空间

article/2025/1/13 13:23:37

作者简介:

本文由西邮陈莉君教授研一学生贺东升编辑,梁金荣、张孝家校对

建议结合之前的《linux的内存寻址方式》看。

Linux可执行文件与进程的虚拟地址空间

一个可执行文件被执行的同时也伴随着一个新的进程的创建。Linux会为这个进程创建一个新的虚拟地址空间,然后会读取可执行文件的文件头,建立虚拟地址空间与可执行文件的映射关系,然后将CPU的指令指针寄存器设置成可执行文件的入口地址,然后CPU就会从这里取指令执行。

一个可执行文件包含可被CPU执行的指令和待处理的数据,上CPU之前,指令和数据全部被翻译成成二进制的形式。在可执行的文件的内部,划分出了一些专门的段,如代码段,数据段,BSS段等。代码段中存放的是可执行的二进制指令,数据段存放初始化过的变量,BSS段存放未初始化的变量,从装载的角度,把这些段称为segment。

32位的虚拟地址空间

64位的虚拟地址空间


Proc目录下的进程虚拟地址空间布局

Linux在装载可执行文件的时候,会将这些segment映射到进程的地址空间中。映射的时候,这里面的segment会对应一个VMA。Linux将进程虚拟地址空间中的一个段叫做虚拟内存区域(VMA)。在/proc目录下,可以查看一个进程的虚拟地址空间,通过命令

cat /proc/pid/maps

这里面的每一行都对应一个VMA,每一个VMA都通过vm_area_struct结构体来描述。结构体中的vm_start和vm_end是VMA的起始地址和结束地址,还有其他的一些域来描述VMA的权限等。我们需要关注的是前三个VMA,这是ELF可执行文件的segment映射过来的。可以看到,这里面并没有标明哪个是TEXT段,哪个是DATA段和BSS段。但是可以发现,前三个VMA的权限都不一样。

虚拟地址空间存储区的分布

所以,操作系统实际上并不关心可执行文件各个段所包含的的实际内容,OS只关心一些跟装载相关的问题,最主要的是段的权限(可读,可写,可执行)。

ELF文件中,段的权限往往只有为数不多的几种组合,基本上就3种:

  1. 以代码段为代表的权限为可读可执行的段

  2. 以数据段和BSS段为代表的权限为可读可写的段

  3. 以只读数据段为代表的权限为只读的段

ELF可执行文件中有两个概念,分别是段(segment)和节(p)。通过readelf -S name.elf可以查看ELF可执行文件的节头表,这里面有所有节的信息

在将目标文件链接成可执行文件的时候,链接器会尽量把相同权限属性的段分配在同一空间。比如可读可执行的段都放在一起,这种段的典型是代码段;可读可写的段都放在一起,这种段的典型是数据段。在ELF中,把这些属性相似的,又连在一起的段叫做一个“segment”,而系统正是按照“segment”而不是“p”来映射可执行文件的。

可以使用命令 readelf -l name.elf来查看ELF的段。在ELF的程序头表,保存着segment的信息

最下面是是段与节的归属关系:

可以看到这个可执行文件中共有9个segment。从装载的角度看,我们只关心两个“LOAD”型的segment,因为只有它是需要被映射的,其他诸如“NOTE”,"GNU_STACK"都是在装载时起辅助作用的。下面的0到8分别对应着上面的一个segment,两个LOAD类型的segment分别对应着02和03,可以看到每个LOAD类型的segment里面都包含了许多的p。

ELF将相同或者相似属性的p合并为一个segment并映射到一个VMA中,是为了减少页面内部碎片,以节省内存空间的使用。因为在有了虚拟存储机制以后,装载的时候采用页映射的方式。Intel系列的处理器,页尺寸最小是4096个字节,也就是4KB。当写的程序很小的时候,每个p可能只有几十或者几百个字节,如果每个p都占用一个页的话,对内存的浪费是海量的。所以在将目标文件链接成可执行文件的时候,链接器会尽量把相同或相似权限属性的p分配在同一空间,在程序头表中,将一个或多个属性类似的p合并为一个segment,然后在装载的时候,将这个segment映射到进程虚拟地址空间中的一个VMA中。

ELF可执行文件与进程虚拟地址空间的映射关系

很明显,属性相同或相似的p会被归类到一个segment,并且被映射到同一个VMA。

总的来说,“segment”和“p”是从不同的角度来划分同一个ELF文件。这个在ELF文件中被称为不同的视图(view),从p的角度来看ELF文件就是链接视图(Linking View),从segment的角度来看就是执行视图(Execution View)。当我们在谈到ELF装载时,段专门指segment,而在其他的情况下,段指的是p。

在实际的映射过程中,只发现有代码段映射的VMA,有数据段映射的VMA,却没有BSS段映射的VMA。

如果仔细观察程序头表,查看两个LOAD型的segment,会发现一些映射的细节。

FileSiz表示segment在ELF文件中所占的大小,MemSiz表示segment在进程虚拟地址空间中所占的大小。可以发现,MemSiz比FileSiz多出了0x20个字节,十六进制的20对应的十进制是32。再来看一下这个ELF可执行文件中BSS段的大小。

可以看到,BSS段的大小正好是十进制的32,。这说明在实际映射的时候,数据段在内存中所分配的空间大小超过实际的大小,超出去的这部分空间就是BSS段,并没有为BSS段进行专门的映射,这就是为什么在查看程序头表时,只看到了两个LOAD类型的段,而不是三个,BSS段已经被合并到了数据类型的段里面。

这样做的好处就是在构造ELF可执行文件时,不需要再额外设立BSS的segment了,只需把数据segment的内存扩大,那些额外的部分就是BSS。而这部分多出的BSS空间,会被全部填充为0 。在C语言中,没有初始化的全局变量和一些静态变量会被默认初始化为0 ,这就是原因,因为它们会被分配到BSS段上,被一次性初始化为0。

最后我们通过一个打印变量地址的小程序进行验证,仔细观察没有初始化的全局变量和一些静态变量的线性地址。

视频讲解

这部分内容录了一个视频,因为这是我第一次录讲解视频,没有什么经验,如果视频内容有任何问题还希望各路大神指出,不胜感激。


添加极客助手微信,加入技术交流群

长按,扫码,关注公众号


http://chatgpt.dhexx.cn/article/neTTalcl.shtml

相关文章

linux 可执行文件启动流程

linux ELF文件启动流程 一、背景 ​ 最近看了《linkers and loader》和以前学习《程序员的自我修养》,但是看了理解不是特别透,所以就想通过一个实际的案例来把了解到知识串起来,因此就想到把linux 识别和启动elf可执行文件流程梳理下&…

Linux可执行文件制作

Linux可执行文件制作 背景 测试过程中,需要针对不同的Linux系统、核心服务版本进行验证,各种环境依赖的python版本以及已安装的库存在较大差异,考虑到实际测试需求以及出差现场使用的要求,需要将测试脚本打包为可执行文件&#xf…

如何将Python程序打包成linux可执行文件

如何将Python程序打包成linux可执行文件 方法1.安装环境2.打包程序3.执行文件 方法 前段时间尝试使用Python的tkinter制作了一个简单的丑丑的图形化界面,现在想把它打包成Linux可执行文件,具体步骤如下: 1.安装环境 使用的工具是pyinstall…

linux 运行可执行文件

本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。 1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段…

从零编写linux0.11 - 第十一章 可执行文件

从零编写linux0.11 - 第十一章 可执行文件 编程环境:Ubuntu 20.04、gcc-9.4.0 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 本章目标 本章会加载并运行…

Linux可执行文件

文章目录 1. 什么是可执行文件2. 可执行文件的区别./ 表示什么?为什么是/usr/bin?总结 1. 什么是可执行文件 可执行文件指的是这个文件可以被运行.这个文件可以是一个代码文件,也可以是一个二进制文件 Linux文件系统中只有文件和目录(一切皆文件). 在Linux中,运行一个文件的…

技术人员如何创业(1)---产品及想法

不得不说这是个浮躁的社会,人人在这个社会都想暴富或者成名。在这些引诱的驱使下很多人都脱离了原来的稳定工作创业。前几天看了《中国合伙人》,故事讲到了几个大学生从校园到工作、再到创办了一个伟大的企业,这个故事更加激励了创业大军的壮…

蓝河科技10个月创立3.05亿美元的农业机器人公司

从创业构想到模式验证,仅10个月如何做到? 蓝河科技(Blue River Technology)是一家成立于2011年的农业机器人公司,总部位于硅谷,主营业务为设计、生产和销售农业机器人,农业机器人租赁业务和相关…

重新理解创业:一个创业者的途中思考

内容简介 易到用车创始人/顺为资本投资合伙人周航,首度复盘20年创业经历,全方位坦陈创业得与失。这不是一本创业成功手册,却是思想的一次出走。20年创业经历的咀嚼与反思,从战略、品牌、竞争,到流量、领导力、团队管理…

创业案例|10个月$3亿市值的农业智能科技如何实现

如何在10个月内快是实现创业从构想到模式验证,6年后以3个多亿美元成功被收购。本文是蓝河科技创始人Jorge和Lee自述,如何通过精益创业的关键三个阶段:客户问题匹配、问题方案匹配、方案市场匹配,实现了本成本试错、高效率推进的从…

计算机毕设题目推荐

计算机软件的朋友们不知道选什么题目的看过来啦👈 图片中都是做过的毕设供大家参考,有源码的哦 ps:有新颖想法的宝子们也可以留言分享一下呢 #Java毕业设计 #计算机毕业设计 #计算机毕业设计怎么做

计算机毕设题目设计与实现(论文+源码)_kaic

毕业设计(论文)题目 高校图书馆座位预约选座微信小程序设计与实现 基于防火墙的访问控制系统的设计与实现 基于区块链的农产品追溯系统设计与实现 学生公寓楼改造布线系统规划与设计 智能家居网络设计与实现“互联网”农村精准扶贫共享平台的设计与实现“智慧健康少儿成长平台”…

计算机毕设选题推荐 40个高质量项目分享【源码+论文】(二)ssm+vue

文章目录 前言 课题1 : 基于SSM与VUE的房屋出租出售系统 <br /> 课题2 :基于SSM与VUE的租房信息管理系统 <br /> 课题3 : 基于SSM与VUE的个人健康信息管理系统 <br /> 课题4 : 基于SSM与VUE的共享充电宝管理系统 <br /> 课题5 : 基于SSM的健身运动平台…

计算机毕设太简单会不会过不了 SSM公司设备管理系统 企业员工工资管理系统 公司员工工资管理系统Java

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设老哥&#x1f525; &#x1f496; Java实战项目专栏 Python实…

计算机java毕设_javaweb计算机毕设怎么做比较容易?

---计算机毕业生常见毕设 计算机毕业设计一般以网站多见 基于PHP网上留言系统JAVA打飞机游戏设计java图形图象处理系统JAVA银行帐目管理系统基于网络超市商品销售管理基于J2EE的公交查询系统JSP实验教学管理系统jsp进销存管理系统JSP网上书店系统JSP人力资源管理系统这些题目都…

计算机毕设如何做?点进来,干货分享。

该死的疫情席卷整个神州大地&#xff0c;不知道何时才是尽头&#xff0c;很多小伙伴都已经在家里开始种香菇了。面对遥遥无期的开学时间和即将面临的毕业最后一个大考&#xff08;毕业设计&#xff09;&#xff0c;心中即是期待又是无奈&#xff0c;陆陆续续在家这段时间&#…

【计算机毕设】项目数据库设计

计算机毕设系列文章目录 第一章 毕设题分析及设计 第二章 项目数据库设计 第三章 maven项目搭建 第四章 前端文件结构 第五章 后台登录功能实现 第六章 后台登出功能实现 第七章 项目功能实现 第八章 项目功能实现 第九章 项目功能实现 第十章 项目功能实现 文章目录 计算机毕…

计算机毕设系统项目说明 【源码+论文】

文章目录 1 项目下载步骤2 项目包含内容3 样例展示4 代码样例 1 项目下载步骤 &#x1f525;Hi&#xff0c;大家好&#xff0c;这里是学长开发的Java web项目系列&#xff0c;大家可以用于自己的课设或毕设。 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传…

计算机毕业设计选题推荐 40个高质量计算机毕设项目分享【源码+论文】(二)

文章目录 前言 题目1 : 基于SSM的房屋出租出售系统 <br /> 题目2 : 基于SSM的房屋租赁系统 <br /> 题目3 : 基于SSM的个人健康信息管理系统 <br /> 题目4 : 基于SSM的共享充电宝管理系统 <br /> 题目5 : 基于SSM的即动运动网站 <br />项目源码 前…

【计算机毕设】毕设题分析及设计

计算机毕设系列文章目录 第一章 毕设题分析及设计 第二章 项目数据库设计 第三章 maven项目搭建 第四章 前端文件结构 第五章 后台登录功能实现 第六章 后台登出功能实现 第七章 项目功能实现 第八章 项目功能实现 第九章 项目功能实现 第十章 项目功能实现 文章目录 计算机毕…