图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

将 CPU 地址总线可以寻址的范围称为物理地址空间(Physical Address Space), 且寻址的地址称为物理地址(Physical Address), 那么物理地址空间将会是一块连续的线性区域. 在 Intel X86 架构中,物理地址空间其主要由三部分组成:

  • 第一部分是 DDR 控制器映射的 DDR 域
  • 第二部分是 PCI 总线域映射到存储域的 PCI 总线地址
  • 第三部分是设备内部存储空间映射到存储域的区域

将第二部分和第三部设备 IO 映射到存储域的,统一称为 MMIO(Memory Mapping IO)。Intel X86 架构也通过 Host PCI 主桥维护一颗或多颗 PCI 总线,每条 PCI 总线构成独立的空间称为PCI 总线域.

在 X86 架构中,物理地址空间的长度和 PCI 总线域的长度是相同的,并且 DDR 域的地址可以映射到物理地址空间,也可以映射到 PCI 总线域,同理 PCI 域的地址也可以映射到物理地址空间,且该地址在物理地址空间上称为 PCI 总线地址

上图是一个典型的 X86 架构物理地址空间分布图,可以看到物理地址空间并不等效于 DDR 域空间,物理空间被划分成了几个大区域,因此并不是物理地址空间都是内存条的内存。

DDR 域

DDR 内存控制器可以看到完整的 DDR 域空间,并且是一块连续的地址空间, 那么内存条内存是如何映射到物理地址空间呢? 首先了解一下 DDR 域空间, DDR 域空间一般分作 3 类:

  • 第一类是直接映射到物理地址空间的区域
  • 第二类是重映射到物理地址空间的区域
  • 第三类是系统进入 SMM 模式才可以访问的区域

DDR 域的 [0x00000000, Reclaim Base] 区域直接映射到了物理地址空间 0x00000000 开始之后的区域,DDR 域 [0x100000000, MESEG Base] 区域直接映射到物理地址空间的 [0x100000000, Recliam Base] 区域。DDR 域接着采用 Reclaim 技术将 DDR 域的 [Reclaim Base, 0x100000000] 映射到物理地址空间 Reclaim Base 之后的区域.

MMIO and PIO

在 X86 架构中,不仅存在物理地址空间,还存在 IO 空间,外设可以将其内部寄存器映射到 IO 空间,然后 CPU 可以使用 IN/OUT 指令方式访问外设的寄存器, 那么称 IO 空间的地址为 IO Port(PIO); 外设也可以将其内存寄存器映射到物理地址空间上,然后 CPU 可以像访问内存一样访问外设,那么称这种方式为 MMIO(Memory Mapping IO). X86 架构并没有像其他架构一样将 IO 空间和物理地址空间进行统一编址,而是采用独立编址并需要不同的指令进行访问,但外设可以在硬件映射时选择映射到 IO 空间还是 MMIO.

可以在系统中通过 “/proc/ioports” 节点查看系统 IO 空间的布局,可以看到映射了很多外设的寄存器,包括查看 PCIe 配置空间的 0xCFC 和 0xCF8 端口,又例如映射 DMA 内存寄存器的端口.

可以在系统中通过 “/proc/iomem” 节点查看系统物理地址空间的布局,可以看到系统物理内存和 MMIO 空间,包括系统内存、PCIe 设备的 MMIO、LAPIC 映射的 MMIO 等.

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片