简而易懂的CPU和MMU画图讲解

2023-11-09

我们知道,程序文件一般放在硬盘上,当把程序运行起来时,程序被放入内存中,通过内存放入cache,通过cache进入cpu,下图中预取器就是负责从cache取出指令,然后由译码器译码,译码的作用就是要知道需要哪些寄存器配合完成指令,如该指令是一个加法运算,则译码器译码后发现需要使用到add,eax和ebx寄存器,然后交给ALU算数逻辑单元进行算数运算,结果放回寄存器,再放入cache,再放入内存,之后交给IO总线,再交给物理设备显示到屏幕上。
在这里插入图片描述
下图是一个0到4G的虚拟地址空间,.text存放代码,.data存放数据,heap是堆区,stack是栈区,这0到3G是用户区,3到4G是内核区,当程序运行的时候便会产生这样一个虚拟地址空间,程序运行时所需的所有资源都放到虚拟内存中。虚拟内存不是真实存在的,图中所示的4G大小的虚拟内存是指程序运行可用的地址空间有4G,程序运行的资源最终还是要放到物理内存中。那虚拟地址和物理地址如何对应?就是使用MMU。MMU:内存管理单元,用于完成虚拟内存和物理内存的映射,位于CPU内部;MMU将虚拟内存映射到物理内存,以及设置修改CPU的访问级别,如printf函数,要调用系统函数write,要进入内核空间,此时CPU的访问级别由3级用户空间转换到0级内核空间。
在这里插入图片描述
下图所示为在同一个机器上运行两份可执行程序a.out,产生两个虚拟地址空间,其中,两个进程的用户态虚拟地址被MMU映射到物理内存的不同地址,但是内核态映射到同一个地址(针对单核来讲),而PCB虽然位于内核中,两个进程的PCB是不一样的,只是位于同一个物理地址处。
在这里插入图片描述
综上,程序运行的时候产生虚拟地址空间,预取器取处指令后需要MMU的配合,将虚拟地址和物理地址做映射才能正确取出数据。
现在,进一步分析,如下图所示,进程a.out的PCB中有一个指针,指向页目录,页目录中有一个个的指针,其中一个指向页表,页表中也有一个个的指针,其中一个指向物理页面,物理页面中是一个个的内存单元,然后才通过MMU完成虚拟地址和物理地址的映射。
在这里插入图片描述

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

简而易懂的CPU和MMU画图讲解 的相关文章

  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐

  • RSA算法Java版(不要求支持大数)但实现了(dog

    RSA算法 支持大数 题目描述 C 中数据的类型与长度参考 因此 C 最大能支持的十进制是19位的整数 如果要支持更大的整数 需要实现Big Number类 RSA目前比较安全的密钥长度是2048位二进制 即是617位的十进制 因此 C 自
  • grafana 使用 Node Exporter for Prometheus Dashboard 监控服务器基础信息

    使用 Node Exporter for Prometheus Dashboard 监控服务器CPU 内存 磁盘 IO 网络 流量 温度等指标 当需要监控服务器的CPU 内存 磁盘 IO 网络 流量 温度等指标 可以使用 grafana 的
  • Eclipse 直接开发HANA UI5 ABAP等(提供完整配套软件 和jar包及操作文档)_SAP刘梦_新浪博客...

    之前写了HANA Studio 安装 ABAP UI5 插件等等 现在写下直接用Eclipse 有人说了现象 打开HANA Studio 做HANA建模 然后呢 打开个eclipse 做UI5 其实没必要 本来HAHA studio就是ec
  • Vue源码解读(六):update和patch

    Vue 的 update 是实例上的一个私有方法 主要的作用就是把 VNode 渲染成真实的 DOM 它在首次渲染和数据更新的时候被调用 在数据更新的时候会发生新 VNode 和 旧 VNode 对比 获取差异更新视图 我们常说的 diff
  • ChatGPT Plus价格太贵,可以约上三五知己一起上车体验一下,这个项目就能帮到你

    对于想体验ChatGPT PLus的小伙伴 可能觉得自己一个人一个月花费20美元 相对于人民币每月137多 确实是一个不少的开支 如果 几个人合作一个账号 这样负担就减少了 刚好 最近逛github发现刚好有一个这样的项目 项目介绍 Cha
  • is running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 2.6 GB

    背景 执行一个kylin任务 然后报错 TaskAttempt killed because it ran on unusable nodekylin1 dtwave dev local 8041 Container released on
  • excel发给别人图片全是代码_PHP读取Excel内的图片(附代码)

    php中文网最新课程 每日17点准时技术干货分享 今天接到了一个从Excel内读取图片的需求 在网上查找了一些资料 基本实现了自己的需求 不过由于查到的一些代码比较久远 里面一些库方法已经被移除不存在了 所以不能直接移植到自己的项目里 需要
  • 在python中如何让一个函数分段执行呢?

    在python中如何让一个函数分段执行呢 原因 最新在写分针的逻辑 最开始讲一大段代码分成好几个小的函数 讲函数放进数组中 每一帧执行一个 但总是觉得这样写不够优美 今天看到其他大神的代码 记录一下思路 前提要理解generator pyt
  • 【论文写作】——设置正文和标题格式

    目录 一 设置正文格式 二 设置标题格式 一 设置正文格式 找到功能区的样式 右键正文样式 点击修改 左下角选择字体 设置字体的字形字号 也可选择对正文的段落格式进行修改 二 设置标题格式 可直接将文中同一级别的大纲进行折叠 然后直接设置同
  • 拓数派发布新一代云原生虚拟数仓PieCloudDB

    3 月 14 日 2023 拓数派 Infinite Possibilities 战略暨新产品发布会在上海圆满落幕 拓数派创始人兼 CEO 冯雷 Ray Von 重磅发布基于新一代云原生数仓虚拟化打造的全新 PieCloudDB 云上云 版
  • (手工)【sqli-labs24】二次注入:原理、利用过程

    目录 推荐 一 手工 SQL注入基本步骤 二 Less24 POST Second Order injections Real treat Stored injections 简介 GET注入 二次注入 第一步 获知目标账号并注册 第二步
  • Git在码云上传大文件-lfs

    lfs的安装网上搜索 安装好后以下操作 注意 大文件使用SSH传输 上传前先配置好码云的私钥 git init 创建本地仓库环境 git lfs install 安装大文件上传应用 git lfs track 追踪要上传的大文件 表示路径下
  • 小程序拒绝摄像头授权,重新允许无法调起摄像头

    小程序拒绝摄像头授权 重新允许无法调起摄像头 公司项目需要做到自动拍照功能 发现如果用户拒绝了授权 再重新引导用户授权后 无法重新调用摄像头 然后做了各种尝试 发现是页面渲染camera问题 当用户进入页面拒绝或者允许授权时这个标签都已经被
  • Mysql 复习笔记- 基础篇3 [常见增删改查]

    Mysql 复习笔记 基础篇 3 常见增删改查 声明 此笔记不会出现比如说Mysql发展历史这种问题 多为实用的命令和使用中的必要知识 请海涵 这篇文档我们不会对查询进行复习 我们将会把查询的操作的部分放到了后面的查询文档中 我们将复习到级
  • qt 按钮单击的信号_QPushButton 点击信号分析

    QPushButton 点击信号分析 QPushButton有三个很重要的信号跟点击有关 pressed clicked toggled 表面上看 pressed和clicked都会在点击按钮时触发 它们有什么区别呢 toggled好像有时
  • React18:创建React项目(手动)

    项目结构 常规的React项目需要使用npm 或yarn 作为包管理器来对项目进行管理 并且React官方为了方便我们的开发 为我们提供react scripts包 包中提供了项目开发中的大部分依赖 大大的简化了项目的开发 开发步骤 1 创
  • GPIO口的脚本配置之——全志H3script.bin

    此脚本的作用之一是配置GPIO的默认状态 如 功能 内部电阻状态 驱动能力等 1 但是直接打开script bin 文件则会出现乱码 那么我们怎么才可以打开并更改该脚本的配置呢 在路径uboot kernel orangepi sdk to
  • PyTorch分布式训练进阶:这些细节你都注意到了吗?

    导语 pytorch作为目前主流的深度学习训练框架之一 可以说是每个算法同学工作中的必备技能 此外 pytorch提供了极其方便的API用来进行分布式训练 由于最近做的工作涉及到一些分布式训练的细节 在使用中发现一些之前完全不会care的点
  • cnn 验证集 参与训练吗_使用Sentencepiece +CNN进行文本分类

    1 前言 Sentencepiece是google开源的文本Tokenzier工具 其主要原理是利用统计算法 在语料库中生成一个类似分词器的工具 外加可以将词token化的功能 对比开源的分词器 它会将频繁出现的字符串作为词 然后形成词库进
  • 简而易懂的CPU和MMU画图讲解

    我们知道 程序文件一般放在硬盘上 当把程序运行起来时 程序被放入内存中 通过内存放入cache 通过cache进入cpu 下图中预取器就是负责从cache取出指令 然后由译码器译码 译码的作用就是要知道需要哪些寄存器配合完成指令 如该指令是