MMU 以及 TLB
MMU 以及 TLB
MMU(Memory Management Unit)内存管理单元:
一种硬件电路单元负责将虚拟内存地址转换为物理内存地址
所有的内存访问都将通过 MMU 进行转换,除非没有使能 MMU。
TLB(Translation Lookaside Buffer)转译后备缓冲器: 本质上是 MMU 用于虚拟地址到物理地址转换表的缓存

这样一种架构,其最终运行时目的,是为主要满足下面这样运行需求:

多进程并发同时并发运行在实际物理内存空间中,而 MMU 充当了一个至关重要的虚拟内存到物理内存的桥梁作用。
那么,这种框架具体从高层级的概念上是怎么做到的呢?事实上,是将物理内存采用分片管理的策略来实现的,那么,从实现的角度将有两种可选的策略:
固定大小分区机制
可变大小分区机制
固定大小区片机制
通过这样一种概念上的策略,将物理内存分成固定等大小的片:
每一个片提供一个基地址
实际寻址,物理地址=某片基址+虚拟地址
片基址由操作系统在进程动态运行时动态加载

这种策略实现,其优势在于简易,切换快速。但是该策略也带来明显的劣势:
内部碎片:一个进程不使用的分区中的内存对其他进程而言无法使用
一种分区大小并不能满足所有应用进程所需。
可变大小分区机制
内存被划分为可变大小的区块进行映射交换管理:
需要提供基址以及可变大小边界,可变大小边界用于越界保护。
实际寻址,物理地址=某片基址+虚拟地址

那么这种策略其优势在于没有内部内存碎片,分配刚好够进程所需的大小。但是劣势在于,在加载和卸载的动态过程中会产生碎片。
分页机制
分页机制采用在虚拟内存空间以及物理内存空间都使用固定大小的分区进行映射管理。

从应用程序(进程)角度看内存是连续的 0-N 的分页的虚拟地址空间。
物理内存角度看,内存页是分散在整个物理存储中
这种映射关系对应用程序不可见,隐藏了实现细节。
分页机制是如何寻址的呢?这里介绍的设计理念,具体的处理器实现各有细微差异:
虚拟地址包含了两个部分:虚拟页序号 VPN(virtual paging number)以及偏移量
虚拟页序号 VPN是页表(Page Table)的索引
页表(Page Table)维护了页框号(Page frame number PFN)
物理地址由PFN::Offset进行解析。
举个栗子,如下图所示:

还没有查到具体的物理地址,憋急,再看一下完整解析示例:

如何管理页表
对于 32 位地址空间而言,假定 4K 为分页大小,则页表的大小为 100MB,这对于页表的查询而言是一个很大的开销。那么如何减小这种开销呢?实际运行过程中发现,事实上只需要映射实际使用的很小一部分地址空间。那么在一级页机制基础上,延伸出多级页表机制。
以二级分页机制为例:

单级页表已然有不小的开销,查询页表以及取数,而二级分页机制,因为需要查询两次页表,则将这种开销再加一倍。那么如何提高效率呢?其实前面提到一个概念一直还没有深入描述 TLB,将翻译工作由硬件缓存 cache,这就是 TLB 存在的意义。
TLB 将虚拟页翻译成 PTE,这个工作可在单周期指令完成。
TLB 由硬件实现
完全关联缓存(并行查找所有条目)
缓存索引是虚拟页码
缓存内容是 PTE
则由 PTE+offset,可直接计算出物理地址
TLB 加载
谁负责加载 TLB 呢?这里可供选择的有两种策略:
由操作系统加载,操作系统找到对应的 PTE,而后加载到 TLB。格式比较灵活。
MMU 硬件负责,由操作系统维护页表,MMU 直接访问页表,页表格式严格依赖硬件设计格式。
总结一下
从计算机大致发展历程来了解内存管理的大致发展策略,如何衍生出
MMU,以及固定分片管理、可变分片管理等不同机制的差异,最后衍生出单级分页管理机制、多级分页管理机制、TLB
的作用。从概念上相对比较易懂的角度描述了 MMU 的诞生、机制,而忽略了处理器的具体实现细节。作为从概念上更深入的理解 MMU
的工作机理的角度,还是不失为一篇浅显易懂的文章。
MMU 以及 TLB的更多相关文章
- MMU和TLB
MMU和TLB 记得那家芯片公司给我电话面试的时候,别的都还好,可是他问我什么是MMU,我只能干瞪眼.今天在看<Linux内核源码(陈莉君)>的时候,无意中看到第二章内存地址这一节,学习如 ...
- 第七章 内存管理单元MMU介绍
7.1 内存管理单元MMU介绍 7.1.1 S3C2410/S3C2440 MMU特性 负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查 特性: 与ARM V4兼容的映射长度.域.访问权 ...
- 转 s3c2440硬件学习----内存管理单元MMU
本篇基本是韦东山书上的 一.内存管理单元MMU介绍 内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查.MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访 ...
- JZ2440 裸机驱动 第7章 内存管理单元MMU
本章目标: 了解虚拟地址和物理地址的关系: 掌握如何通过设置MMU来控制虚拟地址到物理地址的转化: 了解MMU的内存访问权限机制: 了解TLB.Cache.Write ...
- MMU解读
转:https://blog.csdn.net/yueqian_scut/article/details/24816757 mmu页表也是放在内存中,mmu里有一个寄存器存放页表首地址,从而找到页表( ...
- 初识virtual memory
一.先谈几个重要的东西 virtual memory是一个抽象概念,书上的原文是"an abstraction of main memory known as virtual memory& ...
- CE STEPLDR
作用:初始化CPU.内存.Flash,复制EBoot到内存并跳入EBoot中运行. 原理:S3C2416有 8-KB 的steppingstone(暂时翻译为垫脚石),在Nand启动模式下可把Nand ...
- KVM 介绍(2):CPU 和内存虚拟化
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- KVM 内存虚拟化
内存虚拟化的概念 除了 CPU 虚拟化,另一个关键是内存虚拟化,通过内存虚拟化共享物理系统内存,动态分配给虚拟机.虚拟机的内存虚拟化很象现在的操作系统支持的虚拟内存方式,应用程序看到邻近的内存 ...
随机推荐
- Cesium源码剖析---Clipping Plane
之前就一直有写博客的想法,别人也建议写一写,但一直没有动手写,自己想了一下原因,就一个字:懒.懒.懒.为了改掉这个毛病,决定从今天开始写博客了,一方面对自己掌握的知识做一个梳理,另一方面和大家做一个交 ...
- tep0.9.5支持自定义扩展request
tep0.9.5更新了以下内容: 自定义request请求日志 Allure报告添加request描述 猴子补丁扩展request fixtures支持多层级目录 FastAPI替代Flask 升级t ...
- golang中的go get命令
### 下载指定版本 go get k8s.io/klog@v1.0.0 go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装. 这个命令在内部实际上分成了两 ...
- APC 篇——备用 APC 队列
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- Device or resource busy
格式化磁盘显示忙碌,如何解决呢? [root@jp33e503-11-8 ~]# mkfs.xfs /dev/sdc mkfs.xfs: cannot open /dev/sdc: Device or ...
- dp学习(三)
dp优化(一) 10. 状压dp 11. 倍增优化dp 12. 单调队列优化 13. 决策单调性优化(四边形不等式优化) 14. 斜率优化 15. 数据结构优化
- Spring @SessionAttributes注解 @ModelAttribute注解
一.@SessionAttribute详解 如果多个请求之间需要共享数据,就可以使用@SessionAttribute. 配置的方法: 在控制器类上标注@SessionAttribute. 配置需要共 ...
- 用最笨的方法实现java控制台日历打印
如果想用户自定义输入日期查询,可以通过Calendar的set方法和Scanner方法设置 Calendar类简单使用:https://blog.csdn.net/weixin_43670802/ar ...
- 微信小程序开发提升效率
http://www.ifanr.com/minapp/790017 微信小程序的 API 实现需要兼顾方方面面,所以仍然使用 callback 写法. 众所周知,Callback-Hell(回调地狱 ...
- Selenium对应版本
下面是谷歌浏览器与chromedriver的版本对应关系,供参考: ChromeDriver v2.45 (2018-12-10)----------Supports Chrome v70-72Chr ...