往期地址:

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

本期主题:
装载


装载

  • 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下是这么做分配的:

高地址1GB为kernel space,低地址3GB为userspace

2.装载方式

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

1.页映射

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

3.进程的创建

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

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

操作系统系列七 —— 装载相关推荐

  1. ONNX系列七 --- 在Python中使用可移植的ONNX AI模型

    目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...

  2. Web前端开发人员和设计师必读文章推荐【系列七】

    这篇文章主要收录了十二月份发布在梦想天空的优秀文章,特别推荐给Web开发人员和设计师阅读.梦天空博客关注前端开发技术,展示最新 HTML5 和 CSS3 技术应用,分享实用的 jQuery 插件,推荐 ...

  3. Docker系列 七. Docker 安装Jenkins

    Docker系列 七. Docker 安装Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集 ...

  4. 深入剖析Redis系列(七) - Redis数据结构之列表

    前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...

  5. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 参考文章: (1)Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 (2)https://www.cnblogs.com/ ...

  6. 数学之美 系列七 -- 信息论在信息处理中的应用

    数学之美 系列七 -- 信息论在信息处理中的应用 http://googlechinablog.com/2006/05/blog-post_25.html 我们已经介绍了信息熵,它是信息论的基础,我们 ...

  7. 来自极客标签10款最新设计素材-系列七

    为什么80%的码农都做不了架构师?>>>    日期:2013-5-27  来源:GBin1.com 本周我们推荐来自极客标签社区带来的10款免费设计素材,大家可以在这里免费下载你需 ...

  8. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

    SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Si ...

  9. Exchange Server2013 系列七:客户端访问服务器高可用性部署实战

    Exchange Server2013 系列七:客户端访问服务器高可用性部署实战 杜飞 在前面的文章中我们介绍了客户端访问服务器的高可用性技术,从这篇文章开始,我们就来看一个详细的高可用性部署方案. ...

最新文章

  1. lnmp架构——架构理解
  2. 基本数据结构和算法回顾
  3. vsftpd下错误之:500 OOPS
  4. 【Linux】一步一步学Linux——gdb命令(258)
  5. 俊鸟的数据输入校验专题(三) WPF 的五种输入校验概述
  6. 导入别的项目到我的eclipse上出现红色感叹号问题解决方案
  7. 对于下一代互联网的畅想
  8. Zend Framework(一)概述介绍
  9. php mongodb排序查询,Mongodb 如何按照内嵌文档的某个字段排序?
  10. python 读取 Excel 文件的方法 csv.reader
  11. Fast-SCNN:多分支结构共享低级特征的语义分割网络
  12. manjaro软件源报错 不停看到错误 “PackageName: signature from “User <email@archlinux.org>“ is invalid“ 的几种解决方法
  13. sql 触发器嵌套条件_SQL Server中的嵌套触发器
  14. 一个计算机自动作图程序
  15. DNS反劫持的几种方式
  16. PHP 并发场景的几种解决方案
  17. 系统运维工程师的法宝:python paramiko
  18. 从零开始:微信小程序零基础入门宝典
  19. Best Time to Buy and Sell Stock I II III IV (第四周 动态规划)
  20. 微软 2018 开源大事记

热门文章

  1. DIVI主题很快吗?
  2. 精彩亮点抢先看!华为伙伴暨开发者大会2022亮点不容错过
  3. Android 电话的反射调用机制实现自动接听电话
  4. 真实!八大最辛苦的公务员岗位
  5. 自学xml的几个例子
  6. CMakeList常用变量
  7. python百度翻译urllib_python爬虫入门--用urllib实现百度翻译-Go语言中文社区
  8. 【Unity入门】资源包导入和导出
  9. 爬虫实战操作(2)—— 新浪新闻内容细节
  10. 【论文阅读】Lora