详细讲解MMU——为什么嵌入式linux没他不行?

2023-11-13

MMU内存管理

MMU(Memory Management Unit,内存管理单元)是一种硬件模块,用于在CPU和内存之间实现虚拟内存管理。

其主要功能是将虚拟地址转换为物理地址,同时提供访问权限的控制和缓存管理等功能。MMU是现代计算机操作系统中重要的组成部分,可以提高系统的稳定性和安全性。
在内存管理方面,MMU可以通过页面表(Page Table)实现虚拟内存管理。页面表是一种数据结构,记录了每个虚拟页面和其对应的物理页面之间的映射关系。

当CPU发出一个虚拟地址时,MMU会通过页面表查找并将其转换为对应的物理地址。

此外,MMU还可以通过页面表实现内存保护和共享等功能,从而提高系统的安全性和效率。
总之,MMU是内存管理中一个重要的硬件组件,可以实现虚拟内存管理、内存保护、共享和缓存等功能,为现代计算机操作系统的稳定性和安全性提供支持。

举个例子

假设我们有一个程序,它需要访问两个内存区域:一个是只读的代码区域,一个是可读写的数据区域。

我们现在想要在一个没有 MMU 的系统上运行这个程序。如果没有 MMU,代码区域和数据区域就只能被映射到两个固定的物理地址上。这就意味着,如果程序尝试访问一个不正确的地址,可能会导致系统崩溃。

现在,如果我们在一个具有 MMU 的系统上运行这个程序,情况会有所不同。MMU 可以将程序尝试访问的地址映射到不同的物理地址,这样可以使得代码区域和数据区域在物理内存中不再是固定的位置。

这意味着,如果程序尝试访问不正确的地址,MMU 可以通过重新映射来保护系统不崩溃。

MMU 还可以将多个虚拟地址映射到同一个物理地址上,这就是所谓的页共享(page sharing),可以减少物理内存的使用。

如果没有MMU,程序访问内存时只能使用物理地址,而物理地址是直接映射到内存芯片上的地址,程序可以随意访问任何一个物理地址。

这种情况下,程序如果访问了错误的地址或试图访问未被授权的地址,就会产生访问错误或非法访问,可能导致系统崩溃、数据丢失等问题。

而有了MMU,程序访问的是虚拟地址,由MMU负责将虚拟地址映射到物理地址上,这样程序就无法直接访问物理地址。

同时,MMU可以根据内存访问权限来限制程序对内存的访问,确保系统的安全性和稳定性。

因此,没有MMU时,程序可能会访问到其他地址,而有了MMU,程序只能访问被允许访问的地址,可以有效地避免非法访问的问题。

为什么相同的虚拟地址空间在物理地址不会发生冲突呢?

相同的虚拟地址空间在不同的进程中可能会映射到不同的物理地址,这个映射的过程是由MMU完成的。在操作系统中,每个进程都有独立的虚拟地址空间,且这些虚拟地址空间互不干扰。

MMU会将每个进程的虚拟地址映射到对应的物理地址上,使得不同进程间的内存访问不会相互干扰。同时,MMU也会提供一些安全机制,如页面保护等,来防止进程越界访问内存或访问其他进程的内存。

因此,MMU起到了保护进程间内存互不干扰的作用,也是现代操作系统的重要组成部分。

页表是什么?

页表是一种用于存储虚拟内存地址与物理内存地址映射关系的数据结构。在使用虚拟内存的系统中,每个进程都有自己的虚拟地址空间,而这些虚拟地址空间被分割成许多页(通常大小为4KB或更大),而不是一整块连续的内存。

因此,当进程需要访问某个虚拟地址时,需要将其翻译成对应的物理地址。这个翻译过程就是通过页表来完成的。

页表的基本原理是将虚拟地址划分成一个页号和一个偏移量。

页号用于在页表中查找对应的物理页帧号,而偏移量则用于计算该虚拟地址在物理页帧中的偏移量。通过这种方式,就可以将虚拟地址映射到物理地址,使得进程可以访问对应的内存区域。

页表一般由操作系统来维护,因为操作系统需要掌握虚拟地址和物理地址之间的映射关系。

在使用MMU(Memory Management Unit)的硬件支持的系统中,当进程访问虚拟地址时,MMU会通过页表将虚拟地址转换为物理地址,并将访问指向正确的物理地址。这样,进程就可以在不知道自己真实物理地址的情况下访问内存。

为什么没有MMU就无法运行Linux系统?

这是因为 Linux 内核将虚拟地址空间分为多个页面,并将这些页面映射到物理地址空间上,以实现内存隔离、保护和虚拟内存等功能。

没有 MMU,就无法实现这种映射,从而无法运行 Linux 系统。

为什么有些较为简单的SOC可能没有MMU,但仍然可以运行一些嵌入式操作系统或者裸机程序?

RTOS可以运行在没有MMU的系统上,因为RTOS通常不需要进行内存保护和虚拟地址映射等高级特性。

相反,RTOS的设计侧重于实时性和低延迟,因此通常只需要简单的内存管理和任务调度即可。

这使得RTOS可以运行在许多嵌入式系统上,包括一些没有MMU的系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详细讲解MMU——为什么嵌入式linux没他不行? 的相关文章

  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp

随机推荐

  • python join_join与python实现列合并

    在linux下powerpath对盘与更改盘符名 篇中提到了修改聚合后的多路径别名的问题 在数据库RAC增加存储盘的过程中 还会涉及一个常见的问题是多个RAC之间进行盘符名核对的问题 这里还是以三节点RAC 加 EMC存储盘为例 安装EMC
  • 【推理引擎】ONNXRuntime 的架构设计

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 ONNXRun
  • 【毕业设计】基于单片机的无接触测温枪 - MLX90614 红外测温仪 嵌入式 物联网 stm32

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 相关模块 配置介绍 5 部分核心代码 5 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学
  • Pyspark机器学习:模型评估(ml.Evaluation包的使用)

    Pyspark V3 2 1 本篇博客主要介绍pyspark ml Evaluation包的使用 1 概览 pyspark ml Evaluation包中的评估类主要包括以下几种如下表 类 作用 Evaluator 评估器的基类 但是这个类
  • Vmware 虚拟机提示:无法打开磁盘***.vmdk,未能锁定文件,解决办法

    虚拟机 vmware 6 5 Vmware 虚拟机提示 无法打开磁盘 vmdk 原因 未能锁定文件 解决办法如下 原因 非正常关闭虚拟机 解决办法 一 删除虚拟机文件所在文件来夹里所有以 lck 结尾的文件及文件夹 重新启动即可解决 二 如
  • 快速排序和归并排序的比较

    快速排序和归并排序的分析比较 快速排序 归并排序 设计思想 快速排序算法是在分治算法基础上设计出来的一种排序算法 从待排序序列中任选一个元素x作为哨点 以按从小到大排序为例 将所有比x大的元素放到哨点右边 将所有比x小的元素放到哨点左边 再
  • DIY多快充协议太阳能充电器!----BOOST升压电路

    上一篇文章介绍了支持三段式锂电池充电电路 使用上海如韵电子CN3791芯片的MPPT功能提高了锂电池充电过程中的能量转换效率 带来了锂电池快速蓄电 这篇文章咋们来看看如何将锂电池电压转化成支持多种快充协议的电压 单节锂电池的最高电圧为4 2
  • Python 实现 Dijkstar 路径规划算法

    Dijstar 最短路径算法 用于计算起始点到最终点的最短路径 一般采用的是贪心算法策略 原理可以参考 图解 Open list 和 close list 环境 Terminal 需要预先安装两个库 matplotlib 和 math pi
  • LeetCode题目笔记——1710. 卡车上的最大单元数

    文章目录 题目描述 题目难度 简单 方法一 贪心 代码 Python 代码 C 总结 题目描述 请你将一些箱子装在 一辆卡车 上 给你一个二维数组 boxTypes 其中 boxTypes i numberOfBoxesi numberOf
  • NanoPC-T4

    0 前言 Android源码目录frameworks native opengl tests提供了大量测试案例 本文重点分析其中的gl basic 下面先上效果图 图0 1 gl basic运行效果 此时dumpsys SurfaceFli
  • 时区(Timezone)一览表

    System out println String join TimeZone getAvailableIDs 获取指定时区当前系统时间 按时区获取当前YYYYMMDD格式日期 param timezone return public st
  • 软件架构的10个常见模式

    企业规模的软件系统该如何设计呢 在开始写代码之前 我们需要选择一个合适的架构 这个架构将决定软件实施过程中的功能属性和质量属性 因此 了解软件设计中的不同架构模式对我们的软件设计会有较大的帮助 什么是架构模式 根据维基百科 架构模式是针对特
  • vue项目使用外部字体

    1 下载字体 https www dafont com 2 项目中assets下添加一个字体样式文件夹front 将下载好的文件放到文件夹中 并创建一个front css字体样式文件 font face font family jap tr
  • Docker入门教程(详细)

    目录 一 Docker概述 1 1 Docker 为什么出现 1 2 Dorker历史 1 3 能做什么 虚拟机技术 通过 软件 模拟的具有完整 硬件 系统功能的 运行在一个完全 隔离 环境中的完整 计算机系统 容器化技术 容器化技术不是模
  • 【python办公自动化】PysimpleGUI中更新Listbox组件选定元素的格式

    pysimplegui中更新Listbox组件选定元素的格式 背景 问题解决 创建窗口布局 创建窗口 背景 在进行打分时候 由于打分的指标较多 因此为了辨别已经打完分数的指标 可以考虑对打过分的指标进行标记 故可以采用格式修改的方法调整 比
  • pandas--实战以及使用pyecharts绘图,(面向对象)

    实战9 covid approval toplines csv subject 与covid 19处理有关的 Trump modeldate 日期 party 政党 approve estimate 赞成 disapprove estima
  • matplotlib colors table/matplotlib 颜色表

    官网 https matplotlib org stable gallery color named colors html 可直接在线复制 https www kdocs cn l cnxPATUkMDCE 第一列 第二列 第三列 第四列
  • STL详解(很全)

    目录 概述 STL六大组件简介 三大组件介绍 1 容器 2 算法 3 迭代器 常用容器 1 string容器 string容器基本概念 string容器常用操作 2 vector容器 vector容器基本概念 vector迭代器 vecto
  • java调用存储过程超时及DBCP参数配置说明

    问题 生产环境实时打标超时 分析原因 实时打标java服务中 只创建数据库Connection 没有关闭数据库Connection 导致数据库连接池耗尽 无法再次获取数据库链接 解决 实时打标java服务中 增加 关闭数据库Connecti
  • 详细讲解MMU——为什么嵌入式linux没他不行?

    MMU内存管理 MMU Memory Management Unit 内存管理单元 是一种硬件模块 用于在CPU和内存之间实现虚拟内存管理 其主要功能是将虚拟地址转换为物理地址 同时提供访问权限的控制和缓存管理等功能 MMU是现代计算机操作