《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
相关推荐
Fcy64830 分钟前
Linux下 进程间关系与守护进程
linux·运维·服务器·守护进程
码农小韩1 小时前
Linux驱动理论(二)——Linux字符设备驱动
linux·嵌入式软件开发·linux操作系统·linux应用开发·linux驱动理论
well06121 小时前
Linux粘滞位与Makefile机制深度解析
linux·运维·服务器
再写一行代码就下班1 小时前
linux sh脚本在windows修改导致无法使用解决方式
java·linux·centos
额额额对了1 小时前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
子木HAPPY阳VIP2 小时前
Ubuntu 关闭防火墙操作步骤
linux·运维·ubuntu
王振超wzc2 小时前
嵌入式开发环境搭建--WM软件安装,Ubuntu操作系统安装
linux·运维·ubuntu
GeW4 小时前
制造强国底座:Linux与数据库驱动的新型工业基础设施
linux
xiaoye-duck4 小时前
《Linux 网络编程》深入理解 IO 多路复用:select 函数详解与 Echo 服务实战
linux·网络
Tairitsu_H4 小时前
[Linux系统] 命令行参数 | 环境变量 | 程序地址空间
linux·环境变量·命令行参数·程序地址空间