Cache与MMU的爱恨纠缠

news2025/1/16 5:37:44

首先声明本文不准备详细地介绍Cache和MMU的概念和用法,主要是为了厘清两者之间的相互关系和依赖。

1. MMU管理cache访问属性

在没有MMU的时候,cache本身的模型比较简单,如下所示,在使用的时候重点关注Cache数据的一致性问题。
在这里插入图片描述
但是这样用也有个缺点就是:cache只能整体操作,比如为了使用DMA,要关掉所有的DCache,这就是没有内存管理单元的坏处,MMU所提供的第一个作用就是对内存进行分区的权限管理,比如说外设所用的内存、DMA所用的内存区域可以设置为不允许Cache,其他区域设置为开启。这一步就开始导致了MMU与Cache的绑定,因为MMU管理了内存区域是否可以被缓存,如果不开MMU,只打开DCache或者Unified Cache(dcache和icache不分开),将会在外设访问上出现bug。
在这里插入图片描述
其实icache打开也有一定的数据不一致风险,让我们看下一位博主的文章:

例如你的引导程序在地址0x8000有一些代码,它至少要运行一次,然后你选择把它作为引导程序,引导程序可能在比如地址0x10000000允许你在0x8000加载一个新的程序,这个加载使用数据访问,所以它不通过指令缓存。所以有可能指令缓存中有一些或所有你上次在0x8000区域的代码,当你在0x8000处分支到启动加载的代码时,你会得到缓存中的旧程序或旧程序和新程序的讨厌的混合部分,这些部分被缓存和不被缓存。因此,如果你的引导程序允许i-cache开启,你需要在分支到引导的代码之前使cache失效。说到底就是代码已经变了但是没有通过cache,比如我们反复运行0x8000这个地址,但是第一次运行0x8000的时候代码是从nand加载的,第二次是从emmc加载的,只要没有断电,cahce是感知不到你这样玩的。

上面这段话稍微有点绕,我画了一个图来解释下:
在这里插入图片描述
简单来说就是在0x8000这个地址处有了新的代码,但是icache中的代码还是旧的,是跟dcache一样的数据一致性错误。

总而言之,上面就是说明一个问题,现在的CPU,由于MMU管理着cache的访问属性,要开cache就必须开MMU!

裸跑不开MMU行不行
行,但效率很低。
现在的CPU,要想使用Cache,必须使能MMU,MMU页表里有cache访问属性配置。
在ARM里,如果不开MMU,不仅不能开启cache,连内存属性都不是normal,而是device,device属性不允许硬件对AXI总线的信号进行合并、乱序等,效率较低。

参考:MMU开关与CACHE开关的联系——https://blog.csdn.net/u011011827/article/details/125331796
为什么Uboot阶段要关MMU,关DCache、开ICache——https://blog.csdn.net/u013372900/article/details/122454478
A53的mmu配置说明——https://www.cnblogs.com/liuwanpeng/p/14372976.html

2. MMU与Cache配合CPU读写数据

MMU的第二个作用就是将处理器发出的虚拟地址(VA)转换为物理内存中的物理地址(PA),当然这是在跑linux之类的操作系统才有的,跑逻辑代码,VA=PA。
这个时候两者实际上是配合关系,因为两者的功能并不相同,MMU接收虚拟地址并将其转换为物理地址后,这个地址被送到cache或者内存中获取具体的数据。cache中存放的是某些虚拟地址或物理地址对应的实际内容。cache的索引地址可以是虚拟地址可能有点冷门知识,如下图所示,cache的位置可以有两个。
在这里插入图片描述
一般来说速度比较快的Level1 cache被用作虚拟寻址cache,如下图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考:Computer Organization and Architecture——http://aturing.umcs.maine.edu/~meadow/courses/cos335/COA04.pdf
Cache——https://xerxes.cs.manchester.ac.uk/comp251/kb/Cache
Memory Management Units (MMUs)——https://xerxes.cs.manchester.ac.uk/comp251/kb/MMU
ARMv8 MMU及Linux页表映射——https://blog.csdn.net/weixin_38428439/article/details/122438845

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

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

相关文章

linux高可用小知识点汇总-行云管家

不少运维小伙伴对于linux高可用相关知识不是很了解,今天我们小编就给大家汇总了一些,希望可以加深大家的了解。仅供参考哦! linux高可用小知识点汇总-行云管家 一、Linux是什么系统? 【回答】:Linux全称GNU/Linux&am…

小蓝本 第一本《因式分解技巧》 第二章 应用公式 笔记(第二天)

小蓝本 第一本《因式分解技巧》 第二章 应用公式 笔记(第二天)前言二代——应用公式常见公式公式场景公式分类基本间接推导公式(9)、(10)的推导问题分解方法方法1方法2公式推导总结:对照思想小技巧与注意事项习题2题目题解经验前言 第二天op…

基于贝叶斯网络的考虑不确定性的短期电能负荷预测(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

元年SecDevOps的实践之路

随着DevOps的发展,企业的数字化转型的需求也愈发强烈,DevOps大幅提升了企业应用迭代的速度。但同时,安全如果不能跟上步伐,不仅会抵消DevOps变革带来的提升,拖慢企业数字化转型的进程,还会导致漏洞与风险不…

Virtual Private Network

VPN技术的运行机制与发展 虚拟专用网络(Virtual Private Network,VPN)是利用不可靠的公用互联网络作为信息传输媒介,通过附加的安全隧道、用户认证和访问控制等技术实现与专用网络相类似的安全性能,从而实现对重要信息的安全传输。 根据技术应用环境的…

kotlin之循环控制

for循环 for 循环可以对任何提供迭代器&#xff08;iterator&#xff09;的对象进行遍历 java for循环写法 public static void main(String[] args) {int i 10;for (int j 0; j < i; j) {System.out.println(j);}} int[] q{1,2,3,4,5,6,7,8,9,10};for (int j:q) {System…

lammps笔记-入门

1 输入文件 输入脚本文件&#xff08;命令文件&#xff1f;&#xff09;要包含五个部分&#xff1a; # 1) Initialization # 2) System definition # 3) Simulation settings # 4) Visualization # 5) Run 这五个部分不一定全都需要&#xff0c;也不一定完全按如下顺序。…

html在线商城购物网站制作——基于HTML+CSS+JavaScript鲜花礼品电商网站

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

目标检测算法——图像分割数据集汇总 2(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批图像分割数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&am…

为什么 React 中使用控制反转不会触发重新渲染

控制反转&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。 控制反转的应用 首先来看一段常见的 React 代码 import { useState } from "react"const Father () > {const [count, setCount] useState(0);console.…

目标检测的中的指标的含义及其实现

目录 一、Precision和Recall 二、IoU (Intersection over Union) 三、top5、top1 四、Average Precision 五、COCO数据集的评价指标 1、Average Precision (AP) 2、Evaluation Code 3、Analysis Code 一、Precision和Recall Precision是查准率、精确率的意思。预测为正…

基于储能电站服务的冷热电多微网系统双层优化配置附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

QT 系统学习 day04 事件 HTTP网络请求, 音乐播放器,上位机串口通行

1.HTTP 网络 1.头文件 &#xff1a; 网络 /***** HTTP 网络相关模块 *****/ #include <QNetworkAccessManager> /** 网络访问类 **/ #include <QNetworkRequest> /** 网络请求数据类 **/ #include <QNetworkReply> /** 网络结果…

Spring学习:五、AOP 面向切面编程、Spring与Mybatis整合

7. AOP 面向切面编程 7.1 AOP概述 ​ AOP英文名为Aspect Oriented Programming&#xff0c;意为面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能统一维护的一种技术。AOP是OOP的延续&#xff0c;是Spring框架中的一个重要内容&#xff0c;利用AOP可以…

C++不知算法系列之排序从玩转冒泡算法开始

1. 前言 所谓排序&#xff0c;指把数据群体按个体数据的特征按从大到小或从小到大的顺序存放。 排序在应用开发中很常见&#xff0c;如对商品按价格、人气、购买数量等排序&#xff0c;便于使用者快速找到数据。 常见的排序算法分为两大类&#xff1a; 比较类&#xff1a;通…

springboot奖助学金评审系统的设计与实现毕业设计源码031035

奖助学金评审系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用…

③【Maven】创建Maven工程,解读核心配置。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 创建Maven工程&#xff0c;解读核心配置。一、…

React render 的原理和触发时机

一、原理 在类组件和函数组件中&#xff0c;render函数的形式是不同的。 在类组件中render函数指的就是render方法&#xff1b;而在函数组件中&#xff0c;指的就是整个函数组件。 class Foo extends React.Component {render() { //类组件中return <h1> Foo </h1&…

CANoe的安装及打开

1. 安装 CANoe分为软件和硬件。硬件是一个盒子,可以连接真实ECU进行剩余仿真测试 软件需要安装使用,可以在Vector官方网站上下载软件包:https://www.vector.com/cn/zh/products/products-a-z/software/canoe/#c4327 我们以CANoe 15版本为例,下载后是压缩包 解压后,双击运…

结构(structure)创建——直接赋值法与使用struct函数创建法。

一些不同类型的数据组合成一个整体&#xff0c;虽然各个属性分别具有不同的数据类型&#xff0c;但是它们之间是密切相关的&#xff0c;结构&#xff08;(Structure&#xff09;类型就是包含一组记录的数据类型。结构类型的变量多种多样&#xff0c;可以是一维数组、二维数组或…