cpu为什么可以直接访问内存(cpu是如何访问内存的)

技术CPU是如何访问内存的这期内容当中小编将会给大家带来有关CPU是如何访问内存的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内存管理可以说是一个比较难学的模块,之所以比较难学。一是

本期,边肖将为您带来关于CPU如何访问内存的信息。文章内容丰富,从专业角度进行分析和描述。看完这篇文章,希望你能有所收获。

内存管理可以说是一个难学的模块,这也是为什么难学的原因。首先,内存管理涉及硬件的实现原理和软件的复杂算法;第二,网上关于内存管理的错误解释太多了。我希望做一系列的内存管理,从硬件实现到底层内存分配算法,再从内核分配算法到应用内存分区,直到内存如何与硬盘交互等等。从而彻底了解内存管理的整个框架。下面主要讲解硬件原理和分页管理。

00-1010我们先来看一张图片:

CPU是如何访问内存的

从图中可以清楚地看到CPU、MMU和DDR是如何在硬件中分布的。首先,CPU访问内存时,需要通过MMU将虚拟地址转换为物理地址,然后通过总线访问内存。MMU开启后,CPU看到的所有地址都是虚拟地址。CPU将这个虚拟地址发送给MMU后,MMU会在页表中找出这个虚拟地址对应的物理地址是什么,从而访问外部DDR(记忆棒)。

因此,了解MMU如何将虚拟地址转换为物理地址将有助于您了解CPU如何通过MMU访问内存。

MMU通过页表将虚拟地址转换为物理地址,这是一种特殊的数据结构。它被放置在系统空间的页表区域中,以存储逻辑页和物理页框架之间的对应关系。每个进程都有自己的页表。

CPU访问的虚拟地址可以分为:p(页码),作为页表的索引;d(页面偏移量),页面内的地址偏移量。现在我们假设每页的大小为4KB,页表只有一级,那么页表看起来是这样的(页表的每行有32位,前20位代表页码P,后12位代表页面偏移量D):

CPU是如何访问内存的

CPU、虚拟地址、页表和物理地址之间的关系如下:

CPU是如何访问内存的

页面包含每个页面所在的物理内存的基址。这些基址和页面偏移量的组合形成一个物理地址,可以发送到物理单元。

我们发现,如果采用一级页表,每个进程需要一个4 MB的页表(如果虚拟地址空间为32位(即4GB),每个页面映射4KB,每个页表项占用4MB,那么进程需要1M的页表项(4GB/4KB=1M),即页表(每个进程有一个页表)占用4 MB (1 M * 4B=4 MB)。但是对于大多数程序来说,它们使用的空间远远不是4GB,那么为什么要映射不可能使用的空间呢?也就是说,一级页表覆盖了整个4GB的虚拟地址空间,但是如果不使用一级页表的页表条目,就不需要创建这个页表条目对应的二级页表,也就是说,只有在需要的时候才能创建二级页表。做一个简单的计算,假设只使用了20%的一级页表条目,那么页表占用的内存空间只有0.804 MB(1k * 4b 0.2 * 1k * 1k * 4b=0.804 MB)。除了在需要时创建辅助页表,该页还可以从磁盘传输到内存。只有主页表在内存中,只有一个次页表在内存中,其余的都在磁盘中(虽然这样效率很低)。此时页表占用8KB(1K * 4B 1 * 1K * 4B=8KB),远小于上一步的0.804MB。总之,使用多级页表可以节省内存。

第二级页表是重新分页页表。还是以之前的32位系统为例,一个逻辑地址分为20位页码和12位页偏移量d,因为页表要重新分页,所以页号可以分为10位页码p1和10位页偏移量p2。其中p1用于访问外部页表的索引,p2是外部页表的页偏移量。

CPU是如何访问内存的

CPU是如何访问内存的

这就是上面边肖共享的中央处理器访问内存的方式。如果你恰好也有类似的疑惑,可以参考上面的分析来理解。想了解更多,请关注行业信息渠道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154598.html

(0)

相关推荐

  • spring基于领域分析设计的架构规范

    技术spring基于领域分析设计的架构规范本篇内容主要讲解“spring基于领域分析设计的架构规范”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring基于领域分析设计的

    攻略 2021年11月16日
  • 如何理解Java设计模式的装饰模式

    技术如何理解Java设计模式的装饰模式这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年11月8日
  • RHEL7的基本命令有哪些呢

    技术RHEL7的基本命令有哪些呢今天就跟大家聊聊有关RHEL7的基本命令有哪些呢,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。本节单词整理:Termnial :

    攻略 2021年11月11日
  • C++为什么构造函数中应该做的是初始化而不是赋值

    技术C++为什么构造函数中应该做的是初始化而不是赋值本篇内容介绍了“C++为什么构造函数中应该做的是初始化而不是赋值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这

    攻略 2021年11月29日
  • 如何进行Docker Swarm 集群环境搭建及弹性服务部署

    技术如何进行Docker Swarm 集群环境搭建及弹性服务部署如何进行Docker Swarm 集群环境搭建及弹性服务部署,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能

    攻略 2021年12月10日
  • Python如何爬取觅知网素材图片

    技术Python如何爬取觅知网素材图片这篇文章主要讲解了“Python如何爬取觅知网素材图片”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python如何爬取觅知网素材图

    攻略 2021年11月28日