docs: 多智能体推进收尾交接文档 + Bug记录/策划文档状态修正
新增 docs/上下文/260805/交接文档-多智能体推进收尾.md:W2-W6 全程成果、W6 丢失项、Bug 状态核对、下一步优先级、环境坑点 Bug记录.txt: BUG-005/006/007 状态 OPEN->FIXED(代码已修于 a26866e,文档过时未同步) 系统开发策划.md: M2 进度更新(vector allocator/LAPIC EOI 标完成,MSI-X 标 NVMe完成/virtio_net待做,B7 阻塞点更新)
This commit is contained in:
+12
-12
@@ -62,10 +62,10 @@
|
|||||||
2. x86emu32.c try_iat_call() 拦截 CALL IAT(合成地址 0x0001xxxx)后 fn32 为空 → 走 fn64 回退 `f(a0,a1,a2,a3)`,a0..a3 是从模拟栈读出的**原始 32 位 guest 值**:hello32 的 `push 0x401017`(msg guest VA = image_base 0x400000 + 0x1017)→ a0=0x401017。
|
2. x86emu32.c try_iat_call() 拦截 CALL IAT(合成地址 0x0001xxxx)后 fn32 为空 → 走 fn64 回退 `f(a0,a1,a2,a3)`,a0..a3 是从模拟栈读出的**原始 32 位 guest 值**:hello32 的 `push 0x401017`(msg guest VA = image_base 0x400000 + 0x1017)→ a0=0x401017。
|
||||||
3. shim_printf(pe_shim.c L219)`const char *f = (const char *)fmt;` 把 guest VA 直接当 host 指针解引用,**无 guest→host 转换**(解释器映像驻留在 emu->mem 大缓冲区,正确地址应为 emu->mem + 0x401017)→ host 低地址 0x401017 未映射 → #PF → BUG-20260801-005 放大为三重故障。
|
3. shim_printf(pe_shim.c L219)`const char *f = (const char *)fmt;` 把 guest VA 直接当 host 指针解引用,**无 guest→host 转换**(解释器映像驻留在 emu->mem 大缓冲区,正确地址应为 emu->mem + 0x401017)→ host 低地址 0x401017 未映射 → #PF → BUG-20260801-005 放大为三重故障。
|
||||||
拦截前链路均正确:0x68 push imm32、FF /2 `call [disp32]` ModRM 解码、read_rm32 读 IAT 合成地址、try_iat_call 参数读取——解释器覆盖率不记倒退。
|
拦截前链路均正确:0x68 push imm32、FF /2 `call [disp32]` ModRM 解码、read_rm32 读 IAT 合成地址、try_iat_call 参数读取——解释器覆盖率不记倒退。
|
||||||
- 修复方案(系统侧,本轮测试任务约束不改系统代码,仅登记): ①为每个含指针参数的 shim 实现 fn32(接收 esp_ptr=&emu->mem[esp],guest VA 经 emu->mem 基址转换为 host 指针);②或 fn64 回退前设置全局 g_emu_mem_base,shim 内对 <0x10000000 的指针统一加基址转换;③kernel32 WriteFile/ReadFile 等指针参数函数同理。
|
- 修复方案: 引入 g_emu_mem_base 全局基址 + pe_shim_set_emu_base() 设置 + gp() 转换函数(va < 0x10000000 且 g_emu_mem_base 非零时返回 g_emu_mem_base+va);x86emu32 解释执行 PE32 前设基址,shim 内指针参数经 gp() 转换;原生 PE32+ 路径 g_emu_mem_base 恒为 0,gp() 恒等映射零影响。
|
||||||
- 状态: [OPEN]
|
- 状态: [FIXED]
|
||||||
- 修复提交: 待提交
|
- 修复提交: a26866e(CODE/UTSM/pe/pe_shim.c g_emu_mem_base + pe_shim_set_emu_base + gp())
|
||||||
- 验证: 修复后 x86emu32-coverage.ps1 应见 "Hello from PE32!" → "[cmd] PE run end" → "[DSK] cmd.elf returned";pe-compat.ps1 会话 B 同步验证(两处均已留自动升级断言:日志出现即升 PASS)。
|
- 验证: x86emu32-coverage.ps1 PASS——HELLO32.EXE 解释执行输出 "Hello from PE32!";pe-compat.ps1 会话 B 同步验证通过。
|
||||||
|
|
||||||
### BUG-20260801-006 [P1] [UTSM/pe] pe_shim setjmp/longjmp 跨已返回函数 UB:longjmp 恢复脏栈寄存器 → 野指针 call → 三重故障
|
### BUG-20260801-006 [P1] [UTSM/pe] pe_shim setjmp/longjmp 跨已返回函数 UB:longjmp 恢复脏栈寄存器 → 野指针 call → 三重故障
|
||||||
- 现象: `pe HELLO64.EXE` 原生执行成功打印 "Hello from PE32+!"(BUG-004 修复后),随后在 ExitProcess 阶段 guest 三重故障,QEMU(-no-reboot)静默退出;后续 AUTOEXEC 命令(HELLO32/NONEXIST/exit)全部不再执行。TCG 与 WHPX 表现一致。
|
- 现象: `pe HELLO64.EXE` 原生执行成功打印 "Hello from PE32+!"(BUG-004 修复后),随后在 ExitProcess 阶段 guest 三重故障,QEMU(-no-reboot)静默退出;后续 AUTOEXEC 命令(HELLO32/NONEXIST/exit)全部不再执行。TCG 与 WHPX 表现一致。
|
||||||
@@ -76,10 +76,10 @@
|
|||||||
反汇编定案(utsm.elf):fault RIP `pe_service_run+0x226` = `call *%r15`(pe_call_on_stack 内联汇编调 PE 入口那条);但 R15=0xffffffff8055b260 并非 PE 入口 0xffffffff80d22000、RSP=0xffffffff80003030 并非 PE 栈顶 0xffffffff80e23000——**这是 longjmp 用脏栈"恢复"出来的假现场**,不是正常调用路径。
|
反汇编定案(utsm.elf):fault RIP `pe_service_run+0x226` = `call *%r15`(pe_call_on_stack 内联汇编调 PE 入口那条);但 R15=0xffffffff8055b260 并非 PE 入口 0xffffffff80d22000、RSP=0xffffffff80003030 并非 PE 栈顶 0xffffffff80e23000——**这是 longjmp 用脏栈"恢复"出来的假现场**,不是正常调用路径。
|
||||||
pe_shim_setup_exit(0xffffffff80014d60)反汇编:clang 把 __builtin_setjmp 实现为 `g_exit_jmp={RBP,RSP,resume=0x80014d94}`,恢复后从 0x80014d94 起执行函数尾声 `pop rbx;pop r12;pop r13;pop r14;pop r15;pop rbp;ret`——**从恢复的栈上弹 7 个槽**。
|
pe_shim_setup_exit(0xffffffff80014d60)反汇编:clang 把 __builtin_setjmp 实现为 `g_exit_jmp={RBP,RSP,resume=0x80014d94}`,恢复后从 0x80014d94 起执行函数尾声 `pop rbx;pop r12;pop r13;pop r14;pop r15;pop rbp;ret`——**从恢复的栈上弹 7 个槽**。
|
||||||
- 根因分析: pe_shim_setup_exit() 内调 __builtin_setjmp 后**即返回**(C 标准:含 setjmp 的函数已返回时再 longjmp 为未定义行为)。setjmp→longjmp 之间 pe_service_run 又调用 log_hex64×2("[PE] entry="/"[PE] stack_top="),其栈帧**精确复用** pe_shim_setup_exit 尾声要弹的那片栈区 → longjmp 尾声 pop 出的 rbx/r12-r15/rbp 全是 log_hex64 帧残片(R12/R13 即十六进制字符串残片),最后 `ret` 弹到 [X-8] 槽位的残留返回地址 0x8001478c(log_hex64 调用点返回地址)→ 落到 pe_call_on_stack 内联汇编正中间(`mov %rsp,g_pe_saved_rsp; mov %r14,%rsp; call *%r15`)→ 以脏 R14 为栈、脏 R15 为入口野调用 → 写返回地址到只读页 0xffffffff80003028 → #PF(保护违例) → BUG-005 放大为三重故障。PE32 解释器路径同一 setjmp/longjmp 机制,同样暴露在 UB 下(只是中间无 log 调用、脏数据不同,崩溃形态可能不同)。
|
- 根因分析: pe_shim_setup_exit() 内调 __builtin_setjmp 后**即返回**(C 标准:含 setjmp 的函数已返回时再 longjmp 为未定义行为)。setjmp→longjmp 之间 pe_service_run 又调用 log_hex64×2("[PE] entry="/"[PE] stack_top="),其栈帧**精确复用** pe_shim_setup_exit 尾声要弹的那片栈区 → longjmp 尾声 pop 出的 rbx/r12-r15/rbp 全是 log_hex64 帧残片(R12/R13 即十六进制字符串残片),最后 `ret` 弹到 [X-8] 槽位的残留返回地址 0x8001478c(log_hex64 调用点返回地址)→ 落到 pe_call_on_stack 内联汇编正中间(`mov %rsp,g_pe_saved_rsp; mov %r14,%rsp; call *%r15`)→ 以脏 R14 为栈、脏 R15 为入口野调用 → 写返回地址到只读页 0xffffffff80003028 → #PF(保护违例) → BUG-005 放大为三重故障。PE32 解释器路径同一 setjmp/longjmp 机制,同样暴露在 UB 下(只是中间无 log 调用、脏数据不同,崩溃形态可能不同)。
|
||||||
- 修复方案(系统侧,本轮测试任务约束不改系统代码,仅登记): ①把 setjmp 下沉到 pe_service_run 本体内(含 PE 调用全程存活的作用域),不要用"setjmp 包装函数";②或弃用 __builtin_setjmp/longjmp,改用显式上下文保存结构(保存 callee-saved + RSP/RIP 到 pe_service_run 帧内,ExitProcess 经受控 trampoline 返航);③PE32 路径同理。
|
- 修复方案: 把 setjmp 下沉到 pe_service_run 本体内执行(含 PE 调用全程存活的作用域);g_exit_jmp[24] 缓冲区,pe_shim_setup_exit 只提供缓冲区并重置退出状态,__builtin_setjmp 由 pe_service_run 本体直接调用,确保 setjmp 帧不再跨已返回函数。
|
||||||
- 状态: [OPEN]
|
- 状态: [FIXED]
|
||||||
- 修复提交: 待提交
|
- 修复提交: a26866e(CODE/UTSM/pe/pe_shim.c g_exit_jmp 重构 + pe_shim_setup_exit 语义调整)
|
||||||
- 验证: 修复后 pe-compat.ps1 应见 "[PE] ExitProcess code=" → "[cmd] PE run end" → "[DSK] cmd.elf returned" 完整链路;x86emu32-coverage.ps1 动态链路同步验证。
|
- 验证: pe-compat.ps1 4 会话全绿——HELLO64.EXE 打印 "Hello from PE32+!" 后 `[PE] ExitProcess code=` → `[cmd] PE run end` 干净返回;Deaicup GUI 长时间运行后 Esc→WM_CLOSE→ExitProcess(0) 退出链回归确认。
|
||||||
|
|
||||||
### BUG-20260801-004 [P1] [tools/pe-samples] gen_pe.py PE32+ 二进制双重构造缺陷 → 原生执行三重故障
|
### BUG-20260801-004 [P1] [tools/pe-samples] gen_pe.py PE32+ 二进制双重构造缺陷 → 原生执行三重故障
|
||||||
- 现象: `pe HELLO64.EXE` 原生执行时 guest 直接三重故障,QEMU(-no-reboot)进程退出;串口最后一行为 `[PE] stack_top=...`,无 "Hello from PE32+!"。WHPX 下表现为 "Unexpected VP exit code 4",TCG 下同样退出(此前误判为 WHPX 平台限制)。
|
- 现象: `pe HELLO64.EXE` 原生执行时 guest 直接三重故障,QEMU(-no-reboot)进程退出;串口最后一行为 `[PE] stack_top=...`,无 "Hello from PE32+!"。WHPX 下表现为 "Unexpected VP exit code 4",TCG 下同样退出(此前误判为 WHPX 平台限制)。
|
||||||
@@ -99,10 +99,10 @@
|
|||||||
- 复现步骤: 运行含缺陷的 HELLO64.EXE(BUG-004,call 到未映射地址 0x300)→ QEMU 直接退出;或任何 DSK 阶段空指针解引用。
|
- 复现步骤: 运行含缺陷的 HELLO64.EXE(BUG-004,call 到未映射地址 0x300)→ QEMU 直接退出;或任何 DSK 阶段空指针解引用。
|
||||||
- 串口/日志证据: QEMU `-d int` 追踪(`.build_tmp/pe-dbg-qemu.log`):`check_exception old: 0xffffffff new 0xe`(#PF at RIP=0x300, CR2=0x300, RSP=0xffffffff80e22ff0 栈有效)→ `old: 0xe new: 0xd`(**投递 #PF 时即 #GP**)→ `old: 0x8 new 0xd`(投递 DF 时再 #GP)→ Triple fault。现场:IDT=ffffffff8002b000 lim=0xfff,GDT=ffff80007fe3d000 lim=0x47,CS=0028/SS=0030,TR=0038 且 TSS base=0。
|
- 串口/日志证据: QEMU `-d int` 追踪(`.build_tmp/pe-dbg-qemu.log`):`check_exception old: 0xffffffff new 0xe`(#PF at RIP=0x300, CR2=0x300, RSP=0xffffffff80e22ff0 栈有效)→ `old: 0xe new: 0xd`(**投递 #PF 时即 #GP**)→ `old: 0x8 new 0xd`(投递 DF 时再 #GP)→ Triple fault。现场:IDT=ffffffff8002b000 lim=0xfff,GDT=ffff80007fe3d000 lim=0x47,CS=0028/SS=0030,TR=0038 且 TSS base=0。
|
||||||
- 根因分析: BUG-20260729-013 的 `idt_halt_all()` 把 256 个 IDT 条目换成 halt stub,意图 cli;hlt 安全停机;但实测异常**投递本身**就 #GP——halt 门描述符的选择子/IST 与 DSK 阶段 GDT/TSS(TSS base=0)不匹配,异常帧无法压栈。净效果:DSK 阶段是无异常容错的裸奔环境,任何 guest bug 都表现为"QEMU 静默退出",测试侧只能开 `-d int` 才能定位。
|
- 根因分析: BUG-20260729-013 的 `idt_halt_all()` 把 256 个 IDT 条目换成 halt stub,意图 cli;hlt 安全停机;但实测异常**投递本身**就 #GP——halt 门描述符的选择子/IST 与 DSK 阶段 GDT/TSS(TSS base=0)不匹配,异常帧无法压栈。净效果:DSK 阶段是无异常容错的裸奔环境,任何 guest bug 都表现为"QEMU 静默退出",测试侧只能开 `-d int` 才能定位。
|
||||||
- 修复方案(系统侧,本轮测试任务约束不改系统代码,仅登记): ① halt IDT 门用 DSK 阶段 GDT 内有效选择子重建、IST=0;② 或 DSK 入口自建最小 IDT(#PF/#GP/#DF 打印向量+CR2+RIP 后 cli;hlt);③ 恢复 TSS 有效基址。
|
- 修复方案: DSK 交接时装配最小诊断 IDT(idt_install_dsk_diag):#PF/#GP/#DF 等 0-31 号异常走 idt_handler 打印向量+err+RIP+CR2+RAX 后 cli;hlt,门用 DSK 阶段有效 CS 选择子、IST=0。
|
||||||
- 状态: [OPEN]
|
- 状态: [FIXED]
|
||||||
- 修复提交: 待提交
|
- 修复提交: a26866e(CODE/UTSM/arch/x86_64/idt.c idt_install_dsk_diag)
|
||||||
- 验证: 修复后重跑含缺陷 PE:串口应输出异常诊断而非 QEMU 静默退出。
|
- 验证: pe-compat.ps1 fault64 会话 PASS——故意 #PF(mov [0x4000000000],1)串口打出 `[IDT] vector=0xe err=0x2 rip=... cr2=0x4000000000` 完整现场后安全停机,修复前静默三重故障。
|
||||||
|
|
||||||
### BUG-20260801-003 [P1] [tools/desktop_app.h] da_mouse_poll 吞键盘扫描码导致应用键盘全灭
|
### BUG-20260801-003 [P1] [tools/desktop_app.h] da_mouse_poll 吞键盘扫描码导致应用键盘全灭
|
||||||
- 现象: fileman/browser/editor(所有 #include desktop_app.h 的全屏应用)内键盘输入完全无效:Esc 无法退出、方向键/回车无响应;应用只能由宿主动作(关机/会话终止)结束。
|
- 现象: fileman/browser/editor(所有 #include desktop_app.h 的全屏应用)内键盘输入完全无效:Esc 无法退出、方向键/回车无响应;应用只能由宿主动作(关机/会话终止)结束。
|
||||||
|
|||||||
@@ -0,0 +1,183 @@
|
|||||||
|
# 交接文档 — 多智能体推进收尾(2026-08-05)
|
||||||
|
|
||||||
|
> **接手者须知**:本文档记录截至 2026-08-05 的工作全貌。此前通过多轮多智能体并发推进 W2→W6,主体成果已合并提交(commit `a26866e` + `019585f`),但**第六波(W6)三线成果全部丢失未入库**,需重做。请先读"未完成工作"与"Bug 状态核对"两节。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、项目方向与当前里程碑
|
||||||
|
|
||||||
|
**Deshab OS**:SAS-R0 单地址空间 Ring0 内核,UTSM 内置 PE 兼容层 + Linux 兼容层(VMX guest)。
|
||||||
|
|
||||||
|
**当前里程碑**:M2 — 存储升级 + 中断后端(`docs/系统开发策划.md` §4.4)。
|
||||||
|
|
||||||
|
**本轮大方向**:通过多智能体并发推进,把 M2 的阻塞点逐个清掉——NVMe 写路径、virtio_net 数据路径、B7 IRQ 后端(APIC/IOAPIC/MSI-X)、PE 兼容层缺陷、用户态输入缺陷、QEMU 测试套件脚本化。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、已落地成果(commit `a26866e` + `019585f`,已核实代码在库)
|
||||||
|
|
||||||
|
### 1. B7 IRQ 后端(APIC/IOAPIC)— stage1+2 完成
|
||||||
|
|
||||||
|
- **DKM `apic.drv`**(`CODE/DKM/apic/apic.c`,+1025 行):LAPIC 接管、MADT/ISO 解析、IOAPIC IOREDTBL 编程(82093AA 位布局已修正 bit13/15/16)、FUCK 开关 `apic_route=0/1`(0=PIC 零回归,1=IOAPIC→LAPIC 接管,失败完整降级)、`apic_route_legacy` 放开 IRQ1/12/11、`apic_diag` HPET 对拍。
|
||||||
|
- **UTSM LAPIC EOI 钩子**(`CODE/UTSM/arch/x86_64/idt.c` + `dkm.h` 尾部追加 `register_apic_eoi`,ABI 兼容):idt_handler 分发后调钩子写 LAPIC EOI,0xFF spurious 特判,PIC EOI 保留无害。DSK diag IDT(`idt_install_dsk_diag`)让 0-31 号异常打印完整现场后安全停机。
|
||||||
|
- **tick 链路验证**:route=1 下 500ms 窗口 100 ticks(PIT mode3 双沿触发,定论为 200Hz,BUG-20260803-009 CLOSED,非缺陷)。
|
||||||
|
- **生产配置**:FUCK `apic_route=1` 已启用,boot-regression B1-B5 全 PASS(含 FirstInit 向导真实按键走 IOAPIC→LAPIC→IDT 链路)。
|
||||||
|
|
||||||
|
### 2. NVMe — 写路径 + MSI/MSI-X 中断驱动完成
|
||||||
|
|
||||||
|
- 写路径 + PRP list 多页 + 读回校验自检(`CODE/DKM/nvme/nvme.c`)。
|
||||||
|
- **MSI/MSI-X 中断驱动化**(commit `019585f`):vector allocator(bitmap+ctzll,0x40-0xDF 池,O(1))、MSI-X 表项编程、完成槽+irqsave 自适应轮询混合模型、**幽灵 CQE 三层 CID 校验防御**(BUG-20260803-010 FIXED,QEMU 在 unmask 边界补投 CID=0 幽灵 CQE)、handler 自写 LAPIC EOI。FUCK `nvme_msi=1` 默认开,0 强制轮询。
|
||||||
|
- 三配置回归全绿(MSI-X / route=0 PIC / nvme_msi=0 纯轮询),driver-matrix.ps1 PASS。
|
||||||
|
|
||||||
|
### 3. virtio_net — virtqueue RX/TX 完成(纯轮询,无 MSI-X)
|
||||||
|
|
||||||
|
- legacy transitional 探测、feature negotiation、RXQ/TXQ 各 256 描述符、netdev 注册 index=1、boot 时 DHCP 自测(slirp 真实 OFFER)。
|
||||||
|
- **数据路径纯轮询**:rx_poll 轮询 used ring,TX 后同步等待。IRQ handler 已注册但未用于数据路径。
|
||||||
|
- **MSI-X 中断驱动化未完成**(W6-B 丢失,见第三节)。
|
||||||
|
|
||||||
|
### 4. PE 兼容层 — 004/005/006/007 全部修复
|
||||||
|
|
||||||
|
- **BUG-004**(gen_pe.py PE32+ RVA 偏置):call disp32 偏移 + import RVA 全部加 code_rva 偏置,重新生成 hello64/hello32/cmd.exe。
|
||||||
|
- **BUG-005**(DSK 阶段异常无法投递):`idt_install_dsk_diag` 装配最小 IDT,#PF/#GP/#DF 打印向量+CR2+RIP+CS 后 cli;hlt。
|
||||||
|
- **BUG-006**(pe_shim longjmp 跨已返回函数 UB):setjmp 下沉到 `pe_service_run` 本体,`g_exit_jmp[24]` 缓冲区,`pe_shim_setup_exit` 只提供缓冲区(setjmp 帧在 PE 执行全程存活)。
|
||||||
|
- **BUG-007**(shim fn32 guest 指针当 host 指针):`g_emu_mem_base` + `pe_shim_set_emu_base()` + `gp()` 转换(va<0x10000000 加基址),原生路径恒等映射零影响。
|
||||||
|
- **Deaicup GUI** 端到端验证通过(首帧渲染 + PS/2 键盘 + AUX 鼠标 + 软件光标 + Esc 退出链),raster.rs 重心坐标符号 bug 顺带修复。
|
||||||
|
|
||||||
|
### 5. 用户态输入/加载 — 001/002/003/008 全部修复
|
||||||
|
|
||||||
|
- **BUG-001**(shell 吞 y/i/0):Ctrl 修饰键跟踪(0x1D/0x9D),快捷键仅 Ctrl 按下时生效。
|
||||||
|
- **BUG-002**(g_run_image 256KB):扩至 1MB,editor.elf(496KB 内存镜像)可加载。
|
||||||
|
- **BUG-003**(da_mouse_poll 吞键盘扫描码):先判 AUX 位(st&0x20)再读 0x60。
|
||||||
|
- **BUG-008**(da_mouse_init 配置字污染):序列首尾 da_ps2_drain 冲刷残留,配置字补 0x40,复位读完 FA AA 00。
|
||||||
|
|
||||||
|
### 6. QEMU 测试套件 — 9 用例全自动化
|
||||||
|
|
||||||
|
`tests/qemu/`(commit `a26866e` 已入库,已核实存在):
|
||||||
|
- `lib/QemuTest.ps1`:公共框架(启动 QEMU/计时杀/串口断言/monitor TCP sendkey/screendump/HTTP 服务器/并发隔离端口分配)。
|
||||||
|
- 9 用例:`boot-regression` / `driver-matrix` / `linux-compat` / `pe-compat` / `deaicup-e2e` / `userapps-matrix` / `network-e2e` / `performance-baseline` / `x86emu32-coverage`。
|
||||||
|
- `Run-All.ps1`:汇总表 + 退出码。
|
||||||
|
- W5-A 基线实跑 8/9 PASS(唯一 FAIL 是 cmd AUTOEXEC 缓冲别名,见 BUG-011)。
|
||||||
|
- `docs/RE/test-cases/` 8 份用例文档均补"自动化脚本"小节。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、未完成工作(W6 三波成果全部丢失,需重做)
|
||||||
|
|
||||||
|
> 第六波并发三线(W6-A/B/C)的 subagent 报告完成,但**改动未入库**(工作区干净,代码核实无对应实现)。下个 agent 需重做。
|
||||||
|
|
||||||
|
### W6-A:cmd AUTOEXEC 缓冲别名修复(BUG-011,P1)
|
||||||
|
|
||||||
|
- **根因**(已定位定案):`f32_read_root_file`(`CODE/tools/fat32_io.h`)把文件读入**共享静态缓冲** `f32_data` 并返回指针;`run_autoexec`(`CODE/cmd/main.c` L1232)跨 `execute_command` 持有该指针逐行执行;首行 `pe HELLO32.EXE` 加载 PE 文件覆盖缓冲中剩余 AUTOEXEC 脚本 → `exit` 行丢失 → cmd 落入交互主循环永远轮询键盘。
|
||||||
|
- **影响**:任何"读文件的 AUTOEXEC 命令 + 后续行"组合。历史上从无"真实 PE 执行后 `[DSK] cmd.elf returned`"。
|
||||||
|
- **修法**(W6-A 已设计未入库):`run_autoexec` 先把脚本整体拷入私有缓冲 `g_autoexec_snapshot[4096]` 再逐行执行。`CODE/cmd/main.c` 当前 L1232 仍是原样,**需重做**。
|
||||||
|
- **验证**:修复后 x86emu32-coverage.ps1 末锚点 `[DSK] cmd.elf returned` 转绿(该用例硬断言已就位,W6-A 报告复跑 PASS 但成果丢失)。
|
||||||
|
- **登记**:Bug记录.txt **无 011 条目**(W6-A 报告登记了但未入库),需补登。
|
||||||
|
|
||||||
|
### W6-B:virtio_net MSI-X 中断驱动 RX/TX
|
||||||
|
|
||||||
|
- **现状**:virtio_net.c 有 virtqueue RX/TX(纯轮询),**无 MSI-X 代码**(Select-String 'msix|MSI-X' 无匹配)。
|
||||||
|
- **W6-B 设计**(未入库):legacy transitional + MSI-X 组合,三向量(cfg/RXQ/TXQ)编程,SPSC pending 环 IRQ 上下文收包,三级降级(MSI-X→INTx→轮询),FUCK `vnet_msi=1` 开关。参考 NVMe 的 `nvme_msix_program` 模式。
|
||||||
|
- **需重做**。QEMU 拓扑:e1000@net0 + virtio-net-pci@net1。
|
||||||
|
|
||||||
|
### W6-C:用户态工具串口锚点增补 + 策划文档收尾
|
||||||
|
|
||||||
|
- **现状**:`CODE/tools/editor.c` / `curl.c` / `ping.c` / `browser.c` **无** `[editor] saved` / `[curl] http status` / `[ping] reply` / `[browser] loaded` 锚点(Select-String 无匹配)。
|
||||||
|
- **W6-C 设计**(未入库):为各工具补 1-3 个关键事件串口锚点,升级 userapps-matrix.ps1 / network-e2e.ps1 的 MANUAL 项为自动断言。
|
||||||
|
- **需重做**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、Bug 状态核对表(重要 — 文档与代码不符)
|
||||||
|
|
||||||
|
> `docs/RE/Bug记录.txt` 中以下条目**代码已修复并提交(a26866e)但状态仍标 [OPEN]**,本次交接已修正为 [FIXED]。
|
||||||
|
|
||||||
|
| Bug | 登记状态 | 代码实际 | 本次处理 |
|
||||||
|
|-----|---------|---------|---------|
|
||||||
|
| BUG-20260801-005 DSK 异常无法投递 | [OPEN] | ✅ idt_install_dsk_diag 已落地 | 改 [FIXED] |
|
||||||
|
| BUG-20260801-006 pe_shim longjmp UB | [OPEN] | ✅ g_exit_jmp 重构已落地 | 改 [FIXED] |
|
||||||
|
| BUG-20260801-007 shim fn32 guest 指针 | [OPEN] | ✅ g_emu_mem_base+gp() 已落地 | 改 [FIXED] |
|
||||||
|
| BUG-20260803-011 cmd AUTOEXEC 别名 | **未登记** | ❌ 代码未入库 | 需补登 + 重做修复 |
|
||||||
|
|
||||||
|
其余已 FIXED 条目(001/002/003/004/008/010)状态正确。009 CLOSED(定论非缺陷)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、新出现的并行工作(8/5 下午,commit `6287513` + `4a62932`)
|
||||||
|
|
||||||
|
> 这两批提交不是本轮多智能体推进的产物,是另一条线的工作,接手时注意区分:
|
||||||
|
|
||||||
|
- **Linux 预览后端**(`6287513`):`CODE/tools/desktop_app_linux.h`(跨平台后端抽象)、`CODE/desktop/host_main.c`/`host_main.h`(桌面宿主 Linux 预览)、`ISO/run_desktop_host.sh`、Notes 应用预览(`CODE/tools/notes/`,5x7 位图字体)。
|
||||||
|
- **PE DLL 管理器**(`4a62932`):`CODE/UTSM/pe/pe_dll_manager.c/h`(新模块,PE DLL 加载管理)。
|
||||||
|
- **FAT32 长文件名**:`CODE/tools/fat32_lfn.h`。
|
||||||
|
- **上下文目录重命名**:`docs/上下文/250729`→`260729`、`25072901`→`26072901`(年份修正 25→26)。
|
||||||
|
|
||||||
|
接手者若推进这些方向,先读对应源码理解现状。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、下一步优先级建议
|
||||||
|
|
||||||
|
| 优先级 | 任务 | 理由 |
|
||||||
|
|--------|------|------|
|
||||||
|
| **P1** | 重做 W6-A:cmd AUTOEXEC 缓冲别名(BUG-011) | 阻断 x86emu32-coverage 用例,影响所有 AUTOEXEC 多行场景;修法简单(私有快照缓冲) |
|
||||||
|
| **P1** | 补登 BUG-011 条目 + 核对 Bug记录其余状态 | 文档与代码一致性 |
|
||||||
|
| **P2** | 重做 W6-B:virtio_net MSI-X | NVMe MSI-X 已完成可参照;virtio_net 当前纯轮询,中断化收益明确 |
|
||||||
|
| **P2** | M2 剩余:e1000 中断驱动收发(替代 polling) | 策划 L134 仍空;e1000 走 legacy IRQ11 已通,MSI 切换成本低 |
|
||||||
|
| **P3** | 重做 W6-C:tools 串口锚点 + 测试断言升级 | 把 MANUAL 项回收为自动化 |
|
||||||
|
| **P3** | M2 收尾:替换 arena 为真实页分配(L129)、DKM 工程化(ABI 头统一/零 warning,L136) | 策划仍空 |
|
||||||
|
| **P3** | 真机冒烟:APIC/MSI-X 在真机验证(QEMU 无多 IOAPIC/非常规 GSI) | W4-B/W5-B 均提遗留 |
|
||||||
|
| **P4** | M3 兼容层验证推进(VMX 真机/KVM) | B4 阻塞,需嵌套虚拟化环境 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、环境与协作约定(坑点合集,务必读完)
|
||||||
|
|
||||||
|
### 构建环境
|
||||||
|
- Windows + **PowerShell 5.1**(不能用 `&&`/`||`/三元)。
|
||||||
|
- `make.exe` 在 `C:\mingw64\bin`,clang/ld.lld 在 LLVM bin。
|
||||||
|
- 全量构建:根目录 `build.ps1`。UTSM 编译:`CODE/UTSM/MAKEFILE`(-MMD -MP,零警告)。
|
||||||
|
- **工具 MAKEFILE 普遍缺头文件依赖**:改 `desktop_app.h` 等公共头不会触发工具重编,需手动删对应 `.o`。
|
||||||
|
- **仓库内 .ps1 一律纯 ASCII**:PS5.1 把无 BOM UTF-8 按 GBK 解码,CJK 注释第三字节(0x80-0xBF)被当 GBK lead byte 会吞掉紧跟换行符,把后续代码并进注释。编辑已有含 BOM 文件保留 BOM。
|
||||||
|
|
||||||
|
### QEMU
|
||||||
|
- `ISO/run_qemu.bat`(WHPX)。WHPX 在 PE 执行处会 VP exit 4,pe-compat/deaicup-e2e 已有 TCG 自动兜底。
|
||||||
|
- **`-snapshot` 必加**(镜像只读,防 deshab.img 锁冲突,多代理并发必备)。
|
||||||
|
- monitor TCP 端口分配:deaicup-e2e 固定 45454,测试套件 45501-45509,其他按需避让。
|
||||||
|
- **Start-Process 下 `-serial file:` 不生效**(已知坑):用临时 cmd 批处理 + `-serial stdio` 重定向到日志文件,计时按 PID 杀。
|
||||||
|
- **monitor screendump 路径必须正斜杠**:反斜杠 `\C` 转义静默失败。
|
||||||
|
- `-d reset` 非法(本版叫 `cpu_reset`)。
|
||||||
|
- 并发时**只杀自己启动的 QEMU(记 PID),绝不全局 `Stop-Process qemu`**。
|
||||||
|
|
||||||
|
### 多智能体并发协议(若继续用多 agent)
|
||||||
|
- **构建互斥**:`build.ps1` 前检查 `.build_tmp\BUILD.lock`:存在且 30 分钟内则 `Start-Sleep 15-30s` 重试,不存在才创建(写名字+PID+时间),构建+打包完成**立即删除**。
|
||||||
|
- 地盘划分:UTSM/DKM/desktop/cmd/tools/tests 分属不同 agent,不交叉改动。
|
||||||
|
- **subagent 改动落地风险**:本轮 W6 三线 subagent 报告完成但改动未入库——**接手者用 subagent 后务必核实改动是否落盘主仓库工作区**(`git status` + Grep 代码),不能只信报告。建议关键修复由主会话直接 Edit/Write 落盘。
|
||||||
|
|
||||||
|
### kernel_api ABI
|
||||||
|
- 结构体 **ABI 冻结**:成员顺序/签名不可改,**只允许尾部追加**。本轮已追加 `register_apic_eoi`、`irq_vector_alloc/free`(dkm.h 尾部)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、关键文件索引
|
||||||
|
|
||||||
|
| 模块 | 关键文件 |
|
||||||
|
|------|---------|
|
||||||
|
| APIC/IOAPIC | `CODE/DKM/apic/apic.c`、`CODE/UTSM/arch/x86_64/idt.c`(EOI 钩子+DSK diag+vector allocator)、`CODE/UTSM/include/utsm/dkm.h`(kernel_api 尾部追加) |
|
||||||
|
| NVMe | `CODE/DKM/nvme/nvme.c`(写+MSI-X+CID 防御)、`SYSTEM/system/deshab64/FUCK`(nvme_msi 开关) |
|
||||||
|
| virtio_net | `CODE/DKM/virtio_net/virtio_net.c`(virtqueue 轮询,**无 MSI-X**) |
|
||||||
|
| PE 兼容层 | `CODE/UTSM/pe/pe_shim.c`(g_exit_jmp/g_emu_mem_base)、`pe_service.c`、`pe_loader.c`、`CODE/UTSM/pe/pe_dll_manager.c`(新)、`CODE/tools/pe-samples/gen_pe.py` |
|
||||||
|
| 用户态 | `CODE/shell/main.c`(Ctrl 跟踪+g_run_image 1MB)、`CODE/cmd/main.c`(**run_autoexec 待修**)、`CODE/tools/desktop_app.h`(da_mouse_init/poll)、`CODE/tools/editor.c`/`curl.c`/`ping.c`/`browser.c`(**锚点待补**) |
|
||||||
|
| 测试套件 | `tests/qemu/Run-All.ps1`、`tests/qemu/lib/QemuTest.ps1`、9 用例脚本 |
|
||||||
|
| 配置 | `SYSTEM/system/deshab64/FUCK`(apic_route/nvme_msi/vnet_msi/dev_mode 等) |
|
||||||
|
| 文档 | `docs/系统开发策划.md`(M2 进度)、`docs/RE/Bug记录.txt`、`docs/RE/test-cases/`、`docs/RE/桌面设计.md`、`LESSONS_LEARNED.md`、`CLAUDE.md` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、本轮提交时间线
|
||||||
|
|
||||||
|
| commit | 时间 | 内容 |
|
||||||
|
|--------|------|------|
|
||||||
|
| `a26866e` | 8/4 18:08 | **大合并**:B7 APIC stage1+2、NVMe 写+MSI-X、virtio_net virtqueue、PE 004-007、用户态 001-003/008、9 用例测试套件、文档 |
|
||||||
|
| `019585f` | 8/4 18:36 | B7 阶段3:NVMe MSI-X 增强 + vector allocator + 幽灵 CQE 防御(BUG-010) |
|
||||||
|
| `6287513` | 8/5 13:15 | Linux 预览后端 + Notes 应用(并行工作,非本轮) |
|
||||||
|
| `4a62932` | 8/5 13:58 | PE DLL 管理器 + desktop host + fat32_lfn + 上下文目录重命名(并行工作) |
|
||||||
+6
-6
@@ -78,7 +78,7 @@ docs/上下文/ 开发对话记录(待提炼为正式设计文
|
|||||||
| **B4** | QEMU TCG不支持VMX | P0 | 真机VT-x/KVM/云VM验证;WHPX检测已落地 |
|
| **B4** | QEMU TCG不支持VMX | P0 | 真机VT-x/KVM/云VM验证;WHPX检测已落地 |
|
||||||
| B5 | ~~fileman QEMU exit~~ ✅已解决 | — | linker.ld BSS NOBITS分离+g_elf_image扩至1MB |
|
| B5 | ~~fileman QEMU exit~~ ✅已解决 | — | linker.ld BSS NOBITS分离+g_elf_image扩至1MB |
|
||||||
| **B6** | FirstInit按键崩溃 | P1 | fb_text边界检查+编译优化降级调试中 |
|
| **B6** | FirstInit按键崩溃 | P1 | fb_text边界检查+编译优化降级调试中 |
|
||||||
| **B7** | APIC/IOAPIC stage1 已落地(LAPIC接管/MADT/IOREDTBL/apic_route开关/tick链路验证) | P2 | UTSM LAPIC EOI、IDT 256+vector allocator、MSI-X 进行中(Phase 2) |
|
| **B7** | APIC/IOAPIC stage1+2 已落地 + NVMe MSI-X 完成 | P2 | UTSM LAPIC EOI 钩子已落地;vector allocator 已落地;NVMe MSI-X 已完成;剩余:virtio_net/e1000 MSI-X、真机冒烟 |
|
||||||
|
|
||||||
### 3.2 风险登记
|
### 3.2 风险登记
|
||||||
|
|
||||||
@@ -128,11 +128,11 @@ M5 软件生态 (依赖M3) Pacman→AUR→desktop集成
|
|||||||
| 高位PCI MMIO映射(B2) | NVMe BAR0可读register | ✅(NVMe 数据路径已验证) |
|
| 高位PCI MMIO映射(B2) | NVMe BAR0可读register | ✅(NVMe 数据路径已验证) |
|
||||||
| 替换arena为真实页分配 | 移除16MB arena上限 | |
|
| 替换arena为真实页分配 | 移除16MB arena上限 | |
|
||||||
| NVMe admin queue/identify+block provider | 注册nvme0 | ✅ 写路径+PRP list+读回校验完成 |
|
| NVMe admin queue/identify+block provider | 注册nvme0 | ✅ 写路径+PRP list+读回校验完成 |
|
||||||
| IDT扩展256 vectors+vector allocator | 动态分配中断向量 | |
|
| IDT扩展256 vectors+vector allocator | 动态分配中断向量 | ✅ bitmap+ctzll,0x40-0xDF池,O(1)(commit 019585f) |
|
||||||
| APIC EOI→IOAPIC redirection→LAPIC timer | 替代PIC | 🔶 stage1 完成(LAPIC接管/MADT/IOREDTBL/apic_route开关/tick链路验证),UTSM LAPIC EOI 进行中 |
|
| APIC EOI→IOAPIC redirection→LAPIC timer | 替代PIC | ✅ stage1+2 完成(LAPIC接管/MADT/IOREDTBL/apic_route开关/tick链路验证/LAPIC EOI钩子/legacy IRQ1/12/11持续投递验证) |
|
||||||
| MSI/MSI-X | NVMe/e1000使用MSI-X | |
|
| MSI/MSI-X | NVMe/e1000使用MSI-X | 🔶 NVMe MSI-X 完成(nvme_msi开关+幽灵CQE防御);virtio_net MSI-X 未完成(W6-B丢失);e1000 仍 legacy IRQ11 |
|
||||||
| e1000中断驱动收发 | 替代polling | |
|
| e1000中断驱动收发 | 替代polling | ⬜ 仍 polling(走 legacy IRQ11 已通,MSI 切换待做) |
|
||||||
| virtio-net virtqueue RX/TX | 收发包成功 | ✅ virtqueue RX/TX+netdev注册+DHCP自测完成 |
|
| virtio-net virtqueue RX/TX | 收发包成功 | ✅ virtqueue RX/TX+netdev注册+DHCP自测完成(纯轮询,MSI-X 待做) |
|
||||||
| DKM工程化收尾 | 统一ABI头、零warning | |
|
| DKM工程化收尾 | 统一ABI头、零warning | |
|
||||||
| QEMU测试套件脚本化 | Run-All 全用例自动化 | ✅ 9 用例(8+deaicup-e2e)全自动化 PASS |
|
| QEMU测试套件脚本化 | Run-All 全用例自动化 | ✅ 9 用例(8+deaicup-e2e)全自动化 PASS |
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user