首页 > 系统相关 >MMU内存管理

MMU内存管理

时间:2024-05-07 23:24:27浏览次数:24  
标签:分段 管理 MMU 虚拟地址 分页 页表 内存

MMU内存管理

目录

1.MMU简述

MMU(Memory Management Unit,内存管理单元)是一种硬件模块,用于在CPU和内存之间实现虚拟内存管理。它的主要功能是将虚拟地址转换为物理地址,同时提供访问权限的控制和缓存管理等功能。在现代计算机系统中,MMU是非常重要的,因为它允许每个进程拥有自己的私有虚拟内存空间,而不需要了解系统的物理内存图或可能同时运行的其他程序

MMU的工作原理可以简化为以下几个步骤:

  1. CPU发出虚拟地址。
  2. MMU使用虚拟地址中的关键位来索引映射表中的条目,并确定哪个内存块被访问。
  3. 虚拟地址通过MMU转换为物理地址。
  4. 物理地址被送到内存地址总线上,完成内存访问。

MMU还包含了TLB(Translation Lookaside Buffer)和TWU(Table Walk Unit)两个子模块。TLB是一个高速缓存,用于缓存页表转换的结果,从而缩短页表查询的时间。TWU是一个页表遍历模块,页表是由操作系统维护在物理内存中,但是页表的遍历查询是由TWU完成的,这样减少对CPU资源的消耗

image

2.MMU的功能

  • 地址转换

    MMU的主要功能之一是进行地址转换。在计算机系统中,程序使用的地址是逻辑地址,而物理内存的地址是实际的硬件地址。MMU通过使用页表等数据结构,将逻辑地址转换为物理地址,使程序能够正常访问内存中的数据。

  • 虚拟内存管理
    虚拟内存是一种将物理内存和辅助存储器(如硬盘)结合起来使用的技术。MMU通过使用页表和页面置换算法,实现了虚拟内存的管理。它可以将部分程序或数据存储在硬盘上,只在需要时才将其调入内存,从而有效地扩展了可用内存的大小。

  • 内存保护
    MMU还负责实现内存的保护机制。通过使用页表中的权限位或段表中的段描述符,MMU可以对内存进行细粒度的保护。例如,它可以阻止用户程序访问操作系统的关键数据结构,从而提高系统的安全性。

  • 高速缓存管理
    现代计算机系统通常配备了多级高速缓存,用于提高内存访问的速度。MMU负责管理高速缓存中的数据,包括缓存的写入与读取,以及缓存命中与失效的处理。通过优化高速缓存的使用,MMU可以显著提高计算机系统的性能。

3.内存分段与分页

主要有两种方式,分别是内存分段和内存分页,分段是比较早提出的。

3.1内存分段

程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。

分段机制下的虚拟地址由两部分组成,段选择因子段内偏移量

image

  • 段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。
  • 虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

虚拟地址是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址,如下图:
image

如果要访问段 3 中偏移量 500 的虚拟地址,我们可以计算出物理地址为,段 3 基地址 7000 + 偏移量 500 = 7500。分段的办法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但它也有一些不足之处:

  • 第一个就是内存碎片的问题。
  • 第二个就是内存交换的效率低的问题。

3.1.1分段的不足

分段为什么会产生内存碎片的问题

我们来看看这样一个例子。假设有 1G 的物理内存,用户执行了多个程序,其中:

  • 游戏占用了 512MB 内存
  • 浏览器占用了 128MB 内存
  • 音乐占用了 256 MB 内存。

这个时候,如果我们关闭了浏览器,则空闲内存还有 1024 - 512 - 256 = 256MB。

如果这个 256MB 不是连续的,被分成了两段 128 MB 内存,这就会导致没有空间再打开一个 200MB 的程序。

image

这里的内存碎片的问题共有两处地方:

  • 外部内存碎片,也就是产生了多个不连续的小物理内存,导致新的程序无法被装载;
  • 内部内存碎片,程序所有的内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是很常使用,这也会导致内存的浪费;

针对上面两种内存碎片的问题,解决的方式会有所不同。

解决外部内存碎片的问题就是内存交换

可以把音乐程序占用的那 256MB 内存写到硬盘上,然后再从硬盘上读回来到内存里。不过再读回的时候,我们不能装载回原来的位置,而是紧紧跟着那已经被占用了的 512MB 内存后面。这样就能空缺出连续的 256MB 空间,于是新的 200MB 程序就可以装载进来。

这个内存交换空间,在 Linux 系统里,也就是我们常看到的 Swap 空间,这块空间是从硬盘划分出来的,用于内存与硬盘的空间交换。

再来看看,分段为什么会导致内存交换效率低的问题?

对于多进程的系统来说,用分段的方式,内存碎片是很容易产生的,产生了内存碎片,那不得不重新 Swap 内存区域,这个过程会产生性能瓶颈。

因为硬盘的访问速度要比内存慢太多了,每一次内存交换,我们都需要把一大段连续的内存数据写到硬盘上。

所以,如果内存交换的时候,交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿。

3.2内存分页

分段的好处就是能产生连续的内存空间,但是会出现内存碎片和内存交换的空间太大的问题。

要解决这些问题,那么就要想出能少出现一些内存碎片的办法。另外,当需要进行内存交换的时候,让需要交换写入或者从磁盘装载的数据更少一点,这样就可以解决问题了。这个办法,也就是内存分页Paging)。

分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫Page)。在 Linux 下,每一页的大小为 4KB

虚拟地址与物理地址之间通过页表来映射,如下图:

image

页是存储在内存中,由 CPU 的内存管理单元MMU) 负责映射转换的工作,这样CPU 就可以直接通过 MMU,找出要实际要访问的物理内存地址。

而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。

3.2.1分页的优势

由于内存空间都是预先划分好的,也就不会像分段会产生间隙非常小的内存,这正是分段会产生内存碎片的原因。而采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存。

如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出Swap Out)。一旦需要的时候,再加载进来,称为换入Swap In)。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。

image

3.2.2分页的映射

在分页机制下,虚拟地址分为两部分,页号页内偏移。页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址,见下图。

image

总结一下,对于一个内存地址转换,其实就是这样三个步骤:

  • 把虚拟内存地址,切分成页号和偏移量;
  • 根据页号,从页表里面,查询对应的物理页号;
  • 直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。

下面举个例子,虚拟内存中的页通过页表映射为了物理内存中的页,如下图:

image

3.2.3多级页表

因为操作系统是可以同时运行非常多的进程的,那这不就意味着页表会非常的庞大。在 32 位的环境下,虚拟地址空间共有 4GB,假设一个页的大小是 4KB(2^12),那么就需要大约 100 万 (2^20) 个页,每个「页表项」需要 4 个字节大小来存储,那么整个 4GB 空间的映射就需要有 4MB 的内存来存储页表。这 4MB 大小的页表,看起来也不是很大。但是要知道每个进程都是有自己的虚拟地址空间的,也就说都有自己的页表。那么,100 个进程的话,就需要 400MB 的内存来存储页表,这是非常大的内存了,更别说 64 位的环境了。

要解决上面的问题,就需要采用的是一种叫作多级页表Multi-Level Page Table)的解决方案。

在前面我们知道了,对于单页表的实现方式,在 32 位和页大小 4KB 的环境下,一个进程的页表需要装下 100 多万个「页表项」,并且每个页表项是占用 4 字节大小的,于是相当于每个页表需占用 4MB 大小的空间。

我们把这个 100 多万个「页表项」的单级页表再分页,将页表(一级页表)分为 1024 个页表(二级页表),每个表(二级页表)中包含 1024 个「页表项」,形成二级分页。如下图所示:

image

你可能会问,分了二级表,映射 4GB 地址空间就需要 4KB(一级页表)+ 4MB(二级页表)的内存,这样占用空间不是更大了吗?

当然如果 4GB 的虚拟地址全部都映射到了物理内存上的话,二级分页占用空间确实是更大了,但是,我们往往不会为一个进程分配那么多内存。

每个进程都有 4GB 的虚拟地址空间,而显然对于大多数程序来说,其使用到的空间远未达到 4GB,因为会存在部分对应的页表项都是空的,根本没有分配,对于已分配的页表项,如果存在最近一定时间未访问的页表,在物理内存紧张的情况下,操作系统会将页面换出到硬盘,也就是说不会占用物理内存。

如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表。做个简单的计算,假设只有 20% 的一级页表项被用到了,那么页表占用的内存空间就只有 4KB(一级页表) + 20% * 4MB(二级页表)= 0.804MB,这对比单级页表的 4MB 是不是一个巨大的节约?

那么为什么不分级的页表就做不到这样节约内存呢?我们从页表的性质来看,保存在内存中的页表承担的职责是将虚拟地址翻译成物理地址。假如虚拟地址在页表中找不到对应的页表项,计算机系统就不能工作了。所以页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有 100 多万个页表项来映射,而二级分页则只需要 1024 个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。我们把二级分页再推广到多级页表,就会发现页表占用的内存空间更少了,这一切都要归功于对局部性原理的充分应用。

对于 64 位的系统,两级分页肯定不够了,就变成了四级目录,分别是:

  • 全局页目录项 PGD(Page Global Directory);
  • 上层页目录项 PUD(Page Upper Directory);
  • 中间页目录项 PMD(Page Middle Directory);
  • 页表项 PTE(Page Table Entry);

image

参考

https://xiaolincoding.com/

https://blog.csdn.net/m0_72410588/article/details/132867095

标签:分段,管理,MMU,虚拟地址,分页,页表,内存
From: https://www.cnblogs.com/banon/p/18178676

相关文章

  • MMU相关介绍
    什么是MMUMMU即内存管理单元(MemoryManageUnit),是一个与软件密切相关的硬件部件,也是理解linux等操作系统内核机制的最困难的知识点之一。1)概述研究MMU无法绕过的一个东西就是分页内存管理机制,也就是研究——页表。页表内存放的就是虚拟地址到物理地址的转换关系,也就是虚拟地址......
  • 02-大厂电商设计解析之商品管理系统
    1雪花算法使用IdWorkeridWorker=newIdWorker(1,1);for(inti=0;i<10000;i++){longid=idWorker.nextId();System.out.println(id);}配置分布式ID生成器将IdWorker.java拷贝到util包在工程的resources下新增applicationContext-service.xml<!‐‐雪花ID生......
  • Linux系统管理-常见命令
    二、常用命令1.命令格式1、命令提示符[root@localhost~]$root:代表当前系统登录的用户名。@:分隔符。localhost:主机名。localhost是系统默认的简称,后期可以修改。~:当前所在的位置目录(最后一级目录)。$:用户提示符。$代表普通用户,#代表超级管理员。2、命令格......
  • 随笔-调试-valgrind进行内存越界检查
    valgrind进行内存越界检查valgrind--log-file='valgrind_report.log'--time-stamp=yes–track-origins=yes--tool=memcheck--leak-check=full--show-leak-kinds=all./exec–track-origins=yes:是否显示未定义的变量,在堆、栈中被定义没有被initialised的变量都被定义成o......
  • Linux系统管理-系统概述
    一、系统概述3.系统安装1.系统安装1.选择第一项installcentos7,并且设置语言,推荐使用中文,简体中文2.字符界面安装选择最小或基本网页服务器即可,接下来就是进行磁盘分区,也可以自己分配或者系统自动分配3.手动分区里面也可以让系统自动创建,或者自己手动创建4.接受分区的修......
  • 知识扩展--- MMU 将虚拟地址转换为物理地址
    MMU(内存管理单元)如何将虚拟地址转换为物理地址什么是MMU?MMU是“MemoryManagementUnit”的缩写,中文名是内存管理单元。MMU是现代计算机操作系统中的一个重要组成部分,其主要功能是将虚拟地址转换为物理地址。通过MMU,可以实现虚拟内存管理、内存保护、内存共享等功能,从而提高系......
  • MMU(内存管理单元)
    内存管理单元(MMU)MMU的概念MMU是一种硬件设备,也称为内存管理单元,它位于计算机系统的中央处理器(CPU)和内存之间,负责处理中央处理器(CPU)的内存访问请求,将实现对虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,而在较为简单的计算机体系结构中,则负责总线......
  • ###什么是Linux内核###什么是MMU
    什么是Linux内核Linux内核简介Linux®内核是Linux操作系统(OS)的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。之所以称为内核,是因为在操作系统中就像果实硬壳中的种子一样,控制着硬件(无论是电话、笔记本电脑、服务器,还是任......
  • MMU内存管理单元
      内存管理单元(MemoryManagementUnit,MMU)是计算机中的一个重要组件,负责处理CPU对内存的访问请求。MMU主要有以下几个功能:地址转换:MMU负责将逻辑地址(由CPU生成的地址)转换为物理地址(实际存储在内存中的地址)。这种地址转换是通过页表或段表等数据结构来实现的。内存保护:MM......
  • FAT32和NTFS 、Linux内核、Linux系统目录和文件目录、MMU
    了解FAT32和NTFSFAT32文件系统用4个字节(32位)空间来表示每个扇区配置文件的情形,所以叫FAT32。兼容性较好,但对但缺点是对文件大小有限制,不支持超过4GB的文件。NTFS文件系统是windowsNT文件系统。NTFS系统比FAT32的可靠性更高,可以支持更大的分区和更大的文件,此外还有不少FAT32没......