五、可执行文件的装载与进程

每个进程运行起来之后,将拥有自己的虚拟地址空间,大小由CPU位数决定。硬件决定了地址空间的最大理论上限,即硬件的寻址空间大小,比如32位的决定虚拟地址空间为4GB。

1. 进程的建立(操作系统层面)

  • 创建一个独立的虚拟地址空间。
    实际是创建虚拟空间到物理空间的映射所需的数据结构。
  • 读取可执行文件头,建立虚拟空间与可执行文件的映射关系。
    程序执行发生页错误时,操作系统将分配一个物理页,然后将“缺页”从磁盘读到内存中,再设置缺页的虚拟页和物理页的映射关系。这时操作系统应当知道缺页在可执行文件中的哪一处。
  • 将CPU指令寄存器设置成可执行文件入口,启动执行。
    将控制权转交给进程。

上述步骤执行完之后,可执行文件的指令和数据都没有装入内存中,只是建立了两层映射关系。通过页错误处理,操作系统为进程分配相应的物理页面来满足进程需求。

2. 可执行文件链接视图和执行视图

可执行文件包含多个段,一对一映射到进程虚拟空间的话,会产生空间浪费的问题(页长度的整数倍)。而操作系统实际并不关心段的内容,只关心一些跟装载相关的问题,主要是段的权限(可读、可写、可执行),为了减少浪费,对于相同权限的段,把它们合并到一起当作一个段映射。

“Segment”和“Section”就是从不同的角度划分同一个文件。“Section”是链接视图(Linking View),从链接的角度分段;“Segment”是执行视图(Execution View),从执行的角度分段。一般来说,“Segment”的段数小于“Section”的段数。

可执行文件和共享库文件都有一个程序表头(Program Header Table)用来保存“Segment”的信息,目标文件不需要装载,所以没有。

3.小结

操作系统通过给进程空间划分一个个VMA来管理进程的虚拟空间;基本原则是将相同权限的映射成一个VMA。一个进程基本可以分为如下几个VMA:

  • 代码VMA,可读可执行,有映像文件(可执行文件装载时被映射的虚拟空间,所以也叫映射文件)。
  • 数据VMA,可读写可执行,有映像文件。
  • 堆VMA,可读写可执行,无映像文件;匿名,向上拓展。
  • 栈VMA, 可读写不可执行,无映像文件;匿名,向下拓展

你可能感兴趣的:(五、可执行文件的装载与进程)