操作系统系列七 —— 装载
往期地址:
- 操作系统系列一 —— 操作系统概述
- 操作系统系列二 —— 进程
- 操作系统系列三 —— 编译与链接关系
- 操作系统系列四 —— 栈与函数调用关系
- 操作系统系列五 —— 目标文件详解
- 操作系统系列六 —— 详细解释【静态链接】
本期主题:
装载
装载
- 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.进程的创建
从操作系统的角度看,一个进程的最关键特征就是它拥有独立的虚拟地址空间。
创建一个进程,然后装载相应的可执行文件并执行,在有虚拟存储的情况下,上述过程由以下三部分构成:
创建虚拟地址空间。
由前面提到的页映射机制,我们可以知道,虚拟空间是由一组页构成,这一组页与物理空间的映射关系就是我们所关心的。因此创建一个虚拟空间实际上就是创建这个映射关系的结构体。读取可执行文件头,创建虚拟空间与可执行文件的映射关系。
前一步创建的是虚拟空间和物理空间的映射关系,这一步是要创建可执行文件与虚拟空间的映射,可执行文件地址先转成虚拟地址,然后虚拟地址经过MMU再转成物理地址
CPU指令寄存器设置成可执行文件入口,启动运行。
操作系统设置CPU的指令寄存器,将控制权转给进程,进程开始执行。
操作系统系列七 —— 装载相关推荐
- ONNX系列七 --- 在Python中使用可移植的ONNX AI模型
目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...
- Web前端开发人员和设计师必读文章推荐【系列七】
这篇文章主要收录了十二月份发布在梦想天空的优秀文章,特别推荐给Web开发人员和设计师阅读.梦天空博客关注前端开发技术,展示最新 HTML5 和 CSS3 技术应用,分享实用的 jQuery 插件,推荐 ...
- Docker系列 七. Docker 安装Jenkins
Docker系列 七. Docker 安装Jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集 ...
- 深入剖析Redis系列(七) - Redis数据结构之列表
前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...
- Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案
Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 参考文章: (1)Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案 (2)https://www.cnblogs.com/ ...
- 数学之美 系列七 -- 信息论在信息处理中的应用
数学之美 系列七 -- 信息论在信息处理中的应用 http://googlechinablog.com/2006/05/blog-post_25.html 我们已经介绍了信息熵,它是信息论的基础,我们 ...
- 来自极客标签10款最新设计素材-系列七
为什么80%的码农都做不了架构师?>>> 日期:2013-5-27 来源:GBin1.com 本周我们推荐来自极客标签社区带来的10款免费设计素材,大家可以在这里免费下载你需 ...
- SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现
SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Si ...
- Exchange Server2013 系列七:客户端访问服务器高可用性部署实战
Exchange Server2013 系列七:客户端访问服务器高可用性部署实战 杜飞 在前面的文章中我们介绍了客户端访问服务器的高可用性技术,从这篇文章开始,我们就来看一个详细的高可用性部署方案. ...
最新文章
- lnmp架构——架构理解
- 基本数据结构和算法回顾
- vsftpd下错误之:500 OOPS
- 【Linux】一步一步学Linux——gdb命令(258)
- 俊鸟的数据输入校验专题(三) WPF 的五种输入校验概述
- 导入别的项目到我的eclipse上出现红色感叹号问题解决方案
- 对于下一代互联网的畅想
- Zend Framework(一)概述介绍
- php mongodb排序查询,Mongodb 如何按照内嵌文档的某个字段排序?
- python 读取 Excel 文件的方法 csv.reader
- Fast-SCNN:多分支结构共享低级特征的语义分割网络
- manjaro软件源报错 不停看到错误 “PackageName: signature from “User <email@archlinux.org>“ is invalid“ 的几种解决方法
- sql 触发器嵌套条件_SQL Server中的嵌套触发器
- 一个计算机自动作图程序
- DNS反劫持的几种方式
- PHP 并发场景的几种解决方案
- 系统运维工程师的法宝:python paramiko
- 从零开始:微信小程序零基础入门宝典
- Best Time to Buy and Sell Stock I II III IV (第四周 动态规划)
- 微软 2018 开源大事记