MMU(内存管理单元)

概述

  • MMU 即内存管理单元,是用硬件电路逻辑实现的一个地址转换器件,它负责接受虚拟地址和地址关系转换表,以及输出物理地址

线性地址

  • 在这里插入图片描述

  • 由于保护模式的内存模型是分段模型,它并不适合于 MMU 的分页模型,所以我们要使用保护模式的平坦模式,这样就绕过了分段模型

  • 这个平坦模型和长模式下忽略段基址和段长度是异曲同工的

  • 程序代码中的虚拟地址,经过 CPU 的分段机制产生了线性地址,平坦模式和长模式下线性地址和虚拟地址是相等的

    • 线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层
  • 如果不开启 MMU,在保护模式下可以关闭 MMU,这个线性地址就是物理地址

  • 因为长模式下的分段弱化了地址空间的隔离,所以开启 MMU 是必须要做的, 开启 MMU 才能访问内存地址空间

MMU页表

概述

  • 它描述了虚拟地址到物理地址的转换关系,也可以说是虚拟页到物理页的映射关系,所以称为页表

构成

  • 在这里插入图片描述

  • 为了增加灵活性和节约物理内存空间(因为页表是放在内存空间中),所以页表并不存放虚拟地址和物理地址的对应关系,只存物理页面的地址

  • MMU以虚拟地址为索引去查表返回物理页面地址,而且页表是分级的,总体分为三个部分

    • 顶级页目录
    • 多个中级页目录
    • 页表

工作流程

  • 从上图看出,一个虚拟地址被分为从左到右四个位段
  • 第一个位段索引顶级页目录中一个项,该项指向一个中级页目录
  • 然后用第二个位段去索引中级页目录中的一个项,该项指向一个页目录
  • 再用第三个位段去索引页目录中的项目,该项目指向一个物理页地址
  • 最后用第四个位段作该物理页内的偏移去访问物理内存

开启MMU

前提

  • 开启 MMU 的前提是 CPU 进入保护模式或者长模式

步骤

第一步

  • 使 CPU 进入保护模式或者长模式

第二步

  • 准备好页表数据,这包含顶级页目录,中间层页目录,页表,假定我们已经编写了代码,在物理内存中生成了这些数据

第三步

  • 把顶级页目录的物理内存地址赋值给 CR3 寄存器
mov eax, PAGE_TLB_BADR ;页表物理地址
mov cr3, eax

第四步

  • 设置 CPU 的 CR0 的 PE 位为 1,这样就开启了 MMU
;开启 保护模式和分页模式
mov eax, cr0
bts eax, 0    ;CR0.PE =1
bts eax, 31   ;CR0.P = 1
mov cr0, eax 

MMU 地址转换失败

失败原因

  • 例如,页表项中的数据为空,用户程序访问了超级管理者的页面,向只读页面中写入数据

失败处理

  • MMU 停止转换地址
  • MMU 把转换失败的虚拟地址写入 CPU 的 CR2 寄存器
  • MMU 触发 CPU 的 14 号中断,使 CPU 停止执行当前指令
  • CPU 开始执行 14 号中断的处理代码,代码会检查原因,处理好页表数据返回
  • CPU 中断返回继续执行 MMU 地址转换失败时的指令

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

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

相关文章

springcloud-config客户端启用服务发现报错找不到bean EurekaHttpClient

背景 在对已有项目进行改造的时候,集成SpringConfigStarter,编写完bootstrap.yml,在idea 启动项中编辑并新增VM options -Dspring.cloud.config.discovery.enabledtrue,该版本不加spring不会从configService获取信息,…

三、GPIO口

我们在刚接触C语言时,写的第一个程序必定是hello world,其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界,在单片机中也不例外,不过我们的传统就是点亮第一个LED灯,点亮电阻,电容的兄弟&#x…

[CSS] 浮动布局的深入理解与应用

文章目录 浮动的简介元素浮动后的特点解决浮动产生的影响浮动后的影响解决浮动产生的影响 浮动相关属性实际应用示例示例1:图片与文字环绕示例2:多列布局示例3:响应式布局 总结 浮动布局是CSS中一种非常强大的布局方式,最初设计用…

java项目(knife4j使用,静态资源未放在static资源包下,公共字段自动填充,Spring Cache与Spring Task)

Knife4j(生成接口文档) 使用swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网:https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。…

JMeter请求导出Excel

前言 今天记录一个使用JMeter模拟浏览器请求后端导出,并下载Excel到指定位置的过程 创建请求 同样先创建一个线程组,再创建一个请求,设置好请求路径,端口号等 查看结果树 右键--添加--监听器--查看结果树 这里可以查看&#…

Windows搭建RTMP视频流服务器

参考了一篇文章,见文末。 博客中nginx下载地址失效,附上一个有效的地址: Index of /download/ 另外,在搭建过程中,遇到的问题总结如下: 1 两个压缩包下载解压并重命名后,需要 将nginx-rtmp…

【Linux】编辑器vscode与linux的联动

1.vscode简单学习 vscode是编辑器,可以写各种语言的程序 下载链接:Download Visual Studio Code - Mac, Linux, Windows 来用一下vscode 我们保存了就能在我们的那个文件夹里面看到这个 这个就是编辑器,跟我们的文本文件好像差不多&#…

栈及栈的应用(有效的括号 力扣20)

栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 画个图理解一下 咱们可以观…

力扣题解(零钱兑换)

322. 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数…

在项目中加入 husky + lint-staged + eslint,代码检测格式化

背景 由于日常工作的多人协作中,会因为个人代码编写风格导致代码在不同人电脑上,会有异常代码格式的提示,为了解决这个小问题,我们可以使用 husky lint-staged 来对代码进行一定程度上的格式化,使格式风格统一&#x…

jenkins 使用教程

1. 安装最新长期稳定版 2.426.1 Redhat Jenkins Packages sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key yum insta…

ubuntu20.04支持win10远程桌面连接

1. 安装xrdp sudo apt install xrdp 2. 检查xrdp状态 sudo systemctl status xrdp 要处于running状态 3.(若为Ubuntu 20)添加xrdp至ssl-cert sudo adduser xrdp ssl-cert 4. 重启服务 sudo systemctl restart xrdp 5. window 远程桌面连接&am…

大模型实战—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

C语言:进程间通信

管道 又内核提供&#xff0c;单工&#xff0c;自同步机制。使用广泛。(管道必须凑齐读写双方才能够运行。) 匿名管道 /home/qt/c/linux_c/ipc/pipe 看不到管道的名称&#xff0c;适合有亲缘关系的进程通信。 pipe.c int pipe(int fildes[2]); #include <stdio.h>…

实现图片拖拽和缩小放大功能。

1. 前言 不知道各位前端小伙伴蓝湖使用的多不多&#xff0c;反正我是经常在用&#xff0c;ui将原型图设计好后上传至蓝湖&#xff0c;前端开发人员就可以开始静态页面的的编写了。对于页面细节看的不是很清楚可以使用滚轮缩放后再拖拽查看&#xff0c;还是很方便的。于是就花了…

RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

文章目录 前言一、修改dts1、kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi2、kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi二、修改驱动1、kernel/sound/soc/codecs/rk817_codec.c2、kernel/sound/soc/rockchip/rockchip_multicodecs.c总结前言 l…

Springcloud之gateway的使用详解

官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom&#xff1a; <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…

openEuler 知:版本比较

文章目录 前言工具oe_diffoepkg 前言 本文的“版本比较”主要是指比较 openEuler 操作系统两个版本之间的 rpm 包的版本差异&#xff0c;只比较版本差异&#xff0c;不比较文件内容的差异。 比较版本主要用于分析两个操作系统版本之间软件包的版本变化。 工具 oe_diff 工具…

Python面试整理-列表和元组的操作

在Python中,列表(list)和元组(tuple)是用于存储序列数据的两种主要数据类型。它们之间的主要区别在于,列表是可变的,而元组是不可变的。这意味着你可以修改列表中的元素,但不能修改元组中的元素。以下是一些常用的列表和元组的操作: 列表操作 创建列表 fruits = [&quo…

在 Ubuntu Server 22.04 上安装 Docker 的详细步骤

在 Ubuntu Server 22.04 上安装 Docker 的详细步骤 本文档详细记录了在 Ubuntu Server 22.04 上安装 Docker 的完整过程&#xff0c;包括解决过程中遇到的问题。希望能对读者有所帮助。 安装过程&#xff0c;重点需要看官方文档。https://docs.docker.com/engine/install/ubu…