简单记录一下有关MMU的一些东西
背景
引入虚拟地址的原因
(一)让APP可以以同样的链接地址来编译
举个例子,两个hello应用程序,编译后查看反汇编代码,这两个程序的起始地址都是0x80A4。于是CPU运行两个APP时,都会去0x80A4读指令,然后经过MMU转换成Addr1、Addr2。这样,不同的APP可以在任意地址,经过MMU地址转换后,在内存上是不同的地址,互不干扰。
(二)让大容量APP可以在资源少的系统上运行
在电子系统里面,内存都是有限的,无论是嵌入式系统还是电脑,比如我们的JZ2440内存就只有64M,这时假如有一个APP,需要1G的内存。应用程序执行时,不是一次性将所有代码都放入内存,而是将要运行的部分依次放入,当放入的代码指令大于64M后,会先将SDRAM里暂时用不到代码指令先置换出来,再放入需要运行的代码指令。这样尽管SDRAM很小,也可以运行内存需要很大的应用程序,而这个置换管理的工作,就是由MMU完成的。
(三)权限管理,禁止访问其它空间
不同的APP之间应该相互独立,避免APP1能直接访问到APP2,以防止APP1影响APP2。

首先是关于虚拟地址与物理地址
如果处理器咩有MMU,CPU内部执行单元所产生的地址信号经由地址总线送到芯片的引脚,这就是物理地址(PA)。如果处理器有MMU,那么同样的CPU在送地址信号到存储芯片的时候,会被MMU先截取,经由MMU翻译后,会将虚拟地址映射成物理地址在送到芯片的引脚。
举一个例子来说,我们在程序中定一个了一个变量,比如 int a = 10;,此时如果我们使用debug工具就可以看到变量 a 存放的地址为 0x10006666 ,此时的地址即为虚拟地址。如果我们使用硬件检测工具去检测 变量 a 实际在内存中的地址,我们会发现可能是 0x000080000,此时的地址即为物理地址。

其次我们需要理解一下 页 / 页表 / 页表项
前面说到 MMU 完成的是虚拟地址到物理地址的映射,那么对于映射来说,我们需要知道映射的最小单位(粒度)和映射的规则。
从VA到PA的映射最小的单位称为页,映射的最小粒度是单个虚拟页到物理页。例如 VA 的一页 0x00000000 - 0x000000ff 被映射为 PA 的一页 0x00008000 - 0x0000080ff,当我们访问的虚拟地址的0x00000000 实际对应到物理地址就是 0x00008000
页帧指的是物理内存中的一页内存,MMU 虚拟地址映射时就是寻找物理页帧的过程。
页表是用来描述MMU的映射规则,也就是 VA 的哪些页映射到 PA 的哪些页,页表的内容就是一条条记录着 PA VA 的映射关系的页表条目(PTE),这个页表保存在片外内存中,当需要映射的关系的时候就去查找这个 pte,但是这样的效率就会大大的降低,速度慢,为解决这个问题就提出了 TLB

TLB(Translation Lookaside Buffers) 转换快表简称为快表,他的作用就是类似于 cache, 可以理解为 MMU 内部专用存放页表的 cache。MMU 在接收到 VA 时,首先在 TLB 中查找,如果找到对应的 PTE 那么直接映射成 PA 。如果没有找到的话,会到外部的片外内存的页表中去查找,并记录到 TLB 中。

一般来说,处理器没有 MMU 的话,他是不可以跑 os 的,MMU 也是为了OS 中复杂的内存管理而产生的。
在系统初始时,会在内存中生成页表,然后把页表的首地址告诉MMU,以便MMU在后期映射工作的时候可以在内存中找到页表的位置。接着启动MMU,此时程序中的所有的内存地址都变成 VA ,MMU 开始自动完成查表和地址映射。在初始化的后期,创建用户进程的时候也需要用到页表,将其地址赋给进程结构体中的某个指针成员变量,也就是说每个进程都要有独立的页表。随着进程的增加,用户在创建新的进程时,子进程会拷贝父进程的页表,页表的内容逐渐更新。

简单介绍MMU和TLB相关推荐

  1. 多核处理器上的MMU和TLB

    目录 1 对多核处理器以及进程.线程的困惑 2 多核处理器上的MMU和TLB 参考文献 1 对多核处理器以及进程.线程的困惑 虽然不记得在哪个文献上看到过,但确实记得看过类似的表述:对多核处理器,同一 ...

  2. 飞腾CPU体系结构简单介绍(一)

    第一章 飞腾CPU体系结构简介 ARM体系结构是一种精简指令集体系结构RISC,具有以下基本特点:通用寄存器数量较多:采用统一寻址模式,系统主存和外设分布在CPU物理地址空间的不同范围:采用load/ ...

  3. 2021-07-13 ARM cortex三个版本A、R、M简单介绍

    ARM cortex三个版本A.R.M简单介绍 一.Cortex系列组合大体上分为三种类别.        1. Cortex-A 面向性能密集型系统的应用处理器内核 Application Proc ...

  4. 关于ARM内核经典系列ARM7/ARM9/ARM11和Cortex®-A/Cortex®-R/Cortex®-M的产品线简单介绍

    目前市场上的嵌入式单片机或者Soc大部分都是ARM的内核架构,相信大家对Cortex®-M3/Cortex®-M4,Cortex®-A53/Cortex®-A73等有所耳闻. ARM公司主要是设计处理 ...

  5. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

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

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

  7. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  8. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  9. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

最新文章

  1. python实现socket编程,服务端开启多线程(和多个客户端聊天)
  2. Python之路(第二十一篇) re模块
  3. 如何做到微信机器人不封号_微信如何做到一键群发所有群
  4. 关于bds2006里面的indy 问题!!!!!!
  5. Android中控件移动的实现
  6. PyCairo 中的变换
  7. [转] 深入理解React 组件状态(State)
  8. 突发!程序员!快别闷头学Python了!
  9. docker java 中文乱码_java使用awt包在生产环境docker部署时出现中文乱码的处理
  10. git21天打卡day3-创建仓库
  11. MySQL多库备份以及从多库备份中恢复某个库
  12. Cesium加载GeoServer发布的SHP和GeoTIFF文件
  13. 用计算机关闭无线网络连接,干货分享:打印机无线连接断开了怎么办?
  14. mac整站下载工具httrack
  15. AutoRunner学习——下载安装
  16. 使用android studio设置签名信息
  17. python合成gif动图
  18. java 加密与解密算法,简单地加密和解密算法(java实现)
  19. 虚拟机安装Windows7系统(亲测超详细)
  20. 【云原生】设备云之FlexManager边缘计算[Javascript]

热门文章

  1. Unity中物体移动方法详解
  2. monolog深度使用
  3. [附源码]Python计算机毕业设计个性化旅游线路推荐系统Django(程序+LW)
  4. 用人工智能打王者荣耀,,应该选择什么样的英雄?
  5. CTF show misc之旅 (wp详解一部分)
  6. 【特效壁纸】花卉刘海,美化一下手机
  7. 【Java实现】约瑟夫问题的Java代码实现
  8. 软件工程第一次作业:博客初体验
  9. python 图片压缩软件_python PIL 压缩图片
  10. 书院主持人 Java 方法:标记法