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)置为无效。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

湘潭大学软件工程专业oracle-sqlplus安装教程

前言 笔者在网上找了一些教程,但是没有装好,或者不知道啥原因,反正就是登不进去老师要求的系统,连接不上服务器,非常苦恼,请教了一下同学,终于弄好了,本文希望能帮助到和我一样有相…

OpenHarmony面向万物智联的应用框架的思考与探索

应用框架,是操作系统连接开发者生态,实现用户体验的关键基础设施。业务的飞速发展促进了应用框架不断演进和变化。 01►业界应用框架的演进 应用是用户使用操作系统/设备的入口,应用框架则是应用开发和运行的基础设施。以移动端为例&#x…

Red Hat Enterprise Linux (RHEL) 8.10 发布 - 红帽企业 Linux 8 完美终结版

Red Hat Enterprise Linux (RHEL) 8.10 (x86_64, aarch64) - 红帽企业 Linux 红帽企业 Linux 8 完美终结版 请访问原文链接:Red Hat Enterprise Linux (RHEL) 8.10 (x86_64, aarch64) - 红帽企业 Linux,查看最新版。原创作品,转载请保留出处…

看看最新的B端登录界面,你是不是被潮流抛弃了?

毛玻璃风格(Frosted Glass Style)是新拟态设计风格中的一种分支,它灵感来源于现实世界中的毛玻璃材质。毛玻璃是一种通过在玻璃表面加工处理的方式,使其具有模糊、云翳和透明效果的特殊玻璃。 在设计中,毛玻璃风格通常…

保研面试408复习 6——计组存储器、数据结构、离散数学、特征值

文章目录 一、计组1、cache的全名、作用、映射方式和写操作的具体实现、多级cache补充:存储器知识 2、流水线数据冒险以及解决方式 二、数据结构1、分布式场景下,十个计算节点的大规模排序问题2、红黑树和B树B树的使用场景、优点、能够维护什么样的操作等…

无人机操作界面来了,起点就很高呀。

无人机操作界面设计需要考虑以下几个方面: 易用性:无人机操作界面应该简单直观,易于操作和理解。操作按钮和控键应该布局合理,易于触摸或点击。重要的操作功能应该易于找到和使用,避免用户迷失或困惑。实时反馈&#…

红蓝对抗提权篇之一文看懂提权

一、计算机中的权限 1.1 不同的权限系统 权限在不同的应用中有着不同的分类,与安全相关的大致上我们分为: 匿名访问权限 来宾权限 用户权限 管理员权限 系统权限 不同的权限对应的权力各不相同,我们对自己电脑一般是用户权限和管理员权限。…

【AI赋能】香橙派OrangePi AIpro初体验

【AI赋能】香橙派OrangePi AIpro初体验 1、初识香橙派1.1、仪式感开箱1.2、OrangePi AIpro(8T)介绍 2、上电开机2.1、开机2.2、串口调试2.2.1 两种方式登录2.2.2 相关信息 2.3、启动系统2.4、网络配置 3、连接摄像头4、目标检测4.1、Jupyter Lab模式4.2、 目标检测测试4.2.1 视…

06 FreeRTOS 互斥量(mutex)

1、互斥量的使用场景 用于保护临界资源,在多任务系统中,任务A正在使用某个资源,还没用完的情况下任务B也来使用的话,就可能导致问题。 比如对于串口,任务A正使用它来打印,在打印过程中任务B也来打印&#x…

Cobaltstrike渗透测试框架

Cobaltstrike简介 cobalt strike(简称CS)是一款团队作战渗透测试神器,分为客户端及服务端,一个服务端可以对应多个客户 端,一个客户端可以连接多个服务端,可被团队进行分布式协团操作. 和MSF关系 metas…

使用screw-core生成数据库结构说明文档

官方项目地址: screw: 简洁好用的数据库表结构文档工具,支持MySQL/MariaDB/SqlServer/Oracle/PostgreSQL/TIDB/CacheDB 数据库。 数据库支持 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB(2016) H2 (开发…

文心智能体平台 | 想象即现实

目录 文心智能体平台介绍平台简介通过平台能做什么平台的优势智能体介绍智能体类型AI 插件介绍 动手创建一个智能体访问平台并进行账号注册根据适合的方式选择智能体类型快速创建智能体智能体个性化模块配置 总结注意事项我的智能体 文心智能体平台介绍 平台简介 文心智能体平…

产品推荐 | 基于Xilinx Zynq-7015 FPGA的MYC-C7Z015开发板

一、产品概述 基于 Xilinx Zynq-7015,双Cortex-A9FPGA全可编程处理器;PS部分(ARM)与PL部分(FPGA)之间采用AXI高速片上总线通信,吉比特级带宽,突破传统ARMFPGA架构的通信瓶颈,通过PL部分(FPGA)灵活配置丰富的外设接口&…

若依框架官网

RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源框架|Java|SpringBoot|SrpingBoot2.0…

LLM - 模型下载与 git-lfs 安装

目录 一.引言 二.安装 git lfs 1.使用 apt-get 安装 2.使用 Brew 安装 3.LFS 验证 三.总结 一.引言 在 HuggingFace 上下载模型时提供一个 git clone 的指令,执行后可以下载对应模型的模型文件: 但是本机还没有 git lfs 命令: git: lfs is not a git comman…

Google使用AI改进了 Sheets;开源视觉语言模型llama3v;开源情绪语音模型ChatTTS;

✨ 1: Google has improved Sheets with AI. Google 使用 AI 改进了 Sheets 您可以使用 Gemini 处理您的数据并将其变成老师。 优化您的数据 Gemini 了解您的数据并提出改进建议。 例如,它可以将重复数据转换为更实用的下拉框。 解释数据 通过单击双子座图标…

Windows下PostgreSQL数据库的备份与恢复

文章目录 一、备份1.找到PostgreSQL的安装目录下的"bin"目录2.在windows的命令窗口里,使用pg_dump进行备份1.打开命令窗口2.使用pg_dump将数据库备份下来 二、恢复1.找到PostgreSQL的安装目录下的"bin"目录2.在windows的命令窗口里,…

全新PSAI设计插件 —— StartAI,让想象触手可及!

告别繁琐的设计过程,StartAI将为你的创作注入新动力,让每一个设计瞬间变得生动而独特。 核心功能介绍: 高清修复 - 每一个设计细节都至关重要,StartAI的高清修复可以细节优化,确保你的设计完美无瑕。 百变生图风格- 从…

【信息学奥赛】两个整型变量的值交换

【信息学奥赛】两个整型变量的值交换 💖The Begin💖点点关注,收藏不迷路💖 编写如下一个函数,用于将两个整型变量的值交换 输入: 两个数 输出: 交换后的两个数 样例输入: 3 2样…

PyTorch自定义张量操作开发指南【CFFI+CUDA】

PyTorch 与 TensorFlow 一起成为深度学习研究人员和从业者的标准。虽然 PyTorch 在张量运算或深度学习层方面提供了多种选择,但一些专门的操作仍然需要手动实现。在运行时至关重要的情况下,应使用 C 或 CUDA 来完成此操作,以支持 CPU 和 GPU …