mmu之TLB的来源与实现

TLB的由来

遇到的问题

        对于两级页表(Page Table)的设计,需要访问两次物理内存才可以得到虚拟地址对应的物理地址(一次访问第一级页表,另一次访问第二级页表),而物理内存的运行速度相对于处理器本身来说,有几十倍的差距;

        因此在处理器执行的时候,每次送出虚拟地址都需要经历上述过程的话,这显然是很慢的(要知道,每次取指令都需要访问存储器)。

        此时可以借鉴 Cache的设计理念,使用一个速度比较快的缓存,将页表中最近使用的 PTE 缓存下来,因为它们在以后还可能继续使用,尤其是对于取指令来说;

        考虑到程序本身的串行性,会顺序地从一个页内取指令,此时将 PTE 缓存起来是大有益处的,能够加快一个页内4KB内容的地址转换速度;

TLB的引入

        由于历史的原因,缓存PTE的部件一般不称为Cache,而是称之为TLB(TranslationLookaside Buffer)

  • 在TLB中存储了页表中最近被使用过的PTE, 从本质上来将,TLB就是页表的Cache。
  • 但是,TLB又不同于一般的Cache,它只有时间相关性(TemporalLocality),也就是说,现在访问的页,很有可能在以后继续被访问。
  • 至于空间相关性(SpatialLocality),TLB并没有明显的规律,因为在一个页内有很多的情况,都可能使程序跳转到其他不相邻的页中取指令或数据。
  • 也就是说,虽然当前在访问一个页,但是未必会访问它相邻的页, 正因为如此,Cache设计中很多的优化方法,例如预取(prefetching),是没有办法应用于 TLB 中的。

        在现代的处理器中,很多都采用两级TLB:

  • 第一级TLB采用哈佛结构,分为指令TLB(I-TLB)和数据TLB(D-TLB),一般采用全相连的方式;
  • 第二级TLB 是指令和数据共用,一般采用组相连的方式,这种设计方法和多级 Cache是一样的。

TLB的使用

处理器发送的虚拟地址首先送到TLB中进行查找;

  • TLB中的内容是有效的;此时TLB hit, 可以直接使用从TLB中得到的PFN;
  • TLB中的内容是无效的,则是需要访问物理内存中的页表:
    • 如果在物理内存中找到的PTE是有效的,则可以直接从页表中得到对应的物理地址,同时将这个PTE写回到TLB中,供以后使用;
    • 如果在物理内存中找到的PTE是无效的,说明这个page不在物理内存中(可能这个page以前没被使用过,或者这个page使用后之后,又被替换走了),此时应该产生page fault类型的excp;
      • 通知操作系统来处理这个情况;
      • 操作系统需要从硬盘中将相应的页搬移到物理内存中;
      • 将它在物理内存中的首地址放到页表内对应的PTE中,并
      • 将这个PTE的内容写到TLB中。
  • 上述TLB中的其他域段,完全来自于页表;

TLB的miss

        当一个虚拟地址查找 TLB,发现需要的内容不在其中时,就发生了 TLB 缺失(miss),由于TLB本身的容量很小,所以TLB缺失发生的频率还是比较高的,在很多情况下都可以发生 TLB 缺失,它们主要有如下几种。

  • 虚拟地址对应的页不在物理内存中,此时在页表中就没有对应的PTE,由于TLB是页表的Cache, 所以TLB的内容应该是页表的一个子集,也就是说, 在页表中不存在的PTE,也不可能出现在 TLB中。
  • 虚拟地址对应的页已经存在于物理内存中了,因此在页表中也存在对应的PTE,但是这个PTE还没有被放到TLB中,这种情况是经常发生的,毕竟TLB的容量远小于页表。
  • 虚拟地址对应的页已经存在于物理内存中了,因此在页表中也存在对应的PTE,这个PTE也曾经存在于TLB中,但是后来从TLB中被踢了出来(例如由于这个页长时间没有被使用而被LRU替换算法选中),现在这个页又重新被使用了,此时这个PTE就存在于页表中,而不在 TLB内。

        解决TLB缺失的本质就是要从页表中找到对应的映射关系,并将其写回到TLB内,这个过程称为Page Table Walk;

        可以使用硬件的状态机来完成这个事情,也可以使用软件来做这个事情,它们各有优缺点,在现代的处理器中均有采用,它们各自的工作过程如下。

软件方式

         

  1. 一旦发现TLB缺失,硬件把产生TLB缺失的虚拟地址保存到一个特殊寄存器中,同时产生一个TLB缺失类型的异常;
  2. 在异常处理程序中,软件使用保存在特殊寄存器当中的虚拟地址去寻址物理内存中的页表,找到对应的PTE,并写回到TLB中;
  3. 很显然,处理器需要支持直接操作TLB的指令,如写TLB、读TLB等。

        对于超标量处理器来说,由于对异常进行处理时,会将流水线中所有的指令进行抹掉(在后文会介绍这个过程),这样会产生一些性能上的损失,但是使用软件方式,可以实现一些比较灵活的TLB替换算法。

        但是,为了防止在执行TLB缺失的异常处理程序时再次发生TLB缺失,一般都将这段程序放到一个不需要进行地址转换的区域(这个异常处理程序一般属于操作系统的一部分,而操作系统就放在不需要地址转换的区域),这样处理器在执行这段异常处理程序时,相当于直接使用物理地址来取指令和数据,避免了再次发生TLB缺失的情况。

硬件方式

        硬件实现一般由内存管理单元(MMU)完成,当发现TLB缺失时,MMU自动使用当前的虚拟地址去寻址物理内存中的页表。

  • 前面说过,多级页表的最大优点就是容易使用硬件进行查找,只需要使用一个状态机,逐级进行查找就可以了;
  • 如果从页表中找到的 PTE 是有效的,那么就将它写回到 TLB 中,这个过程全部都是由硬件自动完成的,软件不需要做任何事情,也就是这个过程对于软件是完全透明的。
  • 这个过程中,还需要将整个流水线都暂停,等待MMU处理这个TLB缺失,只有它处理完了,才可以使流水线继续执行。
  • 当然,如果MMU发现查找到的PTE是无效的,那么硬件就无能为力了,此时MMU会产生PageFault类型的异常,由操作系统来处理这个情况。
  • 使用硬件处理TLB缺失的这种方法更适合超标量处理器,它不需要打断流水线,因此从理论上来说,性能也会好一些;

        但是这需要操作系统保证页表已经在物理内存中建立好了,并且操作系统也需要将页表的基地址预先写到处理器内部对应的寄存器中(例如PTR寄存器),这样才能够保证硬件可以正确地寻址页表。

        在超标量处理器中,因为软件处理的方式,会将流水线中的全部指令都flush, 因此,处理完成后会将这些指令重新取回,并放到流水线中的这部分时间,会很长;       

TLB的写入

        在前面已经讲过,当一个页从硬盘搬移到物理内存之后,操作系统需要知道这个页中的内容在物理内存中是否被改变过。

  • 如果没有被改变过,那么当这个页需要被替换时(例如由于物理内存中的空间不足),可以直接进行覆盖,因为总能从硬盘中找到这个页的备份。
  • 而如果这个页的内容在物理内存中曾经被修改过(例如 store指令的地址落在了这个页内),在物理内存中的这个页要被替换时,需要先将它从物理内存中写回到硬盘。

        因此需要在页表中,对每个被修改的页加以标记,称为脏状态位(dirty),当物理内存中的一个页要被替换时,需要首先检查它在页表中对应PTE的脏状态位,如果它是1,那么就需要先将这个页写回到硬盘中,然后才能将其覆盖。

TLB之后引入的问题

        有了TLB之后,相关的状态bit都直接放到了TLB中,比如,use bit, dirty bit;

        如果 TLB采用写回(Write Back)方式的实现策略,那么使用位(use)和脏状态位(dirty)改变的信息并不会马上从 TLB 中写回到页表,只有等到 TLB中的一个表项要被替换的时候,才会将它对应的信息写回到页表中。

        这种工作方式给操作系统进行页替换带来了新的问题,因为此时在页表中记录的状态位(主要是use和dirty这两位)有可能是“过时”的,操作系统无法根据这些信息,在Page Fault发生时找出合适的页进行替换。

解决方式一:

        当操作系统在Page Fault发生时,首先将TLB中的内容写回到页表,然后就可以根据页表中的信息进行后续的处理了,这个办法显然会耗费一些时间,例如对一个表项个数是64的TLB来说,需要写64次物理内存才能将TLB中的内容全部写回到页表。

解决方式二:

        TLB中记录的所有页都不允许从物理内存中被替换。

        操作系统完全可以认为,被TLB记录的所有页都是需要被使用的,这些页在物理内存中不能够被替换。操作系统可以采用一些办法来记录页表中哪些PTE被放到了TLB中;

        而且这样做还有一个好处,它避免了当物理内存中一个页被踢出之后,还需要查找它在TLB中是否被记录了,如果是,需要在TLB中将其置为无效,因为在页表中已经没有这个映射关系了,因此TLB中也不应该有。

TLB与Dcache之间的联系

        当需要将某个page从物理内存中踢掉时,本来要先判断该page是否有dirty的数据,但是增加了d-cache后,最新的数据放在了d-cache,所以我们在将一个page的内容写回硬盘时,需要先判断d-cache中是否保留了这个page的数据;     

        此时需要将D-cache中的数据全部flush出来吗?

        考虑到page的逐出,一定不会逐出当前还存在与TLB中的page, 能不能利用这个特性呢?这个问题或者转换成:在D-cache中保存的数据,一定是在TLB中的记录范围吗?

        D-cache之中保存的数据,不一定都是在TLB中的记录范围;

        比如,当发生TLB缺失时,需要从页表中将一个新的PTE写到TLB中,如果TLB此时已经满了,那么就需要替换掉TLB中的一个表项,也就不再记录这个页的映射关系,但是这个页的内容在 D-Cache中仍旧是存在的。

        所以,我们还是需要在进行page剔出的时候,找到对应page在D-cache中的数据,将其flush到memory中,具体实现方式后文描述。

TLB的管理

     考虑如下的一些场景:

  • 当一个进程结束时,这个进程的指令(code)、数据(data)和堆栈(stack)所占据的页表就需要变为无效,这样也就释放了这个进程所占据的物理内存空间。但是,此时:
  1. 在 I-TLB中可能存在这个进程的程序(code)对应的PTE
  2. 在D-TLB中可能还存在着这个进程的数据(data)和堆栈(stack)对应的PTE

        此时就需要将I-TLB和 D-TLB 中,和这个进程相关的所有内容都置为无效;

        如果没有使用ASID(进程的编号,后文会进行介绍),最简单的做法就是将I-TLB 和 D-TLB中的全部内容都置为无效,这样保证新的进程可以使用一个干净的 TLB;

        如果实现了ASID,那么只将这个进程对应的内容在TLB 中置为无效就可以了。

  • 当一个进程占用的物理内存过大时,操作系统可能会将这个进程中一部分不经常使用的页写回到硬盘中
  1. 这些页在页表中对应的映射关系也应该置为无效,此时当然也需要将I-TLB和D-TLB中对应的内容置为无效
  2. 但是,一般操作系统会尽量避免将存在于TLB中的页置为无效,因为这些页在以后很可能会被继续使用。

抽象出来,我们需要对TLB进行如下的管理:

        ①能够将 I-TLB 和 D-TLB 的所有表项(entry)置为无效;

        ②能够将I-TLB和D-TLB中某个ASID对应的所有表项(entry)置为无效;

        ③能够将I-TLB和D-TLB中某个VPN对应的表项(entry)置为无效。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659788.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zabbix事件告警监控:如何实现对相同部件触发器告警及恢复的强关联

有一定Zabbix使用经验的小伙伴可能会发现,接收告警事件时,其中可能包含着大量不同的部件名,同一部件的事件在逻辑上具有很强关联性,理论上应保持一致的告警/恢复状态,但Zabbix默认并未对它们进行关联,直接后…

单片机+DAC0832信号发生器的仿真设计(方波、三角波、梯形波、锯齿波)

仿真原理图如下(proteus仿真工程文件可留意下载) 一、设计要求 设计一个能产生方波、三角波、梯形波、锯齿波的波形发生器。 二、方案论证 方案一 :利用单片机AT89C51编写程序,然后将产生信号通过DAC0832(数模转换器)转化成模拟信号,输入信号经运放电路后信号放大,低…

Make-An-Audio——用于语音生成的提示增强扩散模型

0.引言 论文提出了一个从文本生成语音的扩散模型 Make-An-Audio。该模型将文本提示作为输入,并据此生成语音。例如,输入 “一只猫在喵喵叫,一个年轻女人的声音”,就会输出猫在喵喵叫,一个女人在说话的音频。这项研究已…

做抖音小店什么类目最容易爆单?搞懂这三点就明白了!

大家好,我是电商糖果 我们刚接触电商的时候,一定经常听一些同行念叨,选择大于努力,类目大于一切。 很多电商人把选类目比做定生死。 类目选对了,让你轻松飞升不是问题,类目选错了,基本被判了…

某烟草企业数字化转型物流信息化咨询项目规划方案(117页PPT)

方案介绍: 烟草企业数字化转型物流信息化咨询项目规划方案将为企业带来多方面的价值,包括提升物流运营效率、降低物流成本、优化供应链管理、增强企业竞争力和促进可持续发展等。这些价值的实现将有助于企业在激烈的市场竞争中保持领先地位并实现可持续…

【C++奇妙冒险】拷贝构造函数、运算符重载(赋值重载|const成员|取地址重载|const取地址重载)

文章目录 前言🚩拷贝构造函数🫧概念🫧特征🫧默认生成的拷贝构造🫧default关键字(浅谈) 🚩运算符重载🫧概念🫧运算符重载注意事项🫧封装如何保证&a…

梳理清楚的echarts地图下钻和标点信息组件

效果图 说明 默认数据没有就是全国地图, $bus.off("onresize")是地图容器变化刷新地图适配的,可以你们自己写 getEchartsFontSize是适配字体大小的,getEchartsFontSize(0.12) 12 mapScatter是base64图片就是图上那个标点的底图 Ge…

理解多线程看这一篇就够了

一、基本概念与关系 程序 程序是含有指令和数据的文件,静态地存储在磁盘等存储设备上。它是软件的实体,但未被激活。 进程 进程是程序的一次执行过程,是系统运行程序的基本单位。当程序被操作系统加载并执行时,就成为一个进程&a…

SAP 消息号VF501科目确定期间出错

在销售开票VF02的时候,经常出现报错:“科目确定期间出错”,这个报错,目前检查步骤: 1、BP客户主数据,销售代码层数据(销售与分销)-开票-会计-客户科目分配组,要与销售订…

卷积计算过程详解(含图示和代码)

什么是卷积? 卷积是一种数学运算,通过两个函数f和g生成第三个函数,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。卷积在泛函分析中扮演重要角色,可以被看作是“滑动平…

【大数据】Hadoop 2.X和1.X升级优化对比

目录 1.前言 2.hadoop 1.X的缺点和优化方向 3.解决NameNode的局限性 3.1.Hadoop HA 3.2.Haddop federation 4.yarn 5.周边组件 1.前言 本文是作者大数据系列中的一文,专栏地址: https://blog.csdn.net/joker_zjn/category_12631789.html?spm10…

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第74讲。 扎气球最高分&…

图片怎样在线改像素大小?电脑快速修改图片大小的方法

在设计图片的时候下载的图片尺寸一般会比较大,在网上使用经常会因为尺寸的问题导致无法正常上传,那么如何快速在线改图片大小呢?想要修改图片尺寸可以在直接选择网上的图片改大小工具的功能来快速完成修改,操作简单方便使用&#…

FreeRTOS学习笔记-基于stm32(7)任务状态查询与任务时间统计API函数

1、FreeRTOS任务相关API函数 函数描述uxTaskPriorityGet()查询某个任务的优先级vTaskPrioritySet()改变某个任务的任务优先级uxTaskGetSystemState()获取系统中任务状态vTaskGetInfo()获取某个任务信息xTaskGetApplicationTaskTag()获取某个任务的标签(Tag)值xTaskGetCurrentT…

0.25W 1.5KVDC~3KVDC 隔离超小型单输出 DC/DC 电源模块——TKE-W25系列

TKE-W25系列隔离超小型单输出 DC/DC 电源模块是一款超小型单输出电源模块,工业级环境温度,用于PCB安装的国际标准结构。此系列产品小巧,效率高,低输出纹波,用于需要电压转换和隔离的场合,封装有SIP和DIP可选。

MiniPCIe/SATA双用插槽无法识别minipcie模块怎么回事!

在计算机和嵌入式系统设计中,MiniPCIe/SATA双用插槽作为一种高度集成的解决方案,提供了极大的灵活性与扩展能力。它不仅能够支持MiniPCIe接口的无线网卡、固态硬盘控制器等模块,还能适应SATA接口的硬盘或固态存储设备,大大丰富了系统配置的可能性。尽管设计初衷良好,但在实…

Java—二分查找

介绍 二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。其基本思想是将目标值与数组中间的元素进行比较: 如果目标值等于中间元素,则查找成功。如果目标值小于中间元素,则在数组左半部分继续进行二…

汽车悬架分为哪几类

汽车悬架分为哪几类 1)汽车的悬架系统可根据结构分为两种:独立悬架和非独立悬架,独立悬架根据构造又可以分为CDC运动悬架(CDC电磁悬架系统)和空气悬架; 2)当前比较火热的空气悬架,是独立悬架的一种; 3)前轮主要使用麦弗逊式独立悬架 和 双叉臂悬架,后轮主要使用多…

基于 DCT 的图像滤波

需求分析 对于图像去噪这一需求,我们可以通过DCT(离散余弦变换)算法来实现。DCT是一种基于频域的变换技术,可以将图像从空间域转换为频域,然后通过滤波等处理方式进行去噪。 针对这一需求,我们需要进行以下…