思考:开启MMU瞬间可能出现的多种问题以及多种解决方案

快速链接:

  • 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈

(说明本文的介绍都是基于armv8-aarch64或armv9硬件架构)

在mmu未开启阶段,PC操作的都是物理地址执行程序,这样看起来一切正常,没啥问题。

例如:
取指(到物理地址0x4000处取指)、译码、执行
取指(物理地址0x4004处取指)、译码、执行
取指(物理地址0x4008处取指)、译码、执行
取指(物理地址0x400C处取指)、译码、执行

但是呢,假如程序在执行的过程中,你突然打开了MMU,那么会发生什么呢? 比如在前面的示例中,就会出现,程序本来执行在0X4000、0x4004处好好的,而0x4004切好是enable_mmu指令,那么接下来PC将取值0x4008处地址的指令,由于此时MMU已经被打开了,那么0x4008会被当作虚拟地址,经过MMU翻译…
经过MMU,那么就可能出现了两种问题:一是虚拟地址0x4008所对应的页表没有建立,此时会产生prefetch abort; 二是虚拟地址0x4008所对应的页表已经建立了(例如指向物理0x9004处),那么此时cpu期望访问物理地址0x4008处的,就被突然变成了访问物理地址0x9004处了。

取指(到到物理地址0x4000处取指)、译码、执行
取指(物理地址0x4004处取指)、译码、执行 – 这条指令是开启MMU
取指(到虚拟地址0x4008处取指,经MMU单元后,要么是invalid,要么是0x9004)、译码、执行

在这里插入图片描述

为了解决上述描述的问题,下面给出了两种解决方案:
第一种方案:
在开启MMU之前,我先对正在执行的这一小块代码建立个页表(一一映射),那么此时的逻辑就变成了:

取指(到到物理地址0x4000处取指)、译码、执行
取指(物理地址0x4004处取指)、译码、执行 – 这条指令是开启MMU
取指(到虚拟地址0x4008处取指,经MMU单元后,物理地址依然是是0x4008)、译码、执行 – 程序没有跑飞

在这里插入图片描述

第二种方案:
在开启MMU之前,我确实建立个页表(不是一一映射哦,这是正常业务的页表),此时的逻辑如下:

取指(到到物理地址0x4000处取指)、译码、执行
取指(物理地址0x4004处取指)、译码、执行 – 这条指令是开启MMU
取指,到虚拟地址0x4008处取指,经MMU单元时在页表是找不到0x4008这个虚拟地址的(因为没做map),所以会产生prefetch abort异常、而在异常代码ERET返回时,正好返回到0xXXXX地址处,该地址是虚拟地址,正好MAP到0x4008物理地址,程序得到继续执行,译码、执行 – 程序很顺利哦

在这里插入图片描述
如果看到此处,您没有看懂,没关系,请看下列代码示例:

...ldr     x30, =mmu_on_addr     -------(1)msr	    SCTLR_EL1, x0         -------(2)isb                           -------(3)mmu_on_addr :                         -------(4)
...

程序在(1)处将mmu_on_addr链接地址(虚拟地址)写入到了X30寄存器中
程序在(2)处enable MMU,此时下一条指令取指,将被当作成虚拟地址,经过MMU翻译,而对应的页表中自然是没有这个地址(物理地址被当作成的虚拟地址),所以此时将产生sync abort…
程序在(3)处不会被执行,因为上面已经sync abort了

跳转到sync abort后,代码如下方所示,什么都没干,直接ret返回了。

vector_entry sync_exception_sp_elxret

ret指令返回的,PC自然是自动指向X30地址处,即mmu_on_addr链接地址(虚拟地址),程序继续跑,一切步入正常流程…


关注"Arm精选"公众号,备注进ARM交流讨论区。

1138106487-65f6cf311889c.png

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

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

相关文章

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器 1、接上篇 Windows Server 2022 使用ApacheDS用户认证 使用Administrator用户远程登录192.168.1.100windows server,打开pGina软件 2、输入刚刚在ApacheDS中的新添加的用户测试一下,会自动添加…

如何在极狐GitLab 配置 邮件功能

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

【带你了解下前端开发语言有那些】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

爱上数据结构:二叉树的基本概念

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:数据结构 ​ 一、树的基本概念 1.概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起…

计算机网络数据链路层知识总结

物理层知识总结传送门 计算机网络物理层知识点总结-CSDN博客 功能 功能概述 一些基本概念 结点:主机、路由器链路﹔网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路︰网络中两个结点之间的逻辑通道&a…

Prometheus+grafana环境搭建rabbitmq(docker+二进制两种方式安装)(二)

搭建完Prometheusgrafana基础环境后参见:Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客,对我本地的一些常用法人服务进行一个监控。基本都可以根据官方文档完成搭建,因为docker和二进制方式安装各有优缺点。 d…

隐私计算实训营学习七:隐语SCQL的架构详细拆解

文章目录 一、SCQL Overview1.1 SCQL背景1.2 SCQL Overview 二、SCQL CCL三、SCQL架构 一、SCQL Overview 1.1 SCQL背景 SCQL:属于隐私计算BI范畴,允许多个互不信任参与方在不泄露各自隐私数据的条件下进行联合数据分析。 如下数据在不同机构&#xf…

Unity 学习日记 12.小球撞击冰块游戏

目录 1.准备场景 2.让小球动起来 3.用鼠标把小球甩出去 4.加入鼠标点击小球的判断 5.小球与冰块的碰撞测试 6.撞击后销毁冰块 ​编辑 7.显示游戏计时 8.显示扔球次数 9.显示剩余冰块个数 10.游戏结束 11.完整代码 下载源码 UnityPackage 最终效果: 1.准…

基于springboot+vue实现的房源出租信息系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

HQL,SQL刷题,尚硅谷(初级)

目录 相关表数据: 题目及思路解析: 多表连接 1、课程编号为"01"且课程分数小于60,按分数降序排列的学生信息 2、查询所有课程成绩在70分以上 的学生的姓名、课程名称和分数,按分数升序排列 3、查询该学生不同课程的成绩…

网络中的网络(NiN)

文章目录 NiN块 NiN块 NiN的想法是在每个像素位置(针对每个高度和宽度)应用一个全连接层。果我们将权重连接到每个空间位置,我们可以将其视为1x1卷积层,或作为在每个像素位置上独立作用的全连接层。 从另一个角度看,即…

ollama本地部署大模型(纯CPU推理)实践

文章目录 说明Ollama和Ollama WebUI简介Ollama模型硬件要求内存要求 Ollama容器部署Ollama容器内模型下载和对话Ollama WebUI部署Ollama WebUI下载模型和对话轻量模型推荐机器硬件信息概览qwen:0.5b推理体验gemma:7b推理体验 说明 本文旨在分享在linux(centos8)平台使用docker…

新生报到系统的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱,出错率高,信息安全性差…

3.29号系统移植

1. uboot介绍 bootloader:引导加载程序的统称 uboot是引导加载程序中的一种 1.1 uboot特点 uboot是一个开源分布式软件uboot是由德国DNEX小组进行维护uboot支持多种硬件架构平台uboot是一个裸机开发程序uboot占用体积小uboot主要作用引导linux内核进行启动&#…

Vulnhub:BROKEN: GALLERY

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB wen信息收集 目录扫描 进制转换 ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, M…

【Docker】搭建安全可控的自定义通知推送服务 - Bark

【Docker】搭建安全可控的自定义通知推送服务 - Bark 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建。 简介 Bark是一款为Apple设备用户设计的开源推送服务应用,它允许开发者、程序员以及一般用户将信息快速推送到他们自己的iPhone、iPad等设备上…

4G/5G防爆布控球

#防爆布控球 #远程实时监控 #移动应急指挥 #高清图像采集 #防爆安全认证 4G/5G防爆布控球 M130-EX防爆布控球是针对石化装置、石油平台、燃气、化工、制药、煤炭、冶炼、船舶制造、纺织等易燃易爆环境及危险场所而开发设计的防爆智能一体化电气设备。 产品型号:M13…

如何使用potplayer在公网环境访问内网群晖NAS中储存在webdav中的影视资源

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-D7WJh3JaNVrLcj2b {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

vue3 i18n国际化,普通js,ts文件中的设置方法

项目环境&#xff1a;vue3 ts element plus i18n vue3 ts i18n用法 1 在vue3ts中&#xff0c;如.<标签>{{ $t(login.title) }}</标签> <div class"title">{{ $t(login.title) }}</div>2 在<script setup>...</script>中 …

【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

目录 前言 函数重载 概念 重载函数的条件 C支持重载函数的原理--名字修饰 引用 概念 特性 常引用&#xff08;const引用&#xff09; 使用场景 传值&#xff0c;传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto关键字&#xff08;C11&#xff09; a…