导读:和windows下的PE结构是一样的,安全逆向分析也需要这一块,这和云计算技术虚拟化也相关

本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。

1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段(已初始化)、从定位信息区、符号表及符号名字字符串构成,如下左图所示,经过链接后生成执行文件如下右图所示,需要说明的是1).bss段在目标文件和执行文件中并不占用文件的空间,但是它在加载时占用地址空间;2)链接后各个段在虚拟空间上的地址就确定了,并且linux下,ELF可执行文件默认从地址0x080480000开始分配。

我们知道在linux下运行一个程序只要在shell中执行 ./a.out 这个命令就OK了,剩下的事情操作系统会替我们完成。但是操作系统到底做了什么,它是怎么做的呢,接下来就来解析一下。

2、linux系统中每个程序都运行在一个进程上下文中,这个进程上下文有自己的虚拟地址空间。当shell运行一个程序时,父shell进程生成一个子进程,它是父进程的一个复制品。子进程通过execve系统调用启动加载器。加载器删除子进程已有的虚拟存储段,并创建一组新的代码、数据、堆、栈段,新的堆和栈被初始化为零。通过将虚拟地址空间中的页映射到可执行文件的页大小组块,新的代码和数据段被初始化为可执行文件的内容,最后将CUP指令寄存器设置成可执行文件入口,启动运行。

执行完上述操作后,其实可执行文件的真正指令和数据都没有别装入内存中。操作系统只是通过可执行文件头部的信息建立起可执行文件和进程虚拟内存之间的映射关系而已。现在程序的入口地址为0x08048000,刚好是代码段的起始地址。当CPU打算执行这个地址的指令时,发现页面0x8048000~0x08049000(一个页面一般是4K)是个空页面,于是它就认为是个页错误。此时操作系统根据虚拟地址空间与可执行文件间的映射关系找到页面在可执行文件中的偏移,然后在物理内存中分配一个物理页面,并在虚拟地址页面与物理页面间建立映射,最后把文件中页面拷贝到物理页面,进程重新开始执行。该过程如下图所示:

MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

3、这里比较难理解的就是这个分页机制,讲到分页机制,就不得不提linux的分段与分页机制,这也是这篇文章的重点。我们先

来看一张图:

这张图展示了虚拟地址进过分段、分页机制后转化成物理地址的简单过程。其实分段机制是intel芯片为兼容以前产品而保留下来的,然后linux中弱化了这一机制。下面我们先简单介绍一下分段机制:

分段提供了隔绝各个代码、数据和堆栈区域的机制,它把处理器可寻址的线性地址空间划分成一些较小的称为段的受保护地址空间区域。如果处理器中有多个程序在运行,那么每个程序可分配各自的一套段。此时处理器就可以加强这些段之间的界限,并确保一个程序不会通过访问另一个程序的段而干扰程序的执行。为了定位指定段中的一个字节,程序必须提供一个逻辑地址,该地址包括一个段选择符和一个偏移量。实模式下,段值还是可以看作地址的一部分,段值位XXXXh表示以XXXX0h开始的一段内存。而保护模式下,段值仅仅变成了一个索引,只想一个数据结构的一个表项,该表项中定义了段的起始地址、界限、属性等内容。cs、ds等寄存器中存的就是这个段选择符,

用段选择符中的段索引在GDT或LDT表中定位相应的段描述符,把段描述符中取得的段基地址加上偏移量,就形成了一个线性地址。

​ 得到了线性地址之后,我们再来看看分页机制如何把它转换成物理地址。处理器分页机制会把线性地址空间(段已映射到其中)划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页面上。分页与分段最大的不同之处在于分页是用来固定长度的页面(一般为4KB)。如果仅适用分段地址转换,那么存储在物理内存中的一个数据结构将包含器所有部分。但如果适用了分页,那么一个数据结构就可以一部分存储在物理内存中,而另一部分保存在磁盘中。 处理器把线性地址转换成物理地址和用于产生页错误异常的信息包含在存储与内存中的页目录和页表中。也变可看作简单的4K为单位的物理地址数组。线性地址的高20位构成这个数组的引索值,用于选择对应页面的物理基地址。线性地址的低12位给出 了页面中的偏移量。页表中的页表项大小为32位。由于只需要其中20位来存放页面的物理基地址,因此剩下的12位可用于存放诸如页面是否存在等属性信息。如果线性地址引索的页表项被标注为存在,我们就从页面中取得物理地址。如果表项中不存在,那么访问对应物理页面时就会产生异常。 ​ 页表含有2^20(1M)个表项,而每项占用4个字节。如果作为一个表来存放的话,最多将占用4MB内存。因此为了减少内存占用量,80x86适用了两级表。由此,高20位线性地址到物理地址的转换也被分成两步进行,每部适用其中10个比特。 ​ 第一级表称为页目录。它被存放在1页4k 页面中,具有2^10(1k)个4字节长度的表项。这些表项指向二级表。它们由线性地址最高10位作为引索。 第二级表称为页表,长度也是1个页面。线性地址高10位获取指向第二级页表的指针,再加上中间10位,就可以在相应页表中获得物理地址的高20位。而为地址的低12位就是线性地址的低12,这样就组成了一个完整的32位物理地址。分段、分页的整个过程可见下面这张图:

出处:http://blog.csdn.net/yu132563/article/details/79446351

以上就是良许教程网为各位朋友分享的Linux相关知识。

linux 运行文件相关推荐

  1. linux运行文件的命令

    linux运行文件的命令 自己的随记 运行c语言文件 sudo gedit test.c gcc -o test 文件名.c ./test 运行 .sh文件 首先要开启权限,再运行 chmod 777 ...

  2. linux open: permission denied,Linux运行文件出现“Permission denied”解决办法

    一.Permission denied 是指什么? Permission denied 翻译过来的意思是:权限被拒绝:相信大家都知道,文件权限是读(r).写(w).执行(x): 二.为什么会出现&qu ...

  3. linux运行文件命令

    一.文件目录操作 1.查看当前所在目录pwd 2.查看目录下文件ls -a 3.以列表形式显示目录下文件ll 4.打开目录cd(绝对路径和相对路径,如目前在根目录,有文件目录/usr/local,进入 ...

  4. linux中如何运行html文件路径问题,Linux中如何查询运行文件的全路径的方法

    在linux中,有些地方需要使用绝对路径,对于一些命令,如java.mysql等,需要使用到运行文件所在的路径,给大家介绍一个命令,来查询这个路径. which 可以通过which查询运行文件的所在路 ...

  5. linux运行run.tar.gz,linux .run 文件的制作和安装

    linux .run 文件的制作和安装 发布时间:2008-04-02 20:50:12来源:红联作者:compat 由于要安装nvidia 的驱动,所以才会遇到这个问题. 这里顺便找到.run文件的 ...

  6. Linux运行python文件出现以下错误:terminate called after throwing an instance of ‘std::runtime_error‘

    Linux运行python文件出现以下错误:terminate called after throwing an instance of 'std::runtime_error'

  7. Linux运行java的Jar文件

    前提:操作系统配置好相关的JDK环境 一. linux下运行jar包的命令 1.java -jar xxxxx.jar // 当前xshell窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗 ...

  8. linux启动sh文件命令,Linux 运行 .sh 文件的两种方法

    Linux 运行 .sh 文件的两种方法 文章作者:网友投稿 发布时间:2010-06-15 13:31:16 来源:网络 一个中等水平的Linux用户一定少不了经常执行.sh文件,当然了,你可以在图 ...

  9. linux怎样复制文件到u盘启动盘,如何让Linux运行在u盘中的启动方式

    如何让Linux运行在u盘中的启动方式.对Linux的大名如雷贯耳,可惜笔记本电脑硬盘太小,没有多余的空间另分个区来安装Linux.其实,我们可以在u盘上安装Puppy Linux,不过这是个精简版的 ...

  10. linux新建文件加入运行,linux新建文件命令是什么_网站服务器运行维护,linux,新建文件...

    win10电脑怎么调出五笔输入法_网站服务器运行维护 win10电脑调出五笔输入法的方法是:1.首先打开系统菜单,找到区域和语言选项:2.然后依次点击[其他日期.时间和区域设置].[更换输入法]:3. ...

最新文章

  1. [转载] 杜拉拉升职记——02 单相思与性骚扰
  2. 在巨头壁垒下,人工智能细分领域涌现领跑者,这是AI真正的新机遇
  3. python个人博客源码_我的使用Sanic的个人博客源码开源了!
  4. 简述网卡的作用和工作原理_凯狄简述抽芯铆钉的作用原理
  5. 专访格灵深瞳CTO赵勇:为 计算机视觉 赋予智慧的光芒
  6. Java 8 Stream的性能到底如何?
  7. iOS 自定义UIButton
  8. 【Vue2.0】— 消息订阅与发布pubsub(二十)
  9. 关于二级域名Cookie的问题及解决方法
  10. GDAL库中WFS服务中含有中文不能获取数据的问题
  11. .Net1.x转换为.Net 2.0要注意的几个问题
  12. jdk1.8 在綫英文+有道翻譯版
  13. N种方法让你的文章排版更好看
  14. 6.5编程实例-立方体透视投影
  15. 华米新一代智能可穿戴芯片2020年第四季度量产
  16. 最高法规定网络转载涉嫌侵权需担责 10月10日起施行
  17. Anaconda3、TensorFlow和keras简单安装方法(较详细)
  18. 互联网的SEDA高并发架构
  19. python学习笔记(一)PIP
  20. 如果你也有资料收集强迫症?

热门文章

  1. 目录:常用沉降预测算法
  2. PUN☀️四、服务器大厅建房解析
  3. Linux 抓包工具 tcpdump
  4. pycharm 连接SQL
  5. 营业执照在线生成_潍坊综合保税区发出全省首张覆盖四大市场主体类型的“微信秒批”营业执照...
  6. C语言常见题目汇总(不断更新)(建议收藏)
  7. 彻底弄懂TIME_WAIT 及 tcp_tw_reuse选项
  8. 封装多帧dicm图像
  9. 可变模糊集理论matlab程序,可变模糊集理论的哲学基础
  10. c语言fltk图形库,FLTK编程模型