Skip to content

feat(axvisor): support x86_64 Linux guest boot (vmx)#930

Merged
ZR233 merged 23 commits into
devfrom
x86-linux
May 28, 2026
Merged

feat(axvisor): support x86_64 Linux guest boot (vmx)#930
ZR233 merged 23 commits into
devfrom
x86-linux

Conversation

@Josen-B

@Josen-B Josen-B commented May 25, 2026

Copy link
Copy Markdown
Contributor

背景

本 PR 为 Axvisor 增加 x86_64 Linux guest 的最小可用支持,使 Axvisor 能在 x86_64/QEMU/KVM 环境下 direct boot 一个单 vCPU Linux guest,并通过 CI 中的 Linux guest smoke 测试。

目标不是一次性完整实现 PC 平台所有硬件能力,而是先补齐最小 Linux 启动路径所需的 boot、timer、IRQ、串口、PCI/virtio-blk 相关能力,让最小化 Linux 可以稳定进入 shell 并完成基础命令执行。

主要改动

1. x86_64 Linux direct boot

  • 增加 bzImage header 检测与解析。
  • 构造 Linux boot_params、E820 memory map、cmdline、initrd 信息等启动参数。
  • 增加 x86 Linux boot stub,用于从 Axvisor 直接进入 Linux protected-mode entry。
  • 支持从 memoryfs 两种来源加载 x86_64 Linux kernel image。
  • 为 x86 Linux direct boot 调整 guest memory layout,避免通用 guest address adjustment 破坏 Linux 需要的 identity/DMA 布局。

2. x86_64 guest 平台描述

  • 增加最小 Intel MP table,用于在关闭 ACPI 的情况下向 Linux 描述 CPU、Local APIC、IOAPIC、ISA/PCI INTx 路由。
  • MP table 的 entry count 由实际构造的 entries 自动计算,避免手写 magic number 与实际表项不同步。
  • 增加 x86_64 Linux guest 配置和 QEMU 配置,使用更收敛的 QEMU 设备拓扑:
    • -nodefaults
    • 关闭不需要的 SATA/SMBus/i8042/USB/graphics
    • 仅保留当前启动需要的 virtio-blk、serial、q35/PCI 基础能力。

3. x86 interrupt/timer/设备模拟能力

  • 增加 x86 vLAPIC/APIC virtualization 相关支持。
  • 增加 vIOAPIC 模拟,用于 Linux IOAPIC 路由和 level-triggered interrupt EOI 后重投递。
  • 增加 PIT 最小模拟,用于提供 Linux 早期 timer IRQ0。
  • 增加 16550 COM1 串口模拟,用于 Linux ttyS0 console 输入输出。
  • 增加 x86 IOAPIC host IRQ forwarding,将 passthrough/host 侧 IRQ 转换为 guest vIOAPIC 可注入中断。
  • 将 x86 PIT/serial/IOAPIC IRQ 注入逻辑从 vCPU 主循环中移动到 vmm::devices::x86,降低 vCPU loop 与具体 x86 设备模拟的耦合。

4. VM/文件系统/CI 集成

  • 支持 x86_64 Linux guest 从 host filesystem 加载 kernel,并在 guest passthrough block device 启动前释放 host filesystem,避免 host/guest 双 ownership。
  • CI 中原 x86_64 Axvisor smoke 测试切换为 Linux guest smoke:
    • 启动 Linux guest
    • 进入 shell
    • 执行测试命令
    • 匹配 guest linux test pass!
  • 补充 x86_64 Linux guest initramfs/rootfs 构建脚本与配置。

启动方式

当前采用 Linux x86 boot protocol direct boot,而不是 BIOS/UEFI 启动:

  1. Axvisor 解析 bzImage header。
  2. 将 Linux payload、boot params、boot stub、cmdline/initrd 放入 guest memory。
  3. 构造 E820 和 MP table。
  4. vCPU 从 boot stub 进入 Linux 32-bit protected-mode entry。
  5. Linux 通过 console=ttyS0 root=/dev/vda rw rootwait 等参数挂载 virtio-blk rootfs 并启动 shell/getty。

当前局限性

  • 目前仅支持单 vCPU x86_64 Linux guest,多 vCPU 不在本 PR 范围内。
  • ACPI 暂未实现,当前通过 MP table 向 Linux 提供最小平台拓扑。
  • PCI/IRQ routing 仍是面向当前 QEMU smoke 拓扑的最小实现,尚不是完整通用 PCI interrupt router。
  • Timer/clocksource 仍处于最小可运行状态,Linux 当前仍使用部分启动参数降低对未完整实现时钟源的依赖,例如 tsc=unstable 等。
  • 当前主要验证对象是 QEMU/KVM 上的最小 Linux guest,尚未覆盖更复杂发行版、更多设备、SMP、热插拔、电源管理等场景。
  • 部分 x86 平台能力仍是最小实现,例如 PIT、serial、IOAPIC 只覆盖 Linux 当前启动和基础交互所需路径。

后续工作

  • 完善 x86 timer/clocksource 支持,逐步减少对 Linux cmdline workaround 的依赖。
  • 实现更完整的 PCI/IRQ routing,替代当前面向固定 QEMU 拓扑的 INTx 路由。
  • 完善 ACPI 或更完整的平台描述能力,让 Linux 可以通过标准 PC 平台路径枚举硬件。
  • 支持 x86_64 Linux SMP/multi-vCPU。
  • 扩展设备模型,支持更多 virtio/PCI 设备以及更通用的 passthrough 场景。
  • 增加更丰富的 Linux guest 测试,包括多命令交互、rootfs I/O、IRQ 压力、timer 稳定性和不同 kernel/rootfs 组合。
  • 继续收敛 x86 设备模拟层与 VMM/vCPU 层的接口,例如引入更通用的 IRQ injection abstraction。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审总结

本 PR 为 Axvisor 增加了 x86_64 Linux guest 的最小启动支持,包含 bzImage direct boot、vLAPIC/IOAPIC/PIT/serial 设备模拟、MP table 构造,以及 CI smoke 测试切换。整体架构设计合理,模块划分清晰(boot_params、linux_boot、mptable、devices/x86 等),是一个扎实的基础实现。

但在当前状态下存在以下阻塞性问题,需要先解决再重新评审:

阻塞性问题

1. 合并冲突(必须修复)

os/arceos/modules/axfs/src/lib.rs 与当前 dev 分支存在合并冲突。PR 修改了 axfs 模块的 block device 初始化逻辑(从 block_devs.pop().expect() 改为 blk_devs.take_one() 的优雅降级),而 dev 分支在此期间也经历了驱动栈拆分重构(#831)。maintainerCanModify=false,因此需要作者手动 rebase 到最新 dev 并解决冲突。

建议的解决方向:保留 PR 的优雅降级逻辑(无 block device 时 fallback 到 ramfs),但使用 dev 上当前正确的 API(AxDeviceContainerdevice_name() 等),并整合双方新增的 umount/shutdown_filesystems 功能。

2. CI 被取消(必须重新运行)

CI 运行(#26385524103,attempt 3)被取消(conclusion: cancelled),没有任何测试结果可用于验证 PR 声称的 smoke 测试行为。多个 job 显示为 cancelled 或 skipped。需要确认 CI 能正常完成,尤其是 x86_64 Axvisor Linux guest smoke 测试必须通过。

3. spin crate 使用与项目迁移方向不一致

PR 在以下位置新增了 spin::Mutex 的使用:

  • components/axvcpu/src/vcpu.rs:将 RefCell 替换为 spin::Mutex(第 20 行)
  • components/x86_vlapic/src/vioapic.rspit.rsserial.rs:使用 spin::Mutex
  • components/x86_vlapic/Cargo.toml:依赖 spin = "0.10"(第 20 行)

项目已通过 #861 将多数 crate 从 spin 迁移到 ax-kspin(使用 ax_kspin::SpinNoIrq as Mutex)。vCPU 热路径中使用 spin::Mutex(只关抢占不关中端)与 ax_kspin::SpinNoIrq(关中端)有语义差异。建议在 rebase 时统一使用 ax_kspin::SpinNoIrq,或提供明确的理由说明为什么这里需要 spin::Mutex

非阻塞性建议

4. 替换了原有 ArceOS x86_64 guest smoke 测试

test-suit/axvisor/normal/qemu/smoke/qemu-x86_64.tomlsuccess_regexHello world from user mode program!(ArceOS guest)改为 guest linux test pass!(Linux guest)。如果 ArceOS x86_64 guest 在当前 dev 上仍然可用,建议保留原有的 ArceOS guest smoke 测试(作为独立 case),而将 Linux guest 测试作为新增 case。

5. EmulatedLocalApicUnsafeCell 安全性

components/x86_vlapic/src/lib.rs 第 78-79 行中的 get_mut_vlapic_regs 通过 UnsafeCell 获取可变引用,注释声明"never called concurrently"但这一约束未通过类型系统强制。建议添加更详细的 # Safety 文档注释,说明调用者需要保证的并发约束。

验证结果

  • cargo fmt --check:通过
  • cargo clippy:未运行(CI 被取消,本地环境限制)
  • 合并测试:os/arceos/modules/axfs/src/lib.rs 存在冲突

重复/重叠分析

经搜索当前 open PR,未发现与本 PR 的 x86_64 Linux guest 支持存在重叠或冲突的其他 PR。本 PR 的工作是独特的。

结论

请作者 rebase 到最新 dev、解决合并冲突、将 spin 替换为 ax-kspin(或提供充分理由)、确保 CI 正常通过后重新请求评审。这是一个有价值的功能添加,上述问题解决后可以批准。

Powered by deepseek-v4-pro

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审总结

本 PR 为 Axvisor 增加 x86_64 Linux guest 的最小启动支持(vmx),包含 bzImage direct boot、vLAPIC/IOAPIC/PIT/serial 设备模拟、MP table 构造、CI smoke 测试切换等。整体代码组织清晰,模块划分合理(boot_params、linux_boot、mptable、devices/x86 等),boot stub 实现遵循 Linux x86 boot protocol 规范,是一个有价值的基础功能。

但在当前状态下仍存在以下阻塞性问题,需要先解决再重新评审。注意这些问题与上一轮 bot review(commit ea2d07e)基本一致,目前 PR 已更新到新 head (54729a3) 但这些问题尚未修复。

阻塞性问题

1. 合并冲突(必须修复)

os/arceos/modules/axfs/src/lib.rs 与当前 dev 分支存在合并冲突。dev 分支使用旧版 Vec<Box<dyn FsBlockDevice>> API,而 PR 分支使用新版 AxDeviceContainer<AxBlockDevice> API 并增加了优雅降级逻辑和 shutdown_filesystems()。由于 maintainerCanModify=false,请作者 rebase 到最新 dev 并解决冲突。

建议的解决方向:保留 PR 的优雅降级逻辑(无 block device 时 fallback 到 ramfs)和新增的 shutdown_filesystems(),但使用 dev 上当前正确的 API。

2. spin::Mutex 使用与项目迁移方向不一致

项目已通过 #861 将多数 crate 从 spin 迁移到 ax-kspin(使用 ax_kspin::SpinNoIrq as Mutex,关中端,与 spin::Mutex 的只关抢占有语义差异)。本 PR 在以下位置引入/新增了 spin::Mutex 使用:

  • components/axvcpu/src/vcpu.rs:将 RefCell 替换为 spin::Mutex(见下方 inline comment)
  • components/x86_vlapic/Cargo.toml:新增 spin = "0.10" 依赖
  • components/x86_vlapic/src/vioapic.rspit.rsserial.rs:使用 spin::Mutex

建议统一使用 ax_kspin::SpinNoIrq。若此处确实需要 spin::Mutex(只关抢占不关中端),请在 PR 描述或代码注释中说明理由。

3. CI 被取消/跳过(必须重新运行并确认通过)

当前 head (54729a3) 的 CI 运行 (#26386499637) 中所有 build/test job 均为 skipped 状态,仅 "Detect changed paths" job 完成。没有任何构建或测试结果可用于验证 PR 声称的 Linux guest smoke 测试行为。需要确认 CI 能正常完成,尤其是 x86_64 Axvisor Linux guest smoke 测试必须通过。

4. EmulatedLocalApicUnsafeCell 安全性

components/x86_vlapic/src/lib.rs 第 78-79 行的 get_mut_vlapic_regs 通过 UnsafeCell 获取 &mut 引用,并用 #[allow(clippy::mut_from_ref)] 压制 lint。注释声明 "never called concurrently" 但这一约束未通过类型系统强制。如果未来调用路径发生变化(例如在不同上下文中并发调用),可能导致未定义行为。建议添加更详细的 # Safety 文档注释,说明调用者需要保证的并发约束,并考虑在调试构建中使用运行时检查。

非阻塞性建议

5. ArceOS x86_64 guest smoke 测试被替换

test-suit/axvisor/normal/qemu/smoke/qemu-x86_64.tomlsuccess_regex 从原有的 ArceOS guest 测试(Hello world from user mode program!)改为 Linux guest 测试(guest linux test pass!)。如果 ArceOS x86_64 guest 在当前 dev 上仍然可用,建议保留原有的 ArceOS guest smoke 测试作为独立 case,将 Linux guest 测试作为新增 case。

验证结果

  • cargo fmt --check:通过 ✓
  • cargo clippy:未运行(CI 被跳过)
  • 合并测试:os/arceos/modules/axfs/src/lib.rs 存在冲突 ✗
  • CI:当前 head 所有 build/test job 被跳过 ✗

重复/重叠分析

经搜索当前 open PR(#923 fix-net-ioctls、#933 axbuild features 等),未发现与本 PR 的 x86_64 Linux guest 支持存在重叠或冲突的其他 PR。本 PR 的工作是独特的。

结论

这是一个架构设计良好的功能添加,代码质量较好。请作者:

  1. Rebase 到最新 dev 并解决 os/arceos/modules/axfs/src/lib.rs 的合并冲突
  2. spin::Mutex 替换为 ax_kspin::SpinNoIrq(或说明需要 spin::Mutex 的理由)
  3. 确保 CI 正常通过(尤其是 x86_64 Linux guest smoke 测试)
  4. 改进 EmulatedLocalApicUnsafeCell 安全文档

上述问题解决后可以重新请求评审。

Powered by deepseek-v4-pro

Comment thread components/axvcpu/src/vcpu.rs Outdated

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本 PR 为 Axvisor 增加了 x86_64 Linux guest 的最小可用支持(VMX direct boot),整体代码质量良好,模块划分清晰,错误处理合理。

但在合并前需要解决一个关键问题。

阻塞问题:分支落后于 dev 导致非预期回退

当前 PR 分支的 merge-base 是 05e5368e1,而 dev 分支在 merge-base 之后已合入以下 PR:

  • #920 fix(starry-mm): fix use-after-free when evicting a page-cache page
  • #922 fix(axruntime): initialize the page allocator from the largest free RAM region
  • #924 feat(starry-task): implement sys_getcpu
  • #925 fix(starry-task): suspend on SIGSTOP instead of killing (job control)

PR diff 中以下文件的变更实际上并非本 PR 有意修改,而是因为分支落后于 dev 导致的非预期回退:

  1. os/arceos/modules/axruntime/src/lib.rs:回退了 #922 的 "pick largest free RAM region" 修复,会导致 loongarch64 平台用户内存分配上限从数 GB 降回 ~248 MB。

  2. os/StarryOS/kernel/src/task/mod.rsos/StarryOS/kernel/src/task/signal.rsos/StarryOS/kernel/src/syscall/task/thread.rsos/StarryOS/kernel/src/syscall/task/wait.rs:回退了 #925 的 SIGSTOP/SIGCONT job-control 支持,以及 #924 的 sys_getcpu 实现。

  3. os/StarryOS/kernel/src/mm/aspace/:回退了 #920 的 page-cache use-after-free 修复。

  4. test-suit/axvisor/normal/qemu/qemu-smp1/syscall/test-getcpu/:删除了 #924 新增的 sys_getcpu 测试用例。

这些回退是由于分支与当前 dev 之间的 commit 差距导致,不是 PR 代码本身的错误。请将分支 rebase 到当前 dev 最新提交后再提交 review。

x86 Linux guest 代码评价(非阻塞)

PR 的核心贡献 —— x86_64 Linux guest 启动支持 —— 实现质量较高:

  • bzImage 解析与 boot_params 构造boot_params.rs 的 E820 table 构造逻辑清晰,与 Linux boot protocol 对齐良好。
  • MP table 构造mptable.rs 的 entry count 自动计算避免了 magic number 问题。
  • boot stublinux_boot.rs 中的 16-bit→32-bit 切换模板注释充分,immediate 修补机制安全。
  • 设备模拟:PIT (pit.rs)、16550 serial (serial.rs)、vIOAPIC (vioapic.rs) 均为最小但正确的实现,覆盖了 Linux 启动所需路径。
  • IRQ forwardingdevices/x86.rs 中的 IOAPIC IRQ hook 和 pending 机制设计合理,将 x86 设备 IRQ 注入逻辑从 vCPU loop 中分离出来是好的解耦方向。
  • 文件系统释放axfs 新增的 umount/shutdown_filesystems 机制在 guest passthrough block device 启动前正确释放 host filesystem,避免了 host/guest 双 ownership。
  • RefCell→Mutex 迁移axvcpu/src/vcpu.rs 中将 RefCell 替换为 SpinNoIrq Mutex 的改动合理,解决了中断路径中访问 vCPU 状态的潜在问题。
  • 编译通过(cargo check --target x86_64-unknown-none -p x86_vlapic -p x86_vcpu -p axvcpu)。

重复/重叠分析

当前 open 的 PR #933(axbuild feature cleanup)和 #934(PhytiumPi/ROC-RK3568 board tests)与本 PR 的改动面无重叠,不存在冲突。

建议后续改进(非阻塞)

  1. devices/x86.rs 中全局 static 原子变量的 IOAPIC forwarding 状态在多个 VM 启动/关闭场景下可能不够安全,建议未来将转发状态挂在 VMRef 或 per-VM 结构中。
  2. DEFAULT_COMMAND_LINEtsc=unstable 等 workaround 参数建议在 PR 描述中说明哪些是短期规避、哪些是长期需要的。
  3. qemu-x86_64-linux.tomlvm_configs = [] 似乎不应为空——建议说明其用途或考虑是否需要填充。

Powered by deepseek-v4-pro

Comment thread components/axdevice/Cargo.toml Outdated
Comment thread components/axvcpu/src/arch_vcpu.rs Outdated
Comment thread components/axvcpu/src/exit.rs Outdated
Comment thread components/axvm/src/vm.rs Outdated
Comment thread virtualization/x86_vcpu/src/vmx/vcpu.rs
Comment thread virtualization/x86_vcpu/src/vmx/vcpu.rs
Comment thread virtualization/axvm/src/vm.rs

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审总结

本 PR 为 Axvisor 增加 x86_64 Linux guest 的最小可用启动支持(VMX direct boot),包含 bzImage 解析与 boot_params 构造、vLAPIC/IOAPIC/PIT/serial 设备模拟、MP table 构造、host filesystem 释放机制、以及 CI smoke 测试切换。整体代码质量良好,模块划分清晰。

与之前的多轮 review(bot review + aarkegz + Ivans-11)相比,当前 head (46259c9) 已解决此前所有代码层面的阻塞性问题。

已解决的阻塞问题

  1. spin::Mutexax_kspin::SpinNoIrqaxvcpux86_vlapic(vioapic/pit/serial)全部统一使用 ax_kspin::SpinNoIrq as Mutex,与项目迁移方向一致。

  2. VTimerPreemptionTimer:已按 aarkegz 建议重命名。

  3. 函数命名改善needs_host_filesystem_release_before_boot 已重命名为语义更清晰的 has_host_fs_passthrough_conflict

  4. inject_interrupt_with_trigger 平台中立化:引入 InterruptTriggerMode enum,默认实现委托给 inject_interrupt,x86 实现覆盖 level-triggered 路径。

  5. vLAPIC/APIC-access page 映射冲突:已从 arceos-x86_64nimbos-x86_64 配置中移除 Local APIC 直通,统一由 vLAPIC 接管(0xFEE00000),解决了 Ivans-11 指出的 AlreadyExists 映射冲突。

  6. read_guest_phys_u64 的 gpa==hpa 假设:已添加清晰注释说明当前仅适用于 identity-mapped guest RAM 布局。

  7. EmulatedLocalApic UnsafeCell 安全文档get_mut_vlapic_regs 已添加 # Safety 文档,说明每个 vLAPIC 由单 vCPU 同步拥有的约束。

  8. 合并冲突已解决os/arceos/modules/axfs/src/lib.rs 不再有冲突,git diff --name-only --diff-filter=U 输出为空。

本地验证结果

  • cargo fmt --check:通过 ✅
  • cargo check -p x86_vlapic -p axvcpu -p axvmconfig -p axdevice --target x86_64-unknown-none:通过 ✅
  • cargo check -p x86_vcpu --target x86_64-unknown-none --features vmx:通过 ✅
  • cargo check -p axvm --target x86_64-unknown-none:通过 ✅
  • cargo test -p axvcpu --target x86_64-unknown-linux-gnu:16 passed, 0 failed ✅
  • cargo test -p axdevice --target x86_64-unknown-linux-gnu:2 passed, 0 failed ✅
  • 合并冲突检查:无冲突 ✅

待确认项:CI 全部 skipped

当前 head 的 CI check-runs(run #26430272014)所有 build/test job 均为 conclusion: skipped。这可能是 CI workflow 路径过滤的配置问题(例如 Axvisor x86_64 smoke 测试的触发条件未匹配到 PR 分支),而非 PR 代码本身的问题。

PR 声称 Linux guest smoke 测试可通过(匹配 guest linux test pass!),但在无 CI 结果的情况下无法远程验证。建议作者确认 CI 配置是否能正确触发 x86_64 Axvisor smoke 测试。如 CI 基础设施确实存在临时问题,可由维护者判断是否接受当前状态。

代码质量评价

核心实现质量较高:

  • boot_params.rs:E820 table 构造逻辑清晰,正确处理 RAM/reserved 范围重叠和合并排序,有完整的单元测试覆盖。
  • linux_boot.rs:16-bit → 32-bit boot stub 模板注释充分,immediate 修补机制安全,有 GPA 越界检查。
  • mptable.rs:entry count 自动计算避免了 magic number 同步问题。
  • vioapic.rs:IOAPIC redirection table 模拟正确,支持 level-triggered EOI 后重投递,remote IRR 状态管理合理。
  • devices/x86.rs:IOAPIC IRQ forwarding 将 x86 设备 IRQ 注入从 vCPU loop 解耦出来,是好的架构方向。
  • vcpu.rs:RefCell → SpinNoIrq Mutex 迁移解决了中断路径中访问 vCPU 状态的并发问题。

非阻塞建议

  1. devices/x86.rs 中的 IOAPIC forwarding 使用全局 static 原子变量,在多 VM 启动/关闭场景下可能不够安全。建议后续将转发状态挂在 per-VM 结构中。

  2. DEFAULT_COMMAND_LINEtsc=unstableinitcall_blacklist=ahci_pci_driver_init,i8042_init 等 workaround 参数,建议在 PR 描述或代码注释中标注哪些是短期规避、哪些是长期需要的。

  3. 原有 ArceOS x86_64 guest smoke 测试(Hello world from user mode program!)被替换为 Linux guest 测试。如果 ArceOS x86_64 guest 在 dev 上仍可运行,建议后续恢复独立的 ArceOS smoke case。

  4. linux-x86_64-qemu-smp1.tomlmemory_regions 有两个从 0x0 开始的 region(MAP_IDENTICAL 128MMAP_ALLOC 1M),含义是 DMA-capable identity mapping + 低端 boot scratch。建议添加更详细的注释说明 overlap 处理逻辑。

重复/重叠分析

经检查当前 open PR(#958 ostool mouse、#823 sync_file_range 等),未发现与本 PR 的 x86_64 Linux guest 启动支持存在功能重叠或冲突的其他 PR。本 PR 的工作是独特的。

结论

所有此前 review 提出的代码层面阻塞问题已解决,本地编译和测试全部通过,无合并冲突。CI 全部 skipped 需要确认是否为基础设施问题。建议作者确认 CI 能正确运行后,由维护者决定是否合并。

Powered by glm-5.1

@Josen-B

Josen-B commented May 26, 2026

Copy link
Copy Markdown
Contributor Author

skipped job非 PR 代码本身的问题,当前CI 配置能够正确触发 x86_64 Axviso r测试( Test axvisor self-hosted x86_64 / run_host )

@ZR233 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请处理冲突

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审总结

本 PR 为 Axvisor 增加 x86_64 Linux guest 的最小可用启动支持(VMX direct boot),涵盖 bzImage 解析与 boot_params 构造、16→32 位 boot stub、MP table 构造、vLAPIC/vIOAPIC/PIT/16550 串口设备模拟、IOAPIC IRQ 转发、host filesystem 释放机制、CI Linux guest smoke 测试等。整体代码质量较高,模块划分清晰,错误处理完善,单元测试覆盖良好。

已解决的阻塞问题

与之前的多轮 review 相比,当前 head (41837d02) 已解决所有此前提出的阻塞问题:

  1. spin::Mutexax_kspin::SpinNoIrq:统一使用项目标准 mutex
  2. VTimerPreemptionTimer:按 aarkegz 建议重命名
  3. needs_host_filesystem_release_before_boothas_host_fs_passthrough_conflict:语义更清晰
  4. inject_interrupt_with_trigger 平台中立化:引入 InterruptTriggerMode enum
  5. ✅ vLAPIC APIC-access page 映射冲突:移除 nimbos/arceos x86 配置中的 Local APIC 直通
  6. read_guest_phys_u64 的 gpa==hpa 假设:已添加注释说明 identity-mapped 限制
  7. EmulatedLocalApic UnsafeCell 安全文档:已添加 # Safety 文档
  8. ✅ 合并冲突已解决:git merge --no-commit 测试通过,无冲突

本地验证结果

  • cargo fmt --check:通过 ✅
  • 合并冲突检查:无冲突 ✅

CI 状态

当前 head 所有 CI check-runs 均为 skipped。作者在评论中说明这是 CI 配置/基础设施问题,非 PR 代码本身的问题。建议作者确认 CI 能正确触发 x86_64 Axvisor smoke 测试后,由维护者决定合并时机。

代码质量评价

核心实现质量较高:

  • boot_params.rs:E820 table 构造逻辑清晰,正确处理 RAM/reserved 范围重叠和合并排序,有完整单元测试覆盖
  • linux_boot.rs:16→32 位 boot stub 模板注释充分,immediate 修补机制安全,有 GPA 越界检查
  • mptable.rs:entry count 自动计算避免了 magic number 同步问题,checksum 正确
  • vioapic.rs:IOAPIC redirection table 模拟正确,支持 level-triggered EOI 后重投递,remote IRR 状态管理合理
  • pit.rs:PIT 最小实现覆盖 Linux 早期 timer 需求,周期计算正确
  • serial.rs:16550 UART 模拟覆盖 Linux console 所需寄存器,FIFO + IRQ 状态正确
  • devices/x86.rs:IOAPIC IRQ forwarding 将 x86 设备 IRQ 注入从 vCPU loop 解耦,是好的架构方向
  • vcpu.rs:RefCell → SpinNoIrq Mutex 迁移解决了中断路径中访问 vCPU 状态的并发问题
  • linux.rs:bzImage header 解析严谨,布局验证完整

非阻塞建议

  1. devices/x86.rs 中的 IOAPIC forwarding 使用全局 static 原子变量,在多 VM 启动/关闭场景下可能不够安全。建议后续将转发状态挂在 per-VM 结构中。

  2. DEFAULT_COMMAND_LINEtsc=unstableacpi=offinitcall_blacklist=ahci_pci_driver_init,i8042_init 等 workaround 参数,建议在代码注释或 PR 描述中标注哪些是短期规避、哪些是长期需要的,方便后续逐步移除。

  3. 原有 ArceOS x86_64 guest smoke 测试(Hello world from user mode program!)被替换为 Linux guest 测试。如果 ArceOS x86_64 guest 在 dev 上仍可运行,建议后续恢复独立的 ArceOS smoke case。

  4. linux-x86_64-qemu-smp1.tomlmemory_regions 有两个从 0x0 开始的 region(MAP_IDENTICAL 128MMAP_ALLOC 1M),建议添加注释说明重叠区域的处理逻辑。

重复/重叠分析

经检查当前 open PR,未发现与本 PR 的 x86_64 Linux guest 启动支持存在功能重叠或冲突的其他 PR。本 PR 的工作是独特的。

结论

所有此前 review 提出的阻塞问题已解决,无合并冲突,本地格式检查通过。CI 全部 skipped 需要确认是否为基础设施问题。代码质量良好,架构设计合理。建议由维护者确认 CI 能正确运行后合并。

Powered by glm-5.1

Josen-B added 17 commits May 28, 2026 00:49
…pending events, and add IRQ hook for IOAPIC forwarding

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审总结

本 PR 为 Axvisor 增加 x86_64 Linux guest 的最小可用启动支持(VMX direct boot),包含 bzImage 解析与 boot_params 构造、vLAPIC/IOAPIC/PIT/serial 设备模拟、MP table 构造、host filesystem 释放机制、以及 CI smoke 测试切换。整体代码质量良好,模块划分清晰。

此前 review 问题处理情况

本 PR 经过多轮 review(bot + aarkegz + Ivans-11 + ZR233),当前 head (c4c5db3) 已解决所有此前提出的代码层面阻塞性问题:

  1. spin::Mutexax_kspin::SpinNoIrqaxvcpux86_vlapic(vioapic/pit/serial)全部统一使用 ax_kspin::SpinNoIrq,与 #861 迁移方向一致。
  2. VTimerPreemptionTimer:已按 aarkegz 建议重命名。
  3. 函数命名改善needs_host_filesystem_release_before_boot 已重命名为 has_host_fs_passthrough_conflict
  4. inject_interrupt_with_trigger 平台中立化:引入 InterruptTriggerMode enum,默认实现委托给 inject_interrupt
  5. vLAPIC/APIC-access page 映射冲突:已从 arceos-x86_64 和 nimbos-x86_64 配置中移除 Local APIC 直通,统一由 vLAPIC 接管。
  6. read_guest_phys_u64 注释:已添加 gpa==hpa 假设说明。
  7. EmulatedLocalApic UnsafeCell Safety 文档:已添加详细的 # Safety 注释。
  8. 合并冲突已解决git merge --no-commit origin/dev 输出 "Already up to date",无冲突。

本地验证结果

  • cargo fmt --check:通过 ✅
  • cargo clippy --manifest-path virtualization/x86_vlapic/Cargo.toml --all-features --target x86_64-unknown-none:通过 ✅
  • cargo clippy --manifest-path virtualization/axvcpu/Cargo.toml --all-features --target x86_64-unknown-none:通过 ✅
  • cargo clippy --manifest-path virtualization/x86_vcpu/Cargo.toml --features vmx --target x86_64-unknown-none:通过 ✅
  • cargo clippy --manifest-path virtualization/axvmconfig/Cargo.toml --all-features --target x86_64-unknown-none:通过 ✅
  • cargo test --manifest-path virtualization/axdevice/Cargo.toml --all-features:6 passed ✅
  • cargo test --manifest-path virtualization/axvcpu/Cargo.toml --all-features:16 passed ✅
  • cargo test --manifest-path virtualization/axvmconfig/Cargo.toml --all-features:9 passed ✅
  • 合并冲突检查:无冲突 ✅

CI 状态

当前 head 的 5 个 check-run 中,"Detect changed paths" 为 success,其余 4 个为 skipped(container image publish 和 matrix job)。作者已确认 skipped 是 CI 路径过滤配置问题(非 PR 代码问题),x86_64 Axvisor 测试 job 能正确触发。这不影响代码质量判断。

代码质量评价

核心实现质量较高:

  • boot_params.rs:E820 table 构造逻辑清晰,有完整的单元测试覆盖。
  • linux_boot.rs:16-bit → 32-bit boot stub 注释充分,immediate 修补机制安全。
  • mptable.rs:entry count 自动计算,避免 magic number。
  • vioapic.rs:IOAPIC redirection table 模拟正确,支持 level-triggered EOI 后重投递。
  • devices/x86.rs:IOAPIC IRQ forwarding 从 vCPU loop 解耦,架构方向正确。
  • vcpu.rs:RefCell → SpinNoIrq Mutex 迁移解决中断路径并发问题。
  • axfs lib.rs:优雅降级(无 block device 时 fallback 到 ramfs)+ shutdown_filesystems 机制。

非阻塞建议(后续改进)

  1. devices/x86.rs 中 IOAPIC forwarding 使用全局 static 原子变量,多 VM 场景下可能不够安全,建议后续将转发状态挂在 per-VM 结构中。
  2. devices/x86.rs 中 4 处 inject_interrupt_with_trigger(...).unwrap() 在 vCPU 状态异常时会 panic,建议后续改为 ? 传播或 log + continue。
  3. DEFAULT_COMMAND_LINEtsc=unstable 等 workaround 参数建议标注哪些是短期规避、哪些是长期需要的。
  4. 原有 ArceOS x86_64 guest smoke 测试被替换为 Linux guest 测试,建议后续恢复独立的 ArceOS smoke case。

重复/重叠分析

经检查当前 open PR(#1001 ext4 readdir 修复、#1002 pip 测试、#933 axbuild features 等),未发现与本 PR 的 x86_64 Linux guest 启动支持存在功能重叠或冲突的其他 PR。本 PR 的工作是独特的。

结论

所有此前 review 提出的阻塞性问题已解决,本地编译和测试全部通过,无合并冲突。建议合并。

Powered by mimo-v2.5-pro

@ZR233
ZR233 merged commit 2272e4f into dev May 28, 2026
220 of 245 checks passed
@ZR233
ZR233 deleted the x86-linux branch May 28, 2026 02:58
@github-actions github-actions Bot mentioned this pull request May 28, 2026
54dK3n pushed a commit to 54dK3n/tgoskits that referenced this pull request May 31, 2026
* docs(axvisor): add x86_64 Linux guest support plan and phased breakdown

* feat(axvisor): add x86_64 Linux SMP1 guest config and initramfs build script

* feat(axvisor): add x86_64 Linux bzImage header detection and parsing

* feat(axvisor): load x86_64 Linux bzImage payload and initramfs into guest memory

* feat(axvisor): construct x86_64 Linux boot_params and reorganize x86 image modules

* feat(axvisor): add x86_64 Linux boot stub for direct-boot protected-mode entry

* feat(axvisor): add x86_64 Linux command line support and complete initramfs boot

* feat(axvisor): enable x86_64 APIC virtualization, PCI passthrough, and MP table for Linux guest

* fix(axvisor): improve x86 vLAPIC timer, APIC MMIO write decoding, and IO APIC setup

* feat(axvisor): add vIOAPIC emulation and EPT MMIO decode for x86_64 Linux guest

* feat(axvisor): switch x86_64 Linux to real ext4 rootfs with default boot params

* feat(axvisor): add x86 PIT/serial emulation, VMX virtual interrupt delivery, and generalize IOAPIC IRQ routing

* feat(axvisor): replace RefCell with Mutex in axvcpu, consolidate x86 pending events, and add IRQ hook for IOAPIC forwarding

* feat(axvisor): unmount host filesystem before guest passthrough and switch to Linux guest smoke test

* fix(axvisor): harden filesystem release gate, clean up IOAPIC teardown, and tighten timer lock scope

* docs(axvisor): remove completed x86_64 Linux guest support phase documents

* chore(axvisor): clean up x86 linux rebase artifacts

* refactor(axvisor): extract x86 device IRQ forwarding into dedicated devices module

* test(axdevice): add mock axvisor_api implementations for x86_64 unit tests

* fix(axvisor): resolve x86 linux review feedback

* fix(axvisor): enable raw_apic_id under irq feature in addition to smp

* refactor(axvisor): introduce InterruptTriggerMode enum and rename VTimer to PreemptionTimer

* fix(axvisor): repair x86 linux rebase fallout
This was referenced Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants