Skip to the content.

kvm selftests

现在我已经完成了 KVM selftests 的分析和测试运行。以下是完整分析报告:

KVM Selftests 运行分析报告

1. 测试框架架构

┌─────────────────────────────────────────────────────────────────────┐
│                    KVM Selftests 架构                                │
├─────────────────────────────────────────────────────────────────────┤
│  测试层 (Test Layer)                                                │
│  ├── 通用测试: demand_paging_test, dirty_log_test, irqfd_test...    │
│  └── x86 特定: x86/cpuid_test, x86/vmx_*, x86/svm_*...              │
├─────────────────────────────────────────────────────────────────────┤
│  测试框架 (Test Framework)                                           │
│  ├── include/kvm_util.h        - 核心 KVM API 封装                   │
│  ├── include/kvm_test_harness.h - 测试用例宏定义                     │
│  └── lib/kvm_util.c            - VM/VCPU 管理实现                    │
├─────────────────────────────────────────────────────────────────────┤
│  架构抽象层 (Arch Abstraction)                                       │
│  ├── lib/x86/processor.c       - x86 CPU 相关操作                    │
│  ├── lib/x86/vmx.c             - Intel VMX 支持                      │
│  ├── lib/x86/svm.c             - AMD SVM 支持                        │
│  └── lib/arm64/, lib/s390/...  - 其他架构支持                        │
├─────────────────────────────────────────────────────────────────────┤
│  内核接口 (Kernel Interface)                                         │
│  └── /dev/kvm ioctl 接口封装                                         │
└─────────────────────────────────────────────────────────────────────┘

2. 测试分类

 类别                  测试数量   说明
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 通用测试 (所有架构)   ~20个      dirty_log_test, demand_paging_test, irqfd_test 等
 x86 特定测试          ~70个      VMX, SVM, MSR, CPUID, Hyper-V 等
 性能测试              ~5个       dirty_log_perf_test, memslot_perf_test 等
 压力测试              ~3个       mmu_stress_test, memslot_modification_stress_test

3. 构建系统

# 1. 准备内核头文件
cd /home/martins3/data/kernel/linux-build
make headers_install INSTALL_HDR_PATH=/home/martins3/data/kernel/linux-build/usr

# 2. 构建测试
cd tools/testing/selftests/kvm
make -j$(nproc)

# 3. 运行单个测试
./kvm_create_max_vcpus
./x86/cpuid_test

4. 核心 API 说明

// 创建 VM 和 VCPU
struct kvm_vm *vm_create_with_one_vcpu(struct kvm_vcpu **vcpu, void *guest_code);

// 运行 VCPU
void vcpu_run(struct kvm_vcpu *vcpu);

// 设置 VCPU 参数
void vcpu_args_set(struct kvm_vcpu *vcpu, unsigned int num, ...);

// Guest 代码中的同步/退出
GUEST_SYNC(stage);      // 同步点
GUEST_DONE();           // 正常退出
GUEST_ASSERT(cond);     // Guest 内断言

// 获取 ucall (Guest -> Host 通信)
enum ucall_cmd get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc);

5. 当前环境测试结果

测试环境: x86_64, Intel CPU (vmx 支持), /dev/kvm 可用

==========================================
KVM Selftests 测试结果
==========================================

通用测试 (arch-independent):
  kvm_create_max_vcpus                     PASS
  kvm_binary_stats_test                    PASS
  guest_print_test                         PASS
  hardware_disable_test                    PASS
  system_counter_offset_test               PASS
  irqfd_test                               PASS
  coalesced_io_test                        PASS
  steal_time                               PASS

x86 特定测试:
  x86/cpuid_test                           PASS
  x86/cr4_cpuid_sync_test                  PASS
  x86/feature_msrs_test                    PASS
  x86/kvm_clock_test                       PASS
  x86/debug_regs                           PASS
  x86/xss_msr_test                         PASS
  x86/hwcr_msr_test                        PASS
  x86/set_boot_cpu_id                      PASS

长时间运行测试:
  dirty_log_test                           PASS
  set_memory_region_test                   PASS
  kvm_page_table_test                      PASS

==========================================
Results: PASS=19 FAIL=0
==========================================

6. 测试执行方式

# 方式1: 直接运行单个测试
cd /home/martins3/data/kernel/linux-build/tools/testing/selftests/kvm
./kvm_create_max_vcpus

# 方式2: 查看详细输出
./x86/sync_regs_test  # 输出 TAP 格式结果

# 方式3: 带参数运行
./demand_paging_test -m 9 -v 4  # 指定 guest mode 和 vcpu 数量

7. 关键设计特点

1. 双模执行模型: 测试代码包含 Host 部分 (main) 和 Guest 部分 (guest_main),通过 vm_create_with_one_vcpu() 连接
2. UCALL 机制: Guest 通过 I/O 退出或特定指令与 Host 通信,传递测试状态
3. 随机种子: 每个测试使用固定随机种子 (0x6b8b4567) 保证可重复性
4. TAP 输出: 部分测试使用 Test Anything Protocol 格式输出结果,便于自动化处理

8. 限制与注意事项

• 需要 root 权限访问 /dev/kvm
• 某些测试需要特定内核配置或 CPU 特性 (如 VMX, SVM, SEV)
• 嵌套虚拟化测试需要 KVM 嵌套支持
• 部分测试 (如 SEV, AMX) 需要特定硬件支持

所有测试在当前环境均可正常运行,验证了 KVM selftests 构建和运行机制的完整性。

非常好,不需要任何特殊操作, 直接 make

cd /home/martins3/data/kernel/linux-build/tools/testing/selftests/kvm
make
./kvm_create_max_vcpus

从 scripts/clang-tools/gen_compile_commands.py 看,明确排除 tools ,所以,想看,就用 bear 吧

解决办法就是直接 bear – make -j128

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。