《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 4】【Qemu 如何模拟numa架构】

我们在学习 linux 内核时,会涉及到很多 numa 的知识,那我们该如何在 qemu 中模拟这种情况,来配合我们的学习呢?

我们该如何模拟 如下的 numa 架构

Qemu 模拟 NUMA 架构

shell 复制代码
-M virt,gic-version=3,virtualization=on,type=virt \
-cpu cortex-a57 -nographic -m 4G \
-smp cores=4,threads=1,sockets=2 \
-object memory-backend-ram,id=mem0,size=2G  \
-object memory-backend-ram,id=mem1,size=2G  \
-numa node,memdev=mem0,cpus=0-3,nodeid=0 \
-numa node,memdev=mem1,cpus=4-7,nodeid=1 \

1. 基础虚拟化参数

-M virt,gic-version=3,virtualization=on,type=virt

  • -M virt: 指定机器类型为 virt,这是一个通用的虚拟平台

  • gic-version=3: 使用 GICv3 (Generic Interrupt Controller version 3) 中断控制器

  • virtualization=on: 启用虚拟化支持

  • type=virt: 进一步指定虚拟平台类型

2. CPU 配置

-cpu cortex-a57 -nographic -m 4G

  • -cpu cortex-a57: 模拟 ARM Cortex-A57 处理器

  • -nographic: 不使用图形界面,直接输出到控制台

  • -m 4G: 为虚拟机分配 4GB 内存

3. SMP (对称多处理) 配置

-smp cores=4,threads=1,sockets=2

  • cores=4: 每个 CPU socket 有 4 个核心

  • threads=1: 每个核心 1 个线程 (无超线程)

  • sockets=2: 2 个 CPU sockets

  • 总 CPU 数 = sockets × cores × threads = 2 × 4 × 1 = 8 个 CPU

4. 内存后端配置

-object memory-backend-ram,id=mem0,size=2G

-object memory-backend-ram,id=mem1,size=2G

  • 创建两个内存后端对象:

    • mem0: 2GB RAM

    • mem1: 2GB RAM

  • 总共 4GB (2G + 2G) 内存,与 -m 4G 匹配

5. NUMA 配置

-numa node,memdev=mem0,cpus=0-3,nodeid=0

-numa node,memdev=mem1,cpus=4-7,nodeid=1

  • 定义两个 NUMA 节点:

    • 节点 0:

      • 使用 mem0 内存后端 (2GB)

      • 关联 CPU 0-3 (即第一个 socket 的 4 个核心)

      • 节点 ID 为 0

    • 节点 1:

      • 使用 mem1 内存后端 (2GB)

      • 关联 CPU 4-7 (即第二个 socket 的 4 个核心)

      • 节点 ID 为 1

6. 这种配置的特点

  1. NUMA 特性:CPU 访问本地节点内存比访问远程节点内存更快

  2. CPU 拓扑

    • Socket 0: CPU 0-3 (关联 Node 0)

    • Socket 1: CPU 4-7 (关联 Node 1)

  3. 内存分布:内存平均分布在两个节点上,各 2GB

这种配置非常适合测试和开发 NUMA 相关的应用程序或内核功能,比如:

  • NUMA 感知的内存分配策略

  • 进程/线程绑定到特定 NUMA 节点

  • 内存访问性能优化等

7. 可运行的配置如下:

shell 复制代码
/home/leo/data_4t/github/kernel_version/qemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \
    -nographic \
    -M virt,gic-version=3,virtualization=on,type=virt \
    -cpu cortex-a57 -nographic -m 4G \
    -smp cores=4,threads=1,sockets=2 \
    -object memory-backend-ram,id=mem0,size=2G  \
    -object memory-backend-ram,id=mem1,size=2G  \
    -numa node,memdev=mem0,cpus=0-3,nodeid=0 \
    -numa node,memdev=mem1,cpus=4-7,nodeid=1 \
    -kernel /home/leo/data_4t/github/kernel_version/linux-5.4/build/arch/arm64/boot/Image \
    -append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
    -initrd /home/leo/data_4t/github/kernel_version/initrd.ext4
相关推荐
DFT计算杂谈1 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
Zhang~Ling2 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind2 小时前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock
爱写代码的森2 小时前
蒙三方库 | harmony-utils之FileUtil文件重命名与属性查询详解
linux·运维·服务器·华为·harmonyos·鸿蒙·huawei
XMAIPC_Robot3 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
重生的黑客4 小时前
Linux 进程优先级、切换与调度:从孤儿进程到 O(1) 调度模型
linux·运维·服务器·进程优先级·nice
骑上单车去旅行5 小时前
MD5校验对比脚本
linux·服务器·windows
平生幻5 小时前
Linux 常用命令
linux
ShirleyWang0127 小时前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s
liuccn7 小时前
Linux 存储系统:LVM 与直接分区
linux·运维