实习开发计划 #1604
Replies: 10 comments 1 reply
7月13-7月19 进度首先是中断注入架构的重构,合入了 #pr1630:校验跨设备所有权,并把注册流程收敛为“完整校验 → 统一写入索引 → 加入设备列表。 但是此次合并和后续的重构计划于 #pr1612 有较大冲突(待此pr合并后需要基于新的IRQ所有权模型重新设计)。 于是接下来转向了 UEFI 的支持工作,并且特别注意绕开了可能会依赖 #pr1612 的任务。详细见 #issue1646 此任务尝试做的是开发独立的 x86_64-unknown-uefi 应用 probe.efi 探测 guest os 启动的过程,验证 AxVisor UEFI 计划当前需要、且能够通过标准 UEFI 应用观察到的平台契约。 目前的成果是已经实现独立的 x86_64-unknown-uefi、no_std UEFI application,能够在原生 OVMF/QEMU 上运行(还未集成入 AxVisor),并实施十六项检查(涵盖配置输入、UEFI核心环境、ACPI平台描述、PCI与存储设备、UEFI Runtime Services),以下为运行截图: 现在还需要进行一些删减:目前修改了CI,除了在 CI diff 中新增原生 probe job 外,还有调整 AxVisor 的 AMD SVM/Intel VMX self-hosted 条目和把原来的 hosted SVM 位置换成了 native probe 等不必要的修改。 probe job 的目的是为了保证:probe.efi 始终可以为 UEFI target 编译、probe 能在原生 OVMF/QEMU 环境通过完整矩阵。 |
7月20-7月26 进度中断 sender/dispatcher 通道 (PR #1679 待合入)
建立 UEFI 的可诊断基线
增加了对固件的校验:校验来源、构建开关、大小、地址、SHA-256、combined 关系、reset-vector 覆盖和阶段 marker。 增加 VMX/SVM OVMF entry 诊断用例和相应文档;成功条件不再使用宿主侧 AArch64 中断 Router 设计
|
7月27-8月2日进度本周概述本周主要完成了三项工作:
此外合入了一个工具链改进 PR #1827,使 Claude Code 能正确加载 AGENTS.md 项目规范: 1. 中断 sender/dispatcher 通道收尾详情见上周,本周推动合入 2. AArch64 VGIC SPI 投递基础
3. Guest UEFI P0 可复现固件基线
|
8月3-8月9日进度本周概述本周主线是 x86_64 Guest UEFI 支持:验证当前启动链路的 PR #1931 已合入 dev。同时正在进行增加 PCI 只读数据盘的工作,目标是为 direct-boot Linux guest 提供标准的只读 modern virtio-blk PCI 数据盘。 1. x86 OVMF ACPI 验证合入 (#1931)现在的 dev 已经具备了启动 linux 的能力,通过 fw-cfg 将内核镜像、initrd、命令行参数直接注入虚拟机内存,ovmf 充当 bootloader 的角色。这个工作只补充验证与说明:
PCI 只读数据盘(正在进行)标准 PC UEFI 会执行完整的 PCI 总线枚举,发现磁盘控制器,构建设备路径,所以就需要增加一个标准 PCI 块设备。 阉割为了降低实现的复杂度,目前的设计中阉割了一些 feature/协议,但是 Linux/OVMF 看到的是一块完全标准的只读盘,只是没做那些启动场景用不到的可选特性。
|
8月10-8月16进度本周概述本周主线从验证当前 x86_64 Guest UEFI 启动链路转向只读 PCI 数据盘的实现:
1. PR #1959 — ovmf-acpi-svm 接入 AMD CI(已合入)完成内容上周 PR #1931 把 2. PR #1984 — 共享 virtqueue 加固(已合入)背景与问题PR #1935 使用
完成内容
3. PR #2070 — 只读 virtio-blk-pci 数据盘(draft,阻塞中)背景与目标为 x86_64 guest 增加一块 BDF 完成内容(15 commits,58 files,+8105/−579)实现上,我的设计对照参考了 Cloud-Hypervisor 的实现。
使用效果例如:客户机配置里写: [[devices.virtual]]
id = "readonly-data-disk"
model = "virtio-blk-pci"
backend = "file"
path = "${workspace}/tmp/axbuild/axvisor/qemu-pci-block/axvisor-readonly-data.ext4"
read_only = trueAxVisor 就能把对应镜像文件冻结成只读盘,固化进自己的镜像里,启动 Linux 客户机时,把它作为一块标准 PCI 块设备交给客户机使用。 真机 E2E 验证与阻塞测试覆盖了镜像生成、设备建模、资源规划、固件路由、客户机实际读写整条链路。 在 AMD Ryzen 9 7940H(SVM)+ Docker/KVM 上,SVM/VMX 两后端结论一致:
随后 guest 写 BAR0 当前状态PR 保持 draft,已在 PR body 中记录阻塞与完整 E2E 分析;计划另开 合入后的下一步#2070 合入后,下一步是复用同一块只读 virtio-blk-pci 设备,把它接入 OVMF 启动路径:让 guest UEFI 通过 VirtioBlkDxe 枚举到该盘,并尝试从它启动 Linux,使这条链路从 direct-boot 数据盘升级为 OVMF 可见/可启动的 virtio-blk PCI 磁盘。 4. 下周重点
|
0817—0823进度本周概述
1. PR #2082(已合入)解决的问题Guest 系统访问设备的 MMIO 区域(Bar0)时,硬件没法直接完成这次内存读写,CPU 会VM Exit到 Axvisor。但是之前没有普通设备MMIO 解码的逻辑。本 PR 就是给解码器补上设备 MMIO 访问的指令解码。 当前状态已合入 dev。 2. PR #2070 — 只读 virtio-blk-pci 数据盘当前状态第一轮实现后, @ZR233 提出了复用性问题,需要调整各层的边界并给出了修复意见。这周主要根据修复意见重构,目前已经重构完成,在排查 bug 和整理 commit 的阶段。 合入后的下一步#2070 合入后,下一步是复用同一块只读 virtio-blk-pci 设备,把它接入 OVMF 启动路径:让 guest UEFI 通过 VirtioBlkDxe 枚举到该盘,并尝试从它启动 Linux,使这条链路从 direct-boot 数据盘升级为 OVMF 可见/可启动的 virtio-blk PCI 磁盘。可写后端、实时文件后端等能力不在本 PR 范围内,留待后续独立推进。 3. 下周重点
|
0823-0830 进度本周概述
PR #2197已经合入,目前PCI 设备能够通过统一的 DeviceGraph、planner注册、获取资源、x86 架构下能够通过 CF8/CFC 这个机制访问配置。Linux Guest 已经能够通过 lspci 正确枚举 pci 设备和 Bar 资源。 ramdisk virtio pci 块设备现在的状况是已经在本地实现:能够在通用 vPCI 上接入 modern VirtIO Block,补齐了 2197 pci core 中缺失的 pci capability、BEM/DMA和INTx 中断路径这些。并且支持同步ramdisk 的 read、write、flush 语义。目前剩余同时阻塞在端到端验证。 完成这个块设备的合入后,下面几项工作可以同步进行:
目前的阻塞项在实际的端到端验证下,会出现两个卡点导致超时,现在正在尝试找原因并尝试优化: [ 0.000000] APIC: Switch to symmetric I/O mode setup <----卡点1,能卡 6-7 min。
[ 97.201000] ..TIMER: vector=0x30 apic1=0 pin1=0 apic2=-1 pin2=-1
[ 97.327000] tsc: Unable to calibrate against PIT
[ 98.029000] tsc: HPET/PMTIMER calibration failed
[ 98.782000] tsc: Marking TSC unstable due to could not calculate TSC khz
[ 99.557000] Calibrating delay loop... 1176.57 BogoMIPS (lpj=588288)
......
[ 106.841000] x86/fpu: xstate_offset[6]: 896, xstate_sizes[6]: 512
[ 106.854000] x86/fpu: xstate_offset[7]: 1408, xstate_sizes[7]: 1024
[ 106.966000] x86/fpu: Enabled xstate features 0xe7, context size is 2432 bytes, using 'compacted' format. <---- 卡点2,能卡3-4分钟。ai 之外首先编码都是由 AI 来编写的,我自己做的工作能够概括为让 AI 写什么和如何让AI写对。
|
0831-0906 进度本周概述PR #2070 ramdisk virtio pci 块设备识别了之前本地端到端测试超时的问题,wsl 环境嵌套虚拟化导致运行速度严重下降。之后的解决办法就是远端跑CI。 读写测试全部通过,也就是说至此有了一块 guest 能识别到并且读写的块设备。但需要说明的是这里的写功能只支持针对 ramdisk 后端的同步写。 详细设计记录与 #2070 更新的附件中。 启动盘验证依靠上面所实现的 PCI 块设备,本周还开始尝试将它当作启动盘用 UEFI 起 Guest。 我在本地制作了一个简易的镜像,看起来大概是这个样子: 整个镜像只有一个 FAT32 分区作为EFI系统分区,包含了所有启动需要的文件。大小只用 256 MiB,仅作为我在验证能否顺利地起guest。 但是其实并不那么顺利还是有问题。 目前已经跑进了 Linux,但是端到端测试不通过,时限30min依旧超时。正在排查原因 |
0907-0913 进度本周概述:本周最主要的成果就是跑通了UEFI 起 x86 Linux guest 的 CI 测试(本地WSL环境有问题会超时失败) 临时测试资产的制作
制作完成之后我将其压缩后放在: 测试逻辑guest 配置包含: 对于 后续起 guest 必须经过: OVMF、VirtIO PCI 磁盘、BOOTX64.EFI、GRUB、Linux 这样一条链路。 最后当匹配到 通过的日志 |
0921-0927 进度本周概述本周的工作来自 PR #2275。将其中三个可独立复用的问题拆出处理:
PR #2275这个分支验证了 Axvisor 的 x86_64 guest 不再通过 阻塞问题目前 UEFI 启动 x86 客户机的链路已经完成验,但启动盘资产的生成、获取和更新方式尚未确定。#2275 仍用上传手工构建的压缩包、运行前解压的临时方案,启动盘没有明确可复现的获取方式,目前想到的是两种:
这个方案打算新增类似如下的配置: [kernel]
source = "registry"
asset = "linux-x86_64"
version = "<固定版本>"
sha256 = "<摘要>"
[initramfs]
source = "local"
path = "./tmp/initramfs.cpio.gz"
[bootloader]
source = "registry"
asset = "grub-x86_64-efi"
version = "<固定版本>"
sha256 = "<摘要>"
[boot]
cmdline = "console=ttyS0 rdinit=/init"使用时类似: |



Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
七月
本月主要完成四架构共享的中断基础设施。
第一阶段:共享资源与 runtime 递送通道
Resource增加IrqLine { line: u32, trigger: InterruptTriggerMode },使用 BTreeMap 索引建立独占 IRQ line 注册,检测同一设备重复声明和不同设备占用同一 line,bundle 注册失败时回滚已登记的 IRQ line。(feat(axdevice): register exclusive IRQ line resources #1630)VirtualInterruptId(u32)和携带 trigger mode 的PendingVcpuInterrupt,避免 x86u8vector 限制扩散到其他架构。(feat(axvm): add virtual interrupt model types and per-vCPU dispatch queue #1661)VcpuIrqDispatcher(入队/出队/reset)和VcpuInterruptQueue(FIFO、vCPU 隔离),enqueue()不在锁内调用 wake/IPI/外部回调。(feat(axvm): add virtual interrupt model types and per-vCPU dispatch queue #1661)VmInterruptSender,持有Weak<AxVM>,每次发送时查找当前 runtime、不缓存 dispatcher;新增dispatch_vcpu_interrupt()按”入队 → notify → host IPI”顺序递送。(feat(axvm): add VmInterruptSender and integrate dispatcher into VmRuntimeHandle #1679)ArchOps::inject_vcpu_interrupt();迁移期继续 drain 旧pending_interrupts,双队列并存。(feat(axvm): add VmInterruptSender and integrate dispatcher into VmRuntimeHandle #1679)第二阶段:RISC-V 基线验证
8 月
从八月开始进行 xVisor x86_64 Guest UEFI 的支持工作。
第一阶段:诊断基础 — 固件入口验证
目标:建立一条可复现、可归因的诊断链,让每次 UEFI 启动都能确定"OVMF 走到了哪一步"。
第二阶段:PCI 与启动盘 — virtio-pci
目标:OVMF 通过 PCI 枚举发现 virtio-blk 设备,读取 ESP 并进入 UEFI Shell 或加载 EFI 应用。
本阶段已完成 PCI core 的,剩下的是加入 virtio-blk 设备和准备 GPT/ESP/rootfs 镜像。
9月
当前 dev 已经打通了“x86 UEFI guest 的固件交接和 Linux 早期用户态” 即直接通过 fw_cfg(提供kernel、initramfs等等) 进入Linux内核,但还没有打通标准的“OVMF 从 guest 磁盘 ESP 启动 Linux”。本月的目标就是“OVMF 从 guest 磁盘 ESP 启动 Linux”。
所以一条硬主链路是:
disk.img(包含GPT、ESP、rootfs、 BOOTX64.EFI) 能够和 virtio-blk-pci 并行开发,但是问题是 disk.img 先完成后 AxVisor 中没有地方能够消费这个镜像,只能通过普通 QEMU + OVMF 做独立预验证。
预计最难的点就是接入一块是接入一个能够同时被 OVMF 和 Linux 使用的 virtio-blk-pci guest 设备。
等这条链路梳理通后,就是补强:VARS、E820、SMBIOS 和 SMP。
All reactions