可执行文件的装载与进程


首先简单说明程序和进程的区别

程序就如同菜谱,人就如同cpu,其他厨具就如同计算机的其他硬件,整个炒菜的过程就是一个进程

进程创建过程

从操作系统的角度看,一个进程最关键的特征是拥有独立的虚拟地址空间。创建进程通常需要执行以下三个步骤:

  • 1、创建独立的虚拟地址空间
    虚拟地址空间是一组页映射函数将虚拟空间映射至物理内存,因此创建虚拟地址空间则是创建映射函数所需的数据结构,真正映射关系通常在后续的程序发送页错误再进行设置。
  • 2、读取可执行文件头,建立虚拟空间和可执行文件的映射
    需注意这与上一步是有所区别的,此处是虚拟空间与可执行文件的映射,关系入下图所示。
  • 3、将指令寄存器设置为可执行文件入口,启动运行。

                   虚拟地址空间-可执行文件-物理内存映射


在上述步骤后,执行文件的指令和数据并为加载入内存,只是通过elf文件头部信息建立起可执行文件和虚拟地址空间的映射关系而已,真正加载过程将在发生 页错误时执行(访问或者执行一个地址的指令或者数据时,但发现对应的内存区域为空),装载执行过程如下:1、内核根据上面第二步建立的映射关系,找到所需的内容在可执行文件位置2、分配一个物理内存页面,并将可执行文件内容装载到该内存页中
针对这里的装载由装载管理器或者存储管理器执行,并不是把所有的数据都加载到内存中,而是按照程序运行局部性原理将目前在用的代码或者数据装载并驻留在内存中,当前尚未用到的数据或者代码不进行装载,简单介绍两种方式,一种是 覆盖装入(已基本被淘汰,原理不多说看下面图应该就能理解),另一种是 页映射,将内存和磁盘的中的数据和代码按照页进行划分,装载则以页为单位进行。

3、建立该物理页面和虚拟地址空间的映射关系,然后把控制权交换给进程





          覆盖装载


















本文转自:

https://www.jianshu.com/p/cfbd1eaee885





猜你喜欢

转载自blog.csdn.net/u011857683/article/details/80646387