http://www.jianshu.com/p/e1300e7a4c48

1. 虚拟内存

在早期的计算机中,程序是直接运行在物理内存上的,程序在运行时访问的地址就是物理地址。可是,当计算机中同时运行多个程序时,就会有很多问题。

假设我们计算有128MB内存,程序A需要10MB,程序B需要100MB,程序C需要20MB。如果我们需要同时运行程序A和B,那么比较直接的做法是将内存的前10MB分配给程序A,10MB~110MB分配给B。
但这样做,地址空间不隔离,内存使用效率低,程序运行的地址不确定。

解决这个问题的办法是增加中间层,使用虚拟地址。通过某些映射的方法,将虚拟地址转换成实际的物理地址。

每个进程都有自己独立的虚拟地址空间,且每个进程只能访问自己的地址空间。

2. 分段

最开始人们使用的一种叫做分段的方法,把一段虚拟空间映射到某个物理地址空间。
比如程序A需要10MB内存,我们首先假设虚拟地址空间为0x00000000~0x00A00000,然后从实际物理内存中分配一个相同大小的物理空间0x00100000~0x00B00000,最后把这两块相同大小的地址空间一一映射。

但是分段的方法换入换出内存的都是整个程序,会造成大量的磁盘操作,严重影响速度。

3. 分页

程序的局部性原理:当一个程序在运行时,在某个时间段内,它只是频繁的用到一小部分数据。

于是人们想到了分页的方法。
基本思想是,把地址空间认为的等分成固定大小的页,由硬件决定支持多种大小的页,操作系统选择一个。
例如,如果虚拟空间有8页,每页大小由1KB,那么虚拟地址空间就是8KB。假设计算机有13条地址线,即拥有2^13的物理寻址能力,那么理论上物理空间可以多达8KB。假设,只配备了6KB的内存。

那么,我们就可以把常用的数据和代码页装载到内存中,把不常用的代码和数据保存在磁盘里,当需要的时候再把它从磁盘中读取到内存中即可。
我们把虚拟空间的页叫做虚拟页(Virtual Page),把物理内存中的页叫做物理页(Physical Page),把磁盘中的页叫做磁盘页(Disk Page)。

如果进程需要的页不在内存中时,就会触发页错误(Page Fault),硬件会捕捉到这个消息,由操作系统接管,把所需要的磁盘页,装入内存中,并建立虚拟内存与物理内存的对应关系。

4. 覆盖装入

程序执行时所需要的指令和数据必须在内存中才能正常运行。最简单的办法就是将程序运行所需要的指令和数据全都装入内存中。但很多情况下,程序所需的内存数量大于物理内存数量,而且相对于磁盘来说,内存是昂贵的,所以人们想尽各种办法,尽可能的有效利用内存。

后来研究发现,程序运行时有局部性原理,于是可以将程序最常用的部分驻留在内存中,而将一些不太常用的数据存放在磁盘里,即动态装入。

覆盖装入(Overlay)和页映射(Paging)是两种很典型的动态装载方法。

覆盖装入在虚拟存储发明之前使用比较广泛,现在几乎已经被淘汰了。覆盖装入的方法把挖掘内存潜力的任务交给了程序员,程序在编写时必须手工分割成若干块,然后编写一个小的辅助代码来管理这些模块何时应该驻留内存,何时应该被替换掉。这个小的辅助代码就是所谓的覆盖管理器(Overlay Manager)。
程序员需要手工将模块按照它们之间的调用依赖关系组织成树状结构。覆盖管理器,保证某个模块被调用时,整个调用路径上的模块都在内存中。

覆盖装入的速度比较慢,是典型的用时间换空间的方法。

5. 页映射

与覆盖装入类似,页映射也不是一下子就把程序的所有数据和指令都装入内存,而是将内存和所有磁盘中的数据和指令按照页(Page)为单位装载和操作。

由于页映射包含操纵系统对页错误的自动处理,可执行文件的装载和执行就简化了,
(1)创建一个具有独立虚拟地址空间的进程
实际上并没有分配空间,而是创建一个页映射函数,将虚拟地址页映射到物理地址页。这些映射关系也可以等到后面程序发生页错误的时候再进行设置。

(2)读取可执行文件头,建立虚拟地址空间与可执行文件的映射关系
这一步所作的是虚拟空间与可执行文件的映射关系。当程序执行发生页错误时,操作系统将从物理内存中分配一个物理页,然后将该“缺页”从磁盘中读取到内存中,再设置缺页的虚拟页和物理页的映射关系,这样程序才得以正常运行。
所以,当操作系统捕获到缺页错误时,它必须知道程序当前所需要的页在可执行文件中的哪一个位置,这就是虚拟空间与可执行文件之间的映射关系。

与可执行文件各个段对应的,Linux中将虚拟空间划分为了相应的段,成为虚拟内存区域(VMA),在Windows中叫做虚拟段(Virtual Section)。
例如:代码VMA,数据VMA,堆VMA,栈VMA

(3)将CPU的指令寄存器设置成可执行文件的入口地址,启动运行
操作系统通过设置CPU的指令寄存器将控制权转交给进程,由此进程开始执行,这个入口地址一般是代码段VMA的起始地址。

注:
当CPU打算执行这个地址的指令的时候,发现此页面是一个空白页,于是它就认为这是一个页错误,CPU将控制权交给操作系统,操作系统有专门的页错误处理例程来处理这种情况,操作系统查找虚拟页与可执行文件页之间的映射关系,计算出相应页面在可执行文件中的偏移,然后在物理内存中分配一个物理页面,将虚拟页与分配的物理页建立映射,再把控制权返还给进程,进程从刚才页错误的位置重新开始执行。

[OS] 可执行文件的装载的更多相关文章

  1. 第七周 linux如何装载和启动一个可执行文件

    潘恒 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验内容 1.预处理. ...

  2. gcc 优化选项 -O1 -O2 -O3 -Os 优先级

    http://hi.baidu.com/xiaole10368/item/7cea9b1369cc240db88a1a5c 少优化->多优化: O0 -->> O1 -->&g ...

  3. 《Linux内核分析》第七周学习总结 可执行程序的装载

    第七周.可执行程序的装载 一.可执行程序是如何产生的? (1).c文件gcc汇编形成.s和.asm汇编代码: (2)汇编代码经过gas变成.o目标文件: (3)目标文件变成可执行文件: (4)可执行文 ...

  4. Linux第七周学习总结——可执行程序的装载

    Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

  5. linux内核分析 第七周 Linux内核如何装载和启动一个可执行程序

    一.编译链接的过程和ELF可执行文件格式 vi hello.c gcc -E -o hello.cpp hello.c -m32 //预处理.c文件,预处理包括把include的文件包含进来以及宏替换 ...

  6. 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

    学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...

  7. 程序装载:“640K内存”真的不够用么?

    本文源于size_t的说明,看到比尔盖茨说过:640K内存对于任何人来说都足够了,所以找了一篇文章,学习一下~~ 一直以来都知道自己有关计算机底层的知识不是不扎实,前段时间跟着大佬们推荐在[极客时间] ...

  8. Linux Process Virtual Memory

    目录 . 简介 . 进程虚拟地址空间 . 内存映射的原理 . 数据结构 . 对区域的操作 . 地址空间 . 内存映射 . 反向映射 .堆的管理 . 缺页异常的处理 . 用户空间缺页异常的校正 . 内核 ...

  9. Linux LSM(Linux Security Modules) Hook Technology

    目录 . 引言 . Linux Security Module Framework Introduction . LSM Sourcecode Analysis . LSMs Hook Engine: ...

随机推荐

  1. PAT L2-014【二分】

    思路: 最后发现对当前列车比我大的编号的栈有没有就好了,所以开个vector存一下,然后二分一下vector找一下第一个比我大的数就好了 #include <bits/stdc++.h> ...

  2. 使用 PHPMailer 发送邮件出现诡异bug,间歇性发送失败

    场景 使用PHPMailer的SMTP发送邮件,用的是腾讯企业邮箱 smtp.exmail.qq.com 在邮箱设置里看到配置smtp方法 问题描述 本地windows开发环境发送邮件100%成功 远 ...

  3. 大融合——LCT维护子树信息

    题目 [题目描述] 小强要在 $N$ 个孤立的星球上建立起一套通信系统.这套通信系统就是连接 $N$ 个点的一个树.这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够联通的树 ...

  4. HTTP/TCP协议基础

    HTTP协议 基本概念 HTTP协议(超文本传输协议 HyperText Transfer Protocol):是用于从WWW服务器传输超文本到本地浏览器的传送协议.它不仅保证计算机正确快速地传输超文 ...

  5. 简单的dp(dp专题)

    题目链接:https://vjudge.net/contest/216347#problem/C   Alice gets two sequences A and B. A easy problem ...

  6. leetcode--Learn one iterative inorder traversal, apply it to multiple tree questions (Java Solution)

    will show you all how to tackle various tree questions using iterative inorder traversal. First one ...

  7. superset 配置连接 hbase

    1. 简单说明 最近配置superset查询hbase, 根据网上查询到的文档和经验,成功了一次(python3.4  superset 0.20.),后边重试换各种版本就不行了.最后根据错误终于发现 ...

  8. 还不知道如何使用 IDEA ?教你三招快速掌握 IDEA

    前言 IntelliJ IDEA 是一个非常强大的 IDE,拥有许多功能.在 IDEA 中大部分功能都可以用快捷键去完成,如果掌握了大部分快捷键,可以只使用键盘开发了. ps: 最近正在练习快捷键,准 ...

  9. 2009年3月新浪PHP面试题及答案(二)

    1.请写出PHP5权限控制修饰符. 答案:private protected public. 2.对于大流量的网站,您采用什么样的方法来解决访问量问题? 答案:首先,确认服务器硬件是否足够支持当前的流 ...

  10. MS Chart 折线图——去除时间中的时、分、秒,按天统计【转】

    MS Chart 折线图——去除时间中的时.分.秒,按天统计   private void Form2_Load(object sender, EventArgs e){            str ...