我们先来看一张图:

从图中可以清晰地看出,CPU、MMU、DDR 这三部分在硬件上是如何分布的。首先 CPU 在访问内存的时候都需要通过 MMU 把虚拟地址转化为物理地址,然后通过总线访问内存。MMU 开启后 CPU 看到的所有地址都是虚拟地址,CPU 把这个虚拟地址发给 MMU 后,MMU 会通过页表在页表里查出这个虚拟地址对应的物理地址是什么,从而去访问外面的 DDR(内存条)。

所以搞懂了 MMU 如何把虚拟地址转化为物理地址也就明白了 CPU 是如何通过 MMU 来访问内存的。

MMU 是通过页表把虚拟地址转换成物理地址,页表是一种特殊的数据结构,放在系统空间的页表区存放逻辑页与物理页帧的对应关系,每一个进程都有一个自己的页表。

CPU 访问的虚拟地址可以分为:p(页号),用来作为页表的索引;d(页偏移),该页内的地址偏移。现在我们假设每一页的大小是 4KB,而且页表只有一级,那么页表长成下面这个样子(页表的每一行是32个 bit,前20 bit 表示页号 p,后面12 bit 表示页偏移 d):

CPU,虚拟地址,页表和物理地址的关系如下图:

页表包含每页所在物理内存的基地址,这些基地址与页偏移的组合形成物理地址,就可送交物理单元。

转自于:公众号《人人都是极客》

https://mp.weixin.qq.com/s?__biz=MzIxMjE1MzU4OA==&mid=2648917864&idx=1&sn=faef63ed9f60ac7edc5e3b524b3c2e88&chksm=8f5d82f3b82a0be5bc9680310928dc304dd8857e0b2dd17efe3c577f898307947747b70997a5&scene=21#wechat_redirect

(若侵则删)

(SAW:Game Over!)

OS / CPU是如何访问内存的?相关推荐

  1. 字节终面:CPU 是如何读写内存的?

    如果你觉得这是一个非常简单的问题,那么你真应该好好读读本文,我敢保证这个问题绝没有你想象的那么简单. 注意,一定要完本文,否则可能会得出错误的结论. 闲话少说,让我们来看看CPU在读写内存时底层究竟发 ...

  2. 【Android 逆向】ARM CPU 架构体系 ( ARM 内存模型 | ARM 架构堆的实现 | ARM 架构栈的实现 )

    文章目录 一.ARM 内存模型 二.ARM 架构堆的实现 三.ARM 架构栈的实现 一.ARM 内存模型 ARM 架构体系中 , CPU 直接访问内存 , 控制内存中的状态和数据 , 内存中映射外部设 ...

  3. Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA

    一些书籍 读书的原则:不求甚解,观其大略 你如果进到庐山里头,二话不说,蹲下头来,弯下腰,就对着某棵树某棵小草猛研究而不是说先把庐山的整体脉络跟那研究清楚了,那么你的学习方法肯定效率巨低而且特别痛苦, ...

  4. JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数 ...

  5. JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:fredal https://fredal.xin/java ...

  6. 从 CPU、磁盘、内存、网络、GC 一条龙!JAVA 线上故障排查完整套路

    线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...

  7. 高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)

    文章目录 概述 volatile定义 CPU缓存 相关CPU术语 CPU缓存一致性协议MESI 带有高速缓存的CPU执行计算的流程 CPU 多级的缓存结构 Java 内存模型 (JMM) 线程通信的两 ...

  8. python 监控linux硬盘,Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例...

    由于项目的需要,需要做一个简单监控服务器的CPU利用率.CPU负载.硬盘使用率.内存利用率和服务器的各个端口的开启情况的程序,并把结果通知到监控平台,如果出现异常,监控平台打电话或者发短信通知给具体的 ...

  9. linux c语言变量地址类型,C语言基础知识:访问内存地址的方法

    汇编语言寄存器间接寻址方法 #define GPJ0CON0xE0200240 ldr r0, =GPJ0CON //把地址值赋给寄存器r0,从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断 ...

最新文章

  1. poj1741(树的点分治)
  2. 一步一个脚印学习WCF系列之WCF概要—WCF出现的目的(一)
  3. android高德地图显示多点标记,高德地图多点标记自定义地图
  4. JPA(三)之实体关系一对多(多对一)
  5. 今日定工资,不知是涨是跌,最迟明晚反馈
  6. 《喜剧之王》- 24/7 - Cagnet
  7. 《Head First设计模式》第二章笔记 观察者模式
  8. c++如何将两个if函数合并_Excel中的VLOOKUP函数,8种使用技巧与你分享
  9. Spring Boot官宣:正式弃用 Java 8
  10. linux怎么显示目录层次结构,Linux基础(层级结构、基础命令)
  11. unity多人联机插件_Mirror ---Unity多人联机游戏API(一)
  12. [转]如何写出让同事无法维护的代码?
  13. Shell常用命令大全
  14. 常用的17个运维监控系统(必备知识)
  15. (转帖)-对乒乓球的思考
  16. 识别括号或花括号嵌套
  17. 云南民族大学计算机网络期末试卷,云南民族大学附中2018届高三上学期期末考试物理试卷【附答案】...
  18. 老鹰:我要抓走倒数第K个小鸡
  19. ROSMoveit中机械臂的点动(Jog)实现
  20. 如何优雅的DIY一个高大上的小台灯

热门文章

  1. learn Linux sed command
  2. Spring.Web.Mvc 注入(控制器属性注入)
  3. Ubuntu 14.04 DNS 配置
  4. android下m、mm、mmm编译命令的使用
  5. 猪的诱惑(2005-12-25 15:45:05)(新浪)
  6. 服务端第三次课程:面向切面编程AOP
  7. 截屏工具Snipaste使用指南
  8. docker ctr crictl命令对比图
  9. Ansible自动化运维应用场景分析
  10. 【收藏】Vue+elementUI的this.$refs.对象名.方法名的理解