本期,边肖将为您带来关于CPU如何访问内存的信息。文章内容丰富,从专业角度进行分析和描述。看完这篇文章,希望你能有所收获。
内存管理可以说是一个难学的模块,这也是为什么难学的原因。首先,内存管理涉及硬件的实现原理和软件的复杂算法;第二,网上关于内存管理的错误解释太多了。我希望做一系列的内存管理,从硬件实现到底层内存分配算法,再从内核分配算法到应用内存分区,直到内存如何与硬盘交互等等。从而彻底了解内存管理的整个框架。下面主要讲解硬件原理和分页管理。
00-1010我们先来看一张图片:
从图中可以清楚地看到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、虚拟地址、页表和物理地址之间的关系如下:
页面包含每个页面所在的物理内存的基址。这些基址和页面偏移量的组合形成一个物理地址,可以发送到物理单元。
我们发现,如果采用一级页表,每个进程需要一个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是外部页表的页偏移量。
这就是上面边肖共享的中央处理器访问内存的方式。如果你恰好也有类似的疑惑,可以参考上面的分析来理解。想了解更多,请关注行业信息渠道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154598.html