首页 > 其他分享 >MMU相关介绍

MMU相关介绍

时间:2024-05-07 23:13:51浏览次数:16  
标签:映射 MMU 虚拟地址 介绍 物理地址 内存 相关 页表

什么是MMU

MMU即内存管理单元(Memory Manage Unit),是一个与软件密切相关的硬件部件,也是理解linux等操作系统内核机制的最困难的知识点之一。

1)概述

研究MMU无法绕过的一个东西就是分页内存管理机制,也就是研究——页表。页表内存放的就是虚拟地址到物理地址的转换关系,也就是虚拟地址到物理地址的映射关系。
为了增加灵活性和节约物理内存空间(因为页表是放在物理内存中的),所以页表中并不存放虚拟地址和物理地址的对应关系,只存放物理页面的地址,MMU 以虚拟地址为索引去查表返回物理页面地址,而且页表是分级的,总体分为三个部分:一个顶级页目录,多个中级页目录,最后才是页表,逻辑结构图如下.
image

从上面可以看出,一个虚拟地址被分成从左至右四个位段。第一个位段索引顶级页目录中一个项,该项指向一个中级页目录,然后用第二个位段去索引中级页目录中的一个项,该项指向一个页表,再用第三个位段去索引页表中的项,该项指向一个物理页地址,最后用第四个位段作该物理页内的偏移去访问物理内存。这就是 MMU 的工作流程。

2)虚拟地址/物理地址

如果处理器没有MMU,CPU内部执行单元产生的内存地址信号将直接通过地址总线发送到芯片引脚,被内存芯片接收,这就是物理地址(physical address),简称PA。英文physical代表物理的接触,所以PA就是与内存芯片physically connected的总线上的信号。

如果MMU存在且启用,CPU执行单元产生的地址信号在发送到内存芯片之前将被MMU截获,这个地址信号称为虚拟地址(virtual address),简称VA,MMU会负责把VA翻译成另一个地址,然后发到内存芯片地址引脚上,即VA映射成PA,如下图:
image
所以物理地址①是通过CPU对外地址总线②传给Memory Chip③使用的地址;而虚拟地址④是CPU内部执行单元⑤产生的,发送给MMU⑥的地址。硬件上MMU⑥一般封装于CPU芯片⑦内部,所以虚拟地址④一般只存在于CPU⑦内部,到了CPU外部地址总线引脚上②的信号就是MMU转换过的物理地址①。

软件上MMU对用户程序不可见,在启用MMU的平台上(没有MMU不必说,只有物理地址,不存在虚拟地址),用户C程序中变量和函数背后的数据/指令地址等都是虚拟地址,这些虚拟内存地址从CPU执行单元⑤发出后,都会首先被MMU拦截并转换成物理地址,然后再发送给内存。也就是说用户程序运行*pA =100;"这条赋值语句时,假设debugger显示指针pA的值为0x30004000(虚拟地址),但此时通过硬件工具(如逻辑分析仪)侦测到的CPU与外存芯片间总线信号很可能是另外一个值,如0x8000(物理地址)。当然对一般程序员来说,只要上述语句运行后debugger显示0x30004000位置处的内存值为100就行了,根本无需关心pA的物理地址是多少。但进行OS移植或驱动开发的系统程序员不同,他们必须清楚软件如何在幕后辅助硬件MMU完成地址转换。

3)页/页帧/页表/页表项(PTE)

这几个页概念也噎倒了不少人,这里澄清下。MMU是负责把虚拟地址映射为物理地址,但凡"映射"都要解决两个问题:映射的最小单位(粒度)和映射的规则。

MMU中VA到PA映射的最小单位称为页(Page),映射的最低粒度是单个虚拟页到物理页,页大小通常是4K,即一次最少要把4K大小的VA页块整体映射到4K的PA页块(从0开始4K对齐划分页块),页内偏移不变,如VA的一页0x30004000~0x30004fff被映射到PA的一页 0x00008000~0x00008fff,当CPU执行单元访问虚拟地址0x30004008,实际访问的物理地址是0x00008008(0x30004008和0x00008008分别位于虚实两套地址空间,互不相干,不存在重叠和冲突)。以页为最小单位,就是不能把VA中某一页划分成几小块分别映射到不同PA,也不能把VA中属于不同页的碎块映射到PA某一页的不同部分,必须页对页整体映射。

页帧(Page Frame)是指物理内存中的一页内存,MMU虚实地址映射就是寻找物理页帧的过程,对这个概念了解就可以了。

MMU软件配置的核心是页表(Page Table),它描述MMU的映射规则,即虚拟内存哪(几)个页映射到物理内存哪(几)个页帧。页表由一条条代表映射规则的记录组成,每一条称为一个页表条目(Page Table Entry,即PTE),整个页表保存在片外内存,MMU通过查找页表确定一个VA应该映射到什么PA,以及是否有权限映射。

但如果MMU每次地址转换都到位于外部内存的页表上查找PTE,转换速度就会大大降低,于是出现了

4)TLB

TLB (Translation Lookaside Buffers)即转换快表,又简称快表,可以理解为MMU内部专用的存放页表的cache,保存着最近使用的PTE乃至全部页表。MMU接收到虚拟地址后,首先在TLB中查找,如果找到该VA对应的PTE就直接转换,找不到再去外存页表查找,并置换进TLB。TLB属于片上SRAM,访问速度快,通过TLB缓存PTE可以节省MMU访问外存页表的时间,从而加速虚实地址转换。TLB和CPU cache的工作原理一样,只是TLB专用于为MMU缓存页表。

5)MMU的内存保护功能

既然所有发往内存的地址信号都要经过MMU处理,那让它只单单做地址转换,岂不是浪费了这个特意安插的转换层?显然它有能力对虚地址访问做更多的限定(就像路由器转发网络包的同时还能过滤各种非法访问),比如内存保护。可以在PTE条目中预留出几个比特,用于设置访问权限的属性,如禁止访问、可读、可写和可执行等。设好后,CPU访问一个VA时,MMU找到页表中对应PTE,把指令的权限需求与该PTE中的限定条件做比对,若符合要求就把VA转换成PA,否则不允许访问,并产生异常。

6)多级页表

以64位的虚拟地址为例,其中CR3是CPU的一个寄存器,从图中也可以看出来用来存放顶级页目录项。所以MMU开启之后,首先就是读取CR3寄存器的内容
image

为什么采用多级页表的形式去存储页表的索引呢?
因为如果一个虚拟地址就对因一个物理地址的话,这种映射关系存储起来很占内存,同时查询速率也不高

7)操作系统和MMU

实际上MMU是为满足操作系统越来越复杂的内存管理而产生的。OS和MMU的关系简单说:

a.系统初始化代码会在内存中生成页表,然后把页表地址设置给MMU对应寄存器,使MMU知道页表在物理内存中的什么位置,以便在需要时进行查找。之后通过专用指令启动MMU,以此为分界,之后程序中所有内存地址都变成虚地址,MMU硬件开始自动完成查表和虚实地址转换。

b.OS初始化后期,创建第一个用户进程,这个过程中也需要创建页表,把其地址赋给进程结构体中某指针成员变量。即每个进程都要有独立的页表。

c.用户创建新进程时,子进程拷贝一份父进程的页表,之后随着程序运行,页表内容逐渐更新变化。比较复杂了,几句讲不清楚,不多说了哈,有时间讲linux的话再说吧

8)MMU映射失败的几种情况

  1. 访问了受内核保护的页面,或者访问了只读的页面(比如c语言中存储字符串字面量和const变量的段),此时内核会抛出段错误
  2. 页面和页框没有产生映射关系,但是数据页已经被其他进程加载到内存中了,此时只需要建立页面和页框的映射关系,称为次级缺页中断
  3. 页面和页框没有产生映射关系,数据页也没有被加载到内存中(在磁盘上),此时需要发生磁盘io从磁盘中加载页到内存中,还需要建立页面和页框的映射关系,称为严重缺页中断。

除了第一点,第二第三都会以内核降低自身运行速度来修复,也就是老师说的,通过中断形成页表映射,然后再重新执行引起中断的命令(此时数据页已经在内存中并且建立映射关系了)。

9)总结

关于MMU的工作一句话就是想办法把虚拟地址转换成物理地址,而如何正确且高效的转换就要运用到上文提到的内容了。绕来绕去最终也是回到了一个页表中找到了对印的映射关系。

相关概念讲完,VA到PA的映射过程就一目了然:image

在这个过程中,软件的工作核心就是生成和配置页表。

参考文献
硬件篇之MMU-ipmux

标签:映射,MMU,虚拟地址,介绍,物理地址,内存,相关,页表
From: https://www.cnblogs.com/eon4051/p/18178538

相关文章

  • 知识扩展--- MMU 将虚拟地址转换为物理地址
    MMU(内存管理单元)如何将虚拟地址转换为物理地址什么是MMU?MMU是“MemoryManagementUnit”的缩写,中文名是内存管理单元。MMU是现代计算机操作系统中的一个重要组成部分,其主要功能是将虚拟地址转换为物理地址。通过MMU,可以实现虚拟内存管理、内存保护、内存共享等功能,从而提高系......
  • MMU(内存管理单元)
    内存管理单元(MMU)MMU的概念MMU是一种硬件设备,也称为内存管理单元,它位于计算机系统的中央处理器(CPU)和内存之间,负责处理中央处理器(CPU)的内存访问请求,将实现对虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,而在较为简单的计算机体系结构中,则负责总线......
  • ###什么是Linux内核###什么是MMU
    什么是Linux内核Linux内核简介Linux®内核是Linux操作系统(OS)的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。之所以称为内核,是因为在操作系统中就像果实硬壳中的种子一样,控制着硬件(无论是电话、笔记本电脑、服务器,还是任......
  • 2024ICPC武汉邀请赛-G.Pack-数论分块、整除运算相关的不等式
    link:https://codeforces.com/gym/105143Groupcontests:https://codeforces.com/group/DWEH34LQgT/contest/521901题意:有\(n\)件\(A\)物品,\(m\)件\(B\)物品,两种物品价值分别是\(a,b\),若干件\(A\)和若干件\(B\)可以打包成一个商品,打包尽可能多的商品的情况下让剩余的......
  • MMU内存管理单元
      内存管理单元(MemoryManagementUnit,MMU)是计算机中的一个重要组件,负责处理CPU对内存的访问请求。MMU主要有以下几个功能:地址转换:MMU负责将逻辑地址(由CPU生成的地址)转换为物理地址(实际存储在内存中的地址)。这种地址转换是通过页表或段表等数据结构来实现的。内存保护:MM......
  • FAT32和NTFS 、Linux内核、Linux系统目录和文件目录、MMU
    了解FAT32和NTFSFAT32文件系统用4个字节(32位)空间来表示每个扇区配置文件的情形,所以叫FAT32。兼容性较好,但对但缺点是对文件大小有限制,不支持超过4GB的文件。NTFS文件系统是windowsNT文件系统。NTFS系统比FAT32的可靠性更高,可以支持更大的分区和更大的文件,此外还有不少FAT32没......
  • NumPy 数组切片及数据类型介绍
    NumPy数组切片NumPy数组切片用于从数组中提取子集。它类似于Python中的列表切片,但支持多维数组。一维数组切片要从一维数组中提取子集,可以使用方括号[]并指定切片。切片由起始索引、结束索引和可选步长组成,用冒号:分隔。语法:arr[start:end:step]start:起始索引(默认......
  • MMU内存管理单元
    V1.02024年5月7日发布于博客园目录MMU概述MMU关闭时MMU打开时MMU页表段大页小页极小页为什么要有MMU?MMU的关键功能:MMU在C语言编程中的应用:MMU在ARM系统中参考资料MMU概述MMU即内存管理单元(英语:memorymanagementunit,缩写为MMU),有时称作分页内存管理单元(英语:pagedmemorym......
  • Linux系统内核与内存相关知识
    目录目录文件系统NTFS文件系统的概述可靠性添加了功能POSIX支持删除限制NTFS的优点NTFS的缺点NTFS命名约定FAT概述FAT命名约定FAT的优点FAT的缺点NTFS文件系统和FAT32系统的区别区别Linux内核的作用一、前言二、Linux内核的作用三、驱动开发为什么要学习内核四、需要学习......
  • Session相关知识
    什么是Session当用户请求来自应用程序的Web页时,服务器会给每一个用户(浏览器)创建一个Session对象;用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,默认情况下,只要浏览器没有关闭,这个Session就一直存在。Session的常用......