v12*_*123 6 memory x86 cpu-architecture memory-address mmu
在系统内存映射(也称为 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 中?CPU 生成的任何其他地址永远不会被 MMU 定向到 RAM 中?在这种情况下,所有应用程序的地址都在 0 到 512MB 之间,以便访问内存?
我在这里考虑使用 x86 系统。
在讨论这个问题之前,有必要先了解一下DRAM 架构。
现在,当我们说这 512MB 的区域将被映射到内存时,这是否意味着 CPU 地址空间中的地址 0 将被映射到物理 RAM 中的地址 0,并且同样会映射到 512MB?如果不是那么映射是如何完成的?
DRAM 中并不存在“地址 0”的概念,而是存在通道、DIMM、列、芯片、组、行和列的架构,并且 DRAM 控制器生成激活 DRAM 部分的“命令”并从单元格中选择数据:
所以第一个问题的答案是否定的。正如其他人提到的,确切的映射很复杂并且没有记录。如果您有兴趣,AMD 确实提供了文档(第 2.10 节和 3.5 节),并且尝试对英特尔的映射进行逆向工程(第 4 节)。
另外,CPU 地址空间中分配的内存地址范围是否与系统中安装的 RAM 的大小完全相同?如果不是这种情况那么在这种情况下映射将如何进行?
由于多种原因,答案也是否定的。你回答了其中之一:物理地址空间不仅仅代表RAM/内存,还有PCIe设备、ROM(BIOS所在的位置)等,因此存在内存漏洞。要检查物理地址在系统中对应什么,请在 Linux 中查看/proc/iomem,因为它具有映射。
另外,DOS兼容区域的内存映射是如何完成的?如果使用 DOS 以外的操作系统,该区域是否会在内存中未被使用?
是的,我相信这些是未使用的内存漏洞。
另外,内存映射是否意味着当CPU生成0到512MB的地址时,只会重定向到RAM中?CPU 生成的任何其他地址永远不会被 MMU 定向到 RAM 中?在这种情况下,所有应用程序的地址范围都在 0 到 512MB 之间,以便访问内存?
MMU 具有完全不同的目的。看一下虚拟地址到物理地址的转换。