操作系统系列七 —— 装载

往期地址:

  • 操作系统系列一 —— 操作系统概述
  • 操作系统系列二 —— 进程
  • 操作系统系列三 —— 编译与链接关系
  • 操作系统系列四 —— 栈与函数调用关系
  • 操作系统系列五 —— 目标文件详解
  • 操作系统系列六 —— 详细解释【静态链接】

本期主题:
装载


装载

  • 0.前言
  • 1.进程虚拟地址空间
  • 2.装载方式
    • 1.页映射
  • 3.进程的创建


0.前言

我们都知道可执行程序只有装载到内存之后才能被CPU执行,装载的基本过程就是把程序从外部存储器读取到内存中的某个位置。但是随着 硬件MMU 的诞生,多进程、多用户、虚拟存储将这个过程变得十分复杂,我们就在这里将这个部分好好扒一扒。

1.进程虚拟地址空间

程序和进程的概念:

程序是一个静态的概念,其实程序就是一堆指令和数据的集合文件;
进程是一个动态概念,是程序运行时候的一个过程

每个程序运行起来之后,都将有自己独立的进程虚拟空间,这个空间的大小由硬件平台决定,CPU的位数决定了寻址空间的大小。
例如32位的CPU,决定了虚拟地址空间为 0到2^32 - 1,0x0 ~ 0xFFFF FFFF,即 4G大小;
但是程序并不能随意使用这4G虚拟空间,进程只能使用操作系统分配给进程的那些空间,如果访问了未经允许的空间,则会有"segmeation fault",以4G空间为例,linux下是这么做分配的:
操作系统系列七 —— 装载_第1张图片
高地址1GB为kernel space,低地址3GB为userspace

2.装载方式

程序执行时所需要的指令和数据必须全部在内存中才能正常运行,最简单的方式就是把所需要的全部指令和数据都装到内存中,这样程序就能运行,这是最简单的静态装入方式
但是很多情况下,程序所需要的内存数据大于物理内存数据,内存不够时,最根本的解决方法就是添加内存,但是对于磁盘来说,内存非常昂贵,后来发现程序在运行时,其实是有局部性原理,所以可以将程序最常用的部分驻留在内存中,而不太常用的数据存放在磁盘里,这就是动态装入原理

1.页映射

页映射就是将 内存和磁盘中的数据、指令 按照 页(page) 为单位划分成若干个。硬件规定的页大小有 4K、8K、2M、4M等。
假设一个程序所有指令和数据总和为32KB,那程序会总共被分为8个页,同时又只有16KB的物理内存,肯定是没办法将32KB的内容同时装入的,因此就有一个页映射的过程,需要用哪个就装载哪个。
如下图所示:可执行文件的 P0、P1、P2、P6程序页被装载在物理内存中。
操作系统系列七 —— 装载_第2张图片

3.进程的创建

从操作系统的角度看,一个进程的最关键特征就是它拥有独立的虚拟地址空间。
创建一个进程,然后装载相应的可执行文件并执行,在有虚拟存储的情况下,上述过程由以下三部分构成:

  1. 创建虚拟地址空间。由前面提到的页映射机制,我们可以知道,虚拟空间是由一组页构成,这一组页与物理空间的映射关系就是我们所关心的。因此创建一个虚拟空间实际上就是创建这个映射关系的结构体
  2. 读取可执行文件头,创建虚拟空间与可执行文件的映射关系。 前一步创建的是虚拟空间和物理空间的映射关系,这一步是要创建可执行文件与虚拟空间的映射,可执行文件地址先转成虚拟地址,然后虚拟地址经过MMU再转成物理地址
    操作系统系列七 —— 装载_第3张图片
  3. CPU指令寄存器设置成可执行文件入口,启动运行。 操作系统设置CPU的指令寄存器,将控制权转给进程,进程开始执行。

你可能感兴趣的:(计算机操作系统,操作系统)