在系统内存映射(也称为cpu内存映射)中,将地址范围分配给RAM内存范围,将MMIO分配给PCI设备等。
让我们举一个例子,其中RAM的地址范围从地址0开始到最大512MB,其中包括DOS兼容性内存空间从0开始到最大1MB。
现在,当我们说这512MB的区域将被映射到内存中时,这是否意味着CPU地址空间中的地址0将被映射到物理RAM中的地址0,并且相同的最大为512MB?如果没有,那么如何完成映射?
在CPU地址空间中分配的内存地址范围也将完全等于系统中安装的RAM的大小吗?如果不是这种情况,那么在这种情况下如何进行映射?
还要如何完成DOS兼容区域的内存映射?如果使用非DOS的操作系统,该区域是否会被闲置到内存中?
内存映射是否还意味着当CPU生成从0到512 MB的地址时,将仅将其重定向到RAM中? MMU永远不会将CPU生成的任何其他地址引导到RAM中吗?在这种情况下,所有应用程序的地址都将介于0到512MB之间,以便访问内存?
我在这里考虑使用x86系统。
答案 0 :(得分:1)
我认为这个问题中混入了多个概念,希望这个答案可以弄清楚(有点)。
首先,我认为重新表述该问题将很有用。我了解您想知道的内容,但是最初提出的方式引起了一些混乱,因为一个以上的问题不只一个。我想您想知道的是:
处理器使用的逻辑地址如何转换为主存储器的物理地址
b)如何将其他存储设备(例如磁盘)中的地址映射到主存储器中
问题a)的内存管理系统由特殊硬件实现;问题b)是指虚拟内存和页面调度,该内存管理系统是通过硬件和系统软件的组合来实现的。内存映射属于问题b),虽然受操作系统的影响很大,但现代微处理器提供了硬件元素来帮助进行此映射,因此它不是操作系统专有的(但绝大部分是!)。
我想引入术语“虚拟内存”:基本上是一个概念,它允许程序从逻辑的角度解决内存问题。使用虚拟内存时,机器指令的地址字段包含虚拟地址。
我也将使用“主存储器”代替DRAM。大多数现代处理器中的主内存是DRAM(而不是其他类型的内存)与物理到逻辑地址转换的基本概念无关。
第一个问题的答案:
快速解答:每个虚拟地址都通过内置的硬件存储器管理单元转换为主存储器中的物理地址。
更多解释:
处理器需要以寄存器形式的自己的本地存储器。在这里,我们需要以其逻辑形式显示地址。 为了知道如何在物理内存中找到这些地址,有一种称为内存管理单元(MMU)的硬件可以解决问题。
有兴趣的人请注意:高速缓存可以加快传输过程,但不执行转换,它可以是逻辑的(放置在MMU和处理器之间,因此处理逻辑地址)或物理的(在主内存和MMU之间,因此可以处理物理地址。
现在是问题b:
如何将地址从系统中的其他内存加载并映射到主内存涉及另一个内存管理系统。在继续之前,请注意加载到主存储器中的进程包含数据项和指令的地址。逻辑地址是相对于程序开始的位置;程序中的指令只有逻辑地址。当处理器从逻辑转换为物理时,它会自动使用基地址进行转换(这涉及到您的第3段中的问题)。此硬件功能旨在与OS配合使用,并且将取决于OS使用的内存管理策略。硬件和软件结合使用以管理虚拟内存。
在这种情况下,要进一步扩展虚拟内存的概念,了解分页(尤其是要求分页)非常重要。我认为这是指问题的另一个方面,其中提到了内存映射。粗略地说,程序可以分为几个小块,然后装入内存。这些块称为页面,并且将它们分配给内存块(称为帧)。操作系统为与每个页面的框架位置相关的每个进程维护一个页面表。程序中的每个逻辑地址都有一个页码和一个页面内的相对地址(逻辑到物理的转换仍由处理器硬件完成)。 在需求分页中,仅在需要时才引入每个页面:我们不需要将所有流程都加载到主存储器中,只需加载当前计算状态所需的部分即可。结果,一个进程可以大于所有主存储器。如果我们没有按需分页功能,那么我们将无法编写比内存更大的程序。如果我们想这样做,那么我们需要将程序分成适合主内存的块(子例程,数据等),然后一次加载一个(我不确定,但是我想知道打孔卡的情况如何) ?)。通过按需分页,操作系统和硬件可以解决这一问题。结果,我们感觉到内存比实际内存大得多。这种较大的感知内存称为虚拟内存。 因此,现在回到问题所在,答案是:硬件和操作系统负责将所需进程的各个部分加载到内存中,并且它们通过使用虚拟内存(分页)来完成。
与特定的分页过程有关,如果您想了解更多信息,我将在以后编辑一些参考文献。
(在输入评论后添加到原始帖子中)
回应评论,并进一步澄清。如前所述,转换是通过硬件实现的,并且在许多情况下是与OS结合使用的。要查找有关具体如何完成翻译的更多详细信息,您需要参考所用特定微处理器的手册。分页和虚拟内存直接影响地址转换的方式。例如,在Intel64中,您可以设置未分段的未分页内存,这对某些特定类型的应用程序很有用。在这种情况下,虚拟地址与物理地址相同。但是,一旦从这种观点出发,您就获得了将物理地址转换为处理器的页面的其他可能性。在第3A卷第2章中,对内存管理和翻译进行了简要说明:
系统架构概述
2.1.5内存管理
系统体系结构支持内存的直接物理寻址或虚拟内存(通过分页)。使用物理寻址时,线性地址被视为物理地址。使用分页时:所有的代码,数据,堆栈和系统段(包括GDT和IDT)都可以在物理内存中仅保留最近访问的页面的情况下进行分页。 页面(有时称为页面框架)在物理内存中的位置包含在分页结构中。这些结构驻留在物理内存中(对于32位分页,请参见图2-1)。 分页结构层次结构的基本物理地址包含在控制寄存器CR3中。分页结构中的条目确定页面框架基础的物理地址,访问权限和内存管理信息。 要使用这种分页机制,线性地址分为多个部分。这些部分为页面结构和页面框架提供了单独的偏移量。一个系统可以具有一个或多个分页结构的层次结构。例如,每个任务可以具有自己的层次结构。
2.1.5.1 IA-32e模式下的内存管理
在IA-32e模式下,物理内存页由一组系统数据结构管理。在兼容模式和64位模式下,使用四个级别的系统数据结构。这些包括:
•页面映射级别4(PML4)-PML4表中的条目包含页面目录指针表的基础的物理地址,访问权限和内存管理信息。 PML4的基本物理地址存储在CR3中。
•一组页面目录指针表-页面目录指针表中的条目包含页面目录表的基础的物理地址,访问权限和内存管理信息。
•页面目录集-页面目录表中的条目包含页面表基础的物理地址,访问权限和内存管理信息。
•页表集—页表中的条目包含页框的物理地址,访问权限和内存管理信息。
有关HOW的详细信息,很大程度上取决于设置/模式。但是举个例子,以第3章为例,它解释了在保护模式下它是如何发生的:
3.4逻辑和线性地址 在保护模式下的系统架构级别,处理器使用地址转换的两个阶段来到达物理地址:逻辑地址转换和线性地址空间分页…..etc等。
(查看不同手册的目录将显示在哪里)
可在此处找到有关Intel64的手册:
https://software.intel.com/en-us/articles/intel-sdm
对于其他体系结构(在下图的示例中为ARM),将使用其他转换机制。 ARM引入了TLB(转换后备缓冲器),转换架构与Intel(在下图也有很大不同)。
图片取自Stallings关于计算机体系结构的经典教科书。这是一本非常好的书,如果您对建筑感兴趣的话,值得一读。
我确实不同意这个评论(虚拟内存与答案无关):分页的实现确实会影响从物理(在主内存中)到逻辑(在CPU中)的内存转换,如上面的示例所示。
很抱歉,如果初始答案不够完整或不够简洁,我不太确定OP想要知道什么,但我认为此注释有助于澄清它。我认为答案的第一部分将在后面介绍。
(最后编辑:重新阅读评论:我看到我对分页链接到文件的内存访问的解释使事情变得更远,并且可能增加了混乱。我希望第二部分有助于阐明为什么分页)
答案 1 :(得分:1)
在讨论问题之前,值得研究DRAM architecture。
现在,当我们说这512MB的区域将被映射到内存中时,这是否意味着CPU地址空间中的地址0将被映射到物理RAM中的地址0,并且相同的最大为512MB?如果没有,那么如何完成映射?
DRAM中没有确切的“地址0”概念,而是一种通道, DIMM ,等级的体系结构>,芯片,库,行和列,并且DRAM控制器生成“命令”来激活部分DRAM并从单元中选择数据:
所以第一个问题的答案是否定的。正如其他人所提到的,确切的映射是复杂的,没有文档记录。如果您有兴趣,AMD会提供documentation(第2.10和3.5节),并且尝试reverse engineering Intel的映射(第4节)。
在CPU地址空间中分配的内存地址范围也将完全等于系统中安装的RAM的大小吗?如果不是这种情况,那么在这种情况下如何进行映射?
由于许多原因,答案是否定的。您回答了其中之一:物理地址空间不仅仅代表RAM /内存,还有PCIe设备,ROM(BIOS所在的位置)等等,因此有memory holes。要检查物理地址在系统中对应的内容,请在Linux中查看/proc/iomem
,因为它具有映射。
还要如何完成DOS兼容区域的内存映射?如果使用非DOS的操作系统,该区域是否会被闲置到内存中?
是的,我相信这些是未使用的内存孔。
内存映射是否还意味着当CPU生成从0到512 MB的地址时,将仅将其重定向到RAM中? MMU永远不会将CPU生成的任何其他地址引导到RAM中吗?在这种情况下,所有应用程序的地址都将介于0到512MB之间,以便访问内存?
MMU的用途完全不同。看一下虚拟地址到物理地址的转换。