操作系统系列七 —— 装载

本文深入探讨了程序从磁盘装载到内存的过程,包括进程虚拟地址空间的概念、静态与动态装载的区别,以及页映射机制。同时,还介绍了如何通过页映射创建进程虚拟地址空间,并实现可执行文件的装载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

往期地址:

本期主题:
装载



0.前言

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

1.进程虚拟地址空间

程序和进程的概念:

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

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

2.装载方式

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

1.页映射

页映射就是将 内存和磁盘中的数据、指令 按照 页(page) 为单位划分成若干个。硬件规定的页大小有 4K、8K、2M、4M等。
假设一个程序所有指令和数据总和为32KB,那程序会总共被分为8个页,同时又只有16KB的物理内存,肯定是没办法将32KB的内容同时装入的,因此就有一个页映射的过程,需要用哪个就装载哪个。
如下图所示:可执行文件的 P0、P1、P2、P6程序页被装载在物理内存中。
![可执行文件与物理地址映射](https://img-blog.csdnimg.cn/fd4e0d404b3f4cd684ccbfed8b2014f6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rWq55-i5p2C6LCI,size_19,color_FFFFFF,t_70,g_se,x_16

3.进程的创建

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值