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

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

在内核启动早期,IOREMAP 分配器还没有初始化,内核需要在这个阶段访问 MMIO 或 RSVDMEM,因此内核采用 EARLY MMIO/RSVDMEM Mapping Area 来临时映射 RSVDMEM 和 MMIO. 内核提供了 Early MMIO/RSVDMEM Memory Allocator(早期 IO/预留内存分配器) 负责该区域内核虚拟内存的分配和页表映射,其属于固定映射内存分配器的一个分支。内核使用该分配器可以将内核虚拟内存映射到指定的 MMIO 和 RSVDMEM 上,那么内核就可以在启动阶段访问这些物理区域。当其任务完毕之后,内核会销毁该分配器, 然后专用功能完备的 IOREMAP 分配器, 那么分配器也属于临时映射分配器.

在 Intel X86 架构中,系统物理地址总线可寻址的空间称为存储域,其主要由两部分组成,一部分是 DDR 控制器管理的 DDR 域,另外一部分是由外设的寄存器映射到存储域的 MMIO (Memory-Mapped IO)。其中 PCI/PCIe 设备的寄存器映射到存储域的 MMIO 称为 PCI 总线地址, 另外 Intel X86 架构也通过 Host PCI 主桥/Root Port(RC) 维护一颗 PCI 总线,该 PCI 总线可寻址的空间称为 PCI 总线域. RSVD-MEM 指定是通过软件的手段让操作系统无法看到的物理内存,IO 在本文特指外设映射到存储域的 MMIO.

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

系统要能够访问 MMIO 或者 RSVD-Memroy,都需要分配一段虚拟地址,然后建立从虚拟地址到 MMIO/RSVD-MEM 的页表。但由于系统处于早期,整个内核空间并没有初始化完,因此不是所有的内核空间虚拟内存都可以使用,另外 IOREMAP 分配器要能真正运行起来还需要依赖其他分配器,但这个时候其他分配器也没有初始化准备好,因此内核为了解决系统早期对访问 MMIO/RSVD-MEM 的需求,提出了 Early IO/RESV-MEM 分配器的策略.

Early IO/RSVD-MEM Memory Allocator 的实现基于 Fixmap Memory Allocator, 分配器维护了 “fix_virt_virt(FIX_BTMAP_BEGIN)” 到 “fix_virt_virt(FIX_BTMAP_END)” 虚拟区域,由于 Fixmap Memory Allocator 的特性,这段虚拟区域是一个固定且预留做 Early IO/RSVD-MEM 分配器使用. 分配器一共包含 “NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS” 个 Index, 每个 Index 维护了 PAGE_SIZE 的虚拟区域, 分配器将这些 Index 按 NR_FIX_BTMAPS 粒度分成了 FIX_BTMAPS_SLOTS 个 Slot,因此每个 Slot 包含了 NR_FIX_BTMAPS 个 Index.

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

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

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