概述

本节介绍 CXL Type-3 内存设备的配置过程,以及最终如何通过内核的页面分配器将其作为 DAX 设备或普通内存页面暴露给用户。

标有项目符号的部分是生成某些内核对象的点。

  1. 早期启动

  1. BIOS、构建和启动参数

  1. EFI_MEMORY_SP

  2. CONFIG_EFI_SOFT_RESERVE

  3. CONFIG_MHP_DEFAULT_ONLINE_TYPE

  4. nosoftreserve

  1. 内存映射创建

  1. EFI 内存映射 / E820 咨询软保留

  • CXL 内存被预留由 CXL 驱动程序处理

  • 为 CFMWS 条目创建软保留 IO 资源

  1. NUMA 节点创建

  • 节点从 ACPI CEDT CFMWS 和 SRAT 邻近域 (PXM) 创建

  1. 内存层创建

  • 使用所有节点创建一个默认的 memory_tier。

  1. 连续内存分配

  • 任何请求的 CMA 都从在线节点分配

  1. 初始化完成,驱动程序开始探测

  1. ACPI 和 PCI 驱动程序

  1. 检测 PCI 设备是否为 CXL,将其标记为由 CXL 驱动程序探测

  1. CXL 驱动程序操作

  1. 基本设备创建

  • 创建 root、端口和 memdev 设备

  • CEDT CFMWS IO 资源创建

  1. 解码器创建

  • 创建 root、交换机和端点解码器

  1. 逻辑设备创建

  • 创建 memory_region 和端点设备

  1. 设备彼此关联

  • 如果使用自动解码器(BIOS 编程的解码器),驱动程序会验证配置,构建关联,并在探测时锁定配置。

  • 如果用户配置,则验证和关联在解码器提交时构建。

  1. 区域作为 DAX 区域公开

  • 创建 dax_region

  • 通过 DAX 驱动程序创建 DAX 设备

  1. DAX 驱动程序操作

  1. DAX 驱动程序将 DAX 区域作为两种 dax 设备模式之一公开

  • kmem - dax 设备转换为热插拔内存块

    • DAX kmem IO 资源创建

  • hmem - dax 设备保留为 daxdev,可以作为文件访问。

    • 如果是 hmem,则到此结束。

  1. DAX kmem 将内存区域公开给内存热插拔,以作为“驱动程序管理的内存”添加到页面分配器

  1. 内存热插拔

  1. mhp 组件将 dax 设备内存区域作为多个内存块公开给页面分配器

  • 块出现在 /sys/bus/memory/devices 中并链接到 NUMA 节点

  1. 块已联机到请求的区域(NORMAL 或 MOVABLE)

  • 内存被标记为“驱动程序管理”,以避免 kexec 将其用作内核更新的区域