《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
相关推荐
光而不耀@lgy1 小时前
C++初登门槛
linux·开发语言·网络·c++·后端
偶尔微微一笑1 小时前
AI网络渗透kali应用(gptshell)
linux·人工智能·python·自然语言处理·编辑器
Run1.1 小时前
深入解析 Linux 中动静态库的加载机制:从原理到实践
linux·运维·服务器
The Mr.Nobody1 小时前
STM32MPU开发之旅:从零开始构建嵌入式Linux镜像
linux·stm32·嵌入式硬件
老兵发新帖2 小时前
Ubuntu 上安装 Conda
linux·ubuntu·conda
秋秋秋秋秋雨2 小时前
linux安装单节点Elasticsearch(es),安装可视化工具kibana
linux·elasticsearch·jenkins
码农hbk2 小时前
linux ptrace 图文详解(七) gdb、strace跟踪系统调用
linux·服务器
hotlinhao3 小时前
ThinkPHP6模型中多组条件逻辑或Or查询的使用
linux·服务器·数据库
Jogging-Snail3 小时前
从零开始掌握Linux数据流:管道与重定向完全指南
linux·运维·管道·重定向·linux 数据流·管道原理
niuTaylor3 小时前
Linux驱动开发快速上手指南:从理论到实战
linux·运维·开发语言·驱动开发·c#