在linux,包括很多操作系统中,虚拟内存的概念十分重要。在使用windows的过程中,我们经常会遇到“虚拟内存不足”的提示,linux中有个所谓的swap分区,包括linux和uClinux的最大区别,就是有没有MMU。那么,究竟什么是虚拟内存?什么是MMU?他们的作用分别是什么?今天的这篇文章就来普及一下这个问题。

这篇文章主要参考了以下两个网页:

一、什么是虚拟内存

在我们嵌入式的编程(以PIC为例)中,我们是没有虚拟内存的概念的,我们现在使用的PIC24FJ64GA002的片子,RAM和ROM都只有几K而已,也没有所谓的虚拟内存。

但是,当我们需要运行一个很大的程序的时候,尤其是这个游戏需要很牛X的图形界面的时候,内存肯定会消耗很大。比如大家常玩的魔兽争霸,有没有想过,这样一个准3D的程序,能够在256M内存的电脑上运行,好牛X啊。

其实,很多程序用到了非常大的内存(至少远远大于我们物理上实际的内存),包括linux中,每个进程都有3G的独立地址空间(而不是4G,感谢邢大天同学纠正我的理解错误)。那么,物理上既然没有这么多内存,我们就需要虚拟出一部分内存来——这部分虚拟的内存不是在RAM中,而是在你的外部存储器上(比如ROM,硬盘等等)。虚拟出来的这些东东,就叫做虚拟内存。

举个例子。如果我们使用的是32位的CPU,那么按道理来说,最大的能够访问的地址空间就是2的32次方,也就是

0~0xFFFFFFFF (4G)。换句话说,理论上,一个程序能够访问这么大的空间。电脑上的CPU很多是32位的,但是我们电脑的内存一般都是1-2G。多出来的那些内存怎么办?没错,这就要用到虚拟内存。

当然,事实并没有上面说的这么简单。并不是说,电脑的物理内存不够用,就把磁盘中划出一部分来当做虚拟内存——事实上,每个进程在运行的时候,都有3G的独立地址空间,这个地址空间都叫做虚拟内存。然而,虚拟内存的一部分,可以位于真正的RAM中;另一部分,可以位于外部磁盘,或者外部FLASH中。

那么,如何让0-3G的空间一部分在RAM中,一部分在其他地方呢?

二、虚拟内存运作的流程

再来看这样一个例子:大家都知道,linux中,每个进程能够分配到3G的独立内存空间。(事实上,0-3G为用户的进程空间,3G到4G是内核空间)。那么,假如我运行了一个程序,里面用到了1G的内存空间,而我板子上只有256M的RAM,操作系统会这样做:

首先,把实际的物理内存(256M)按照每4K为一个单元标号,每一个单元称为“页”。同时,把0-3G的虚拟内存也按照每4K为一个单元(页)标号。

其次,需要介绍一个规律:科学家们发现,在汇编语言的级别,如果一个地方的数据被用到,那么该数据附近的数据在接下来被用到的概率就很大;同时,如果一个地方的命令被执行,那么该命令附近的命令在接下来被执行的概率也比较大。

第三,有一个专门的数据结构来管理一种对应关系:某一页的虚拟内存可能要被用到,那么就需要找寻到该页在真正内存中的页码。该数据结构就是用来存放虚拟内存-物理内存的页的对应关系的,称为Page Tables(页表)。

那么现在的过程就是如下图:

当我的某个进程(X)开始运行的时候,首先访问图中VPFN0指向的数据。通过页表,发现该部分的虚拟内存实际上是位于PFN0区域(物理内存的开始)。那么,程序实际上访问的就是物理内存的PFN0区域。程序继续执行,需要访问VPFN3地方的数据,根据页表这个数据结构,对应的是PFN4的物理区域,于是就对PFN4进行操作。

同时,当另外一个进程(Y)开始运行的时候,首先访问VPFN1指向的数据。通过页表,发现对应物理内存中PFN4的数据。随后访问到VPFN6中的数据,根据页表,对应PFN2区域。

由此,我们也可以得出一个结论:物理内存的地址,和虚拟内存的地址实际上没什么关系。

另外一个结论是,不同的进程可能会被分配同一个物理内存(这就是传说中的共享内存,这样两个进程之间就能够通信了)

第三个结论是,不同的进程的虚拟内存,其对应的物理内存实际上没有多大关系。

三、虚拟内存流程中的问题

如果事情都像刚刚说的这么顺利,我们的工作似乎都完成了。遗憾的是,事实往往没有这么美好。最根本的一个问题是:物理内存就256M,而虚拟内存有3G。多出来的内存,怎么办?

这个问题的答案很长,今天的帖子先做一些提示,具体的机制下个周再发个帖子详细说明。

问题一,多出来的内存都是放在哪里?以什么样的形式来存在?

问题二、系统如何判断内存中的数据,哪些应该位于物理内存中,哪些应该位于外部存储器中(标准是什么)?如何将数据从物理内存中转移到外部存储器中?

问题三、如果程序用到了虚拟内存中的某些数据,这些数据没有在物理内存中,而是在外部存储器中,应该怎么办(如何知道数据位于哪里,并且如何读入数据)?

linux+mmu工作原理,虚拟内存介绍及MMU工作原理(一)相关推荐

  1. 工作描述的介绍|如何写工作描述

    工作职责描述的编写有以下五个内容: 1.工作目标:是指工作的最终目标,即大的目标方向,叙述时需要简明扼要: 2.工作职责:是围绕工作目标来确定的,要实现本岗位的工作目标就必须要负责的工作范围及承担相应 ...

  2. shell编程入门 linux解释器原理,Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对.doc...

    Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对 Shell编程入门:Linux解释器原理详细介绍使用Shell进行工作的人们对Unix/Linux下的Shell编程都很 ...

  3. SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...

  4. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  5. Linux虚拟内存介绍,以及malloc_stats和malloc_info 监控查看内存情况

    Linux虚拟内存介绍,以及malloc_stats和malloc_info 监控查看内存情况 zzhongcy 2019-04-09 10:33:08 3106 已收藏 3 分类专栏: Linux ...

  6. 网络变压器的介绍分类及工作原理

    网络变压器的介绍分类及工作原理 1.网络变压器的介绍 网络变压器也被称作"数据汞",也可称为网络隔离变压器.它在一块网络接口上所起的作用主要有两个,一是传输数据,它把PHY送出来的 ...

  7. linux中的根文件系统(rootfs的原理和介绍)

    一.什么是文件系统 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构:即在存储设备上组织文件的方法.操作系统中负责管理和存储文件 ...

  8. 浅谈linux中的根文件系统(rootfs的原理和介绍)

    转自:点击打开 linux中有一个让很多初学者都不是特别清楚的概念,叫做"根文件系统".我接触linux前前后后也好几年了,但是对这个问题,至今也不是特别的清楚,至少没法给出一个很 ...

  9. Linux进程地址空间和虚拟内存

    一.虚拟内存 先来看一张图(来自<Linux内核完全剖析>),如下: 分段机制:即分成代码段,数据段,堆栈段.每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低 ...

最新文章

  1. java 主动抛出 段错误_段错误产生的原因~
  2. android adb命令
  3. python 报错 TypeError: ‘int‘ object is not subscriptable 解决方法
  4. 具体数学第二版第三章习题(2)
  5. 大数据市场规模5年将达8000亿 交易平台忙圈地
  6. 您能看出这个生成缩略图的方法有什么问题吗?
  7. DayDayUp:三观一致必将取代血缘关系,成为新的人际纽带(博主推荐文章)
  8. 【Python教程】python函数后面有多个括号的作用
  9. Spring Boot——一种包含分页和排序参数的接收方法DEMO
  10. 外部工具连接SaaS模式云数仓MaxCompute 实战—— 数据库管理工具篇
  11. 【数据结构与算法】之深入解析“安装栅栏”的求解思路与算法示例
  12. XAML Workflow Schema
  13. android闹钟——原代码【转】
  14. 程序结束后去哪儿了?
  15. Linux 实操 —— Linux 系统性能分析
  16. centos-修改分辨率
  17. NodeJS(四)Mac下如何安装package.json里面会产生依赖项
  18. 网银支付_【成果巡礼】企业网银支付功能上线 上海全市法院再添便民新举措...
  19. 发那可g10_FANUC系统G10指令的使用.doc
  20. mysql主键约束(primary key)

热门文章

  1. 斜杆/ 反斜杠\ 下划线_ 连词符- 破折号(横线)—— 等标点符号用英语怎么说?
  2. STM32 跳转系统BootLoader
  3. GCOV的使用-测试代码覆盖率
  4. unity3D 如何提取游戏资源 (反编译)+代码反编译【P.M.出品】
  5. Java iText PDF操作
  6. phpcms v9后台编辑器增加上传音频菜单
  7. 3年前离职,写下“世界那么大,我想去看看”的女教师,现在怎么样了?
  8. 云计算需要学习什么开发语言
  9. 解决一个GAN训练过程中的报错:one of the variables needed for gradient computation has been modified by an inplace
  10. modelsim仿真时,有Hiz值或输出为红线时的一种可能原因