Files
Deshab-OS/.learnings/LEARNINGS.md
T

24 KiB
Raw Blame History

Learnings

Corrections, insights, and knowledge gaps captured during development.

Categories: correction | insight | knowledge_gap | best_practice

[LRN-20260912-003] correction

Logged: 2026-09-12T19:50:00+08:00 Priority: critical Status: in_progress Area: backend

Summary

只改 LINUX_DEFAULT_CMDLINE 再 ld.lld 不够:linux_loader.o 若没有对应 .d,make 不会重编,旧 nohlt idle=poll 会继续打进 guest。

Details

linux_loader.h 19:33 已去掉 nohlt idle=poll,utsm.elf 19:34 重新链接,但 linux_loader.o 仍是 9 月 10 日。串口仍是 cpu_idle_poll NULL deref + Attempted to kill the idle task。验证跑的是 /home/deshab/deshab-dev.img,只在体积变化时才从 ISO 整盘复制,所以必须同时 patch 两份 GPT。

Suggested Action

改 cmdline 后强制删 vmm/linux_loader.o 再 make;strings utsm.elf 确认无 nohlt/idle=poll;patch_boot_on_img.sh 打 ISO 和 /home/deshab/deshab-dev.img。不要再加 idle=poll/nohlt。Xorg 诊断不要只写 /dev/kmsg(限流会吞 sed 输出),用 log() 打 /dev/console。vdb 是 ro,不能 bind /tmp//run 进 persist(会变成只读,Xorg 建不了 socket、seatd 建不了 sock);这两个目录要挂 tmpfs。persist /usr/lib/Xorg 文件大小与官方包相同(2642568)但 ELF 头被砸坏(e_entry=0,.text 只有 14KB);官方包入口是 0x35900。不要改 extra-rootfs,把完好 Xorg 放 vdb /usr/local/lib/Xorg.good 再 bind。Xorg.good 起来后 persist 的 libXdmcp.so.6.0.0 不是 ELF。官方 Xorg NEEDED 闭包用 LD_LIBRARY_PATH=/usr/local/lib/xorg-libs 覆盖后,X socket 能起来。Plasma 立刻 127 不是 startplasma 本身缺文件:runuser 的传递依赖 libcap-ng.so.0 头坏了(PATH 若先搜 sbin,会跑到更直接依赖它的 /usr/sbin/runuser)。用官方 libcap-ng.so.0 放进 xorg-libs 后,runuser 能过,下一步是 Plasma 状态 135(128+SIGBUS),stderr 空,要看 dmesg 才知道是哪段库或 vdc 校验。不要把只有 starting Plasma、还没确认没有 Plasma failed 的窗口当成 VERIFY_KDE_PLASMA_OK。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/include/utsm/linux_loader.h, CODE/UTSM/vmm/linux_loader.c, CODE/linux/tmp_run_visible.sh
  • Tags: idle, cmdline, kde, xorg
  • See Also: LRN-20260912-002

[LRN-20260912-002] insight

Logged: 2026-09-12T14:45:00+08:00 Priority: high Status: pending Area: backend

Summary

KDE extra-rootfs glibc 带 XSAVE/YMM/ZMM GNU property;L2 CPUID 隐藏 XSAVE 后 persist bash/Xorg 在 chroot 里立刻 127。不要 objcopy --remove-section=.note.gnu.property(会留下零长度 GNU_PROPERTY 头,interpreter 无法加载)。

Details

vdb e2fsck 干净,运行时 ext4_lookup checksum 打在 grep/mkdir/mount。静态 utsm_bindmount 能 bind /dev。persist ld.so 直接跑会 SHSTK 写地址 0;chroot persist bash=127;叠 vdb ld.so+libc=139。

Suggested Action

要么给 L2 做完整 XSAVE 保存/恢复(并放开 CPUID),要么 extra 换无 AVX glibc / Xfbdev 小用户态。不要再拆 GNU property section。

Resolution

  • Resolved: 2026-09-12T15:42:00+08:00 (XSAVE half)
  • Notes: L2 XSAVE+AVX 已落地(XCR0=7,832B,内核 Enabled xstate features 0x7)。persist bash ISA needed 只是 x86-64-baseline。直接 exec persist ld.so 仍在 _dl_find_dso_for_object 写 -40 崩;vdb ld.so + persist bash 能起来。vdc 必须 ro,noload + overlay/tmpfs upper,绝不能 remount vdb/vdc rw。镜像 e2fsck 干净时仍可能 runtime checksum(mkdir/chmod/touch/libreadline)——virtio 读路径问题,不要靠给 extra-rootfs 反复 inject 修。/usr/bin/Xorg 是 271 字节 wrapper(会 exec suid Xorg.wrap);真服务器是 /usr/lib/Xorg,且会 daemonize,要用 -keeptty 并等 socket 而不是等父进程。guest clocksource 被标成 refined-jiffies,nanosleep 依赖 PIT IRQ0。不要再拆 GNU property。

Metadata

  • Source: conversation
  • Related Files: CODE/linux/guest/deshab-kde-session, CODE/UTSM/vmm/vmexit.c, CODE/linux/initramfs/bin/utsm_bindmount.c
  • Tags: kde, xsave, persist, chroot


[LRN-20260906-001] correction

Logged: 2026-09-06T18:30:00+08:00 Priority: high Status: pending Area: backend

Summary

VMX TRUE CTLS 低半字是 allowed-0(bit=0 必须为 1),不是 must-be-1 位图;旧 OR-low 公式漏 Virtual NMIs 等 must-be-1 位。

Details

交接与初版计划把 Intel/KVM 极性说反,并把 cpu bit26、VPID 非零+enable=0 当成 error 7。复核后:SDM A.3 低 32=allowed-0、高 32=allowed-1;(desired & high) | low 与 KVM (desired | low) & high 都不会补 low=0 的必须-1 位。自测 pin=0x1f 缺 bit 5,同 MSR 下 Intel 公式应得 0x29。VPID 禁用时字段非零不是 SDM 列出的检查。.build_tmp/kvm_smoke_serial.log 从未 vmlaunch。

Suggested Action

嵌套 KVM 实测:CTLS2 allowed0=0,~allowed0 会打开全部 secondary 位并继续 error 7。正确公式是 KVM 极性 (desired | allowed0) & allowed1。继续查 EPTP/MSR bitmap 等一致性。

Resolution

  • Resolved: 2026-09-06T18:45:00+08:00
  • Notes: ~low 会把 CTLS2 全打开。自测真正过线的是 pin 加上 Virtual NMIs(0x3f)。EPTP 改 UC 会回归 error 7,保持 WB。

Metadata

  • Source: conversation
  • Related Files: CODE/UTSM/vmm/vmx.c, CODE/UTSM/vmm/vmm.c, CODE/UTSM/vmm/linux_boot.c
  • Tags: vmx, error7, true-ctls
  • Pattern-Key: harden.input_validation

[LRN-20260906-002] correction

Logged: 2026-09-06T21:35:00+08:00 Priority: high Status: promoted Promoted: CLAUDE.md Area: infra

Summary

发行物必须全部落入 SYSTEM/;打包只扫描 SYSTEM/,不从 /home 或其它路径取镜像。

Details

Phase 0 曾把 KDE/Python rootfs 留在 WSL /home/deshab/,避免塞进 2GiB FAT32 ESP。用户明确要求:所有软件装在 SYSTEM/,打包时不要从其它地方找,直接把整个 SYSTEM 打成一个镜像。FAT32 单文件不能超过 4GiB-1,因此 extra-rootfs 默认改为 3900MB。

Suggested Action

构建脚本最终输出一律写 SYSTEM/boot;build.ps1 按 SYSTEM 体积自动扩 ESP;Limine 模块路径只引用 SYSTEM/boot 下的文件。

Metadata

  • Source: user_feedback
  • Related Files: build.ps1, SYSTEM/limine/limine.conf, CODE/linux/build_extra_rootfs.sh
  • Tags: system, pack, fat32
  • Pattern-Key: harden.input_validation

[LRN-20260906-003] correction

Logged: 2026-09-06T22:20:00+08:00 Priority: high Status: promoted Promoted: CLAUDE.md Area: infra

Summary

磁盘镜像改为 GPT 双分区:FAT32 ESP 只放引导(EFI/limine/boot),其余 SYSTEM/ 进 ext4。

Details

用户要求把文件系统换成 ext4 + Fat32 引导分区 boot 文件夹。原先 New-GptFat32Image 把整个 SYSTEM/ 打进单一 FAT32 ESP。现由 WSL pack_system_image.sh 写 p1 FAT32 + p2 ext4;Limine 用固定 ext4 UUID 加载 /driver 与 /system,boot(): 仅指向 ESP 上的 /boot。FAT32 4GiB 单文件上限仍约束 SYSTEM/boot 里的 extra-rootfs。

Suggested Action

打包只走 pack_system_image.sh;改 limine 数据路径时同步 EXT4_UUID。DSK 运行时 FAT32 读取仍走独立 SATA 测试盘(整盘 LBA0),不要假设主 virtio 盘 LBA0 是 BPB。

Metadata

  • Source: user_feedback
  • Related Files: CODE/linux/pack_system_image.sh, build.ps1, SYSTEM/limine/limine.conf
  • Tags: gpt, fat32, ext4, pack
  • Pattern-Key: harden.input_validation

[LRN-20260906-004] knowledge_gap

Logged: 2026-09-06T22:45:00+08:00 Priority: high Status: promoted Promoted: CLAUDE.md Area: boot

Summary

Limine 10 不能从 ext4 加载模块;uuid() 只能指向它能读的 FAT 卷。

Details

GPT 双分区后把 driver/system 放到 ext4 并用 uuid(...):/driver/...,Limine 10.8.5 在加载 utsm.elf 后 PANIC:Failed to open module。boot(): /boot/utsm.elf 成功是因为文件在 FAT32 ESP。

Suggested Action

ESP 必须包含 Limine 要加载的全部路径:/EFI /limine /boot /driver /system。ext4 只作数据分区。

Metadata

  • Source: qemu_serial_loop1.log
  • Related Files: SYSTEM/limine/limine.conf, CODE/linux/pack_system_image.sh
  • Tags: limine, ext4, fat32
  • Pattern-Key: harden.input_validation

[LRN-20260907-001] insight

Logged: 2026-09-07T06:41:00+08:00 Priority: high Status: resolved Area: backend

Summary

/dev/utsm ioctl 的 payload 已在 copy_from_user 整结构之后进入内核栈,必须 memcpy,不能再 copy_*_user 结构体内部数组。

Details

UTSM_IOCTL_RECV_MSG 对 umsg.data(内核地址)做 copy_to_user 得到 -EFAULT。daemon 当成空 ring,立刻 park,host lxc_exec 返回 -4。EXEC_READY 能过是因为 data_len==0。同一 bug 也让 desktop guest ping 误报 “Linux guest not running”。

Suggested Action

ioctl 先整包 copy_from_user,内核内 memcpy payload,再整包 copy_to_user。改 CODE/linux/patches/utsm_hcall.c 后必须拷到 WSL 原生树 /home/deshab/linux-6.6 重编 bzImage,不要经 /mnt/d 改内核源。

Metadata

  • Source: error
  • Related Files: CODE/linux/patches/utsm_hcall.c, CODE/linux/initramfs/bin/utsm_exec_daemon.c, CODE/UTSM/vmm/linux_compat.c
  • Tags: ioctl, ipc, linux-guest, kde
  • See Also: ERR-20260906-001

[LRN-20260907-002] correction

Logged: 2026-09-07T21:20:00+08:00 Priority: high Status: pending Area: tooling

Summary

KDE/DSK 验证必须用 ISO/deshab-dev.img。.build_tmp/sata_fat32_dsk.img 只是 QEMU 额外挂的 AHCI 测试盘;UTSM 优先从 block0 FAT32 读 deshab.elf,挂上它就会把 ISO ESP 上的 DSK 盖掉。

Details

用户明确纠正:测的是 ISO 下的 dev 镜像,不是 SATA。run_qemu_kvm.sh 默认挂 SATA,导致热补 ESP 的 deshab.elf 不生效。另外 QEMU 开着时 pack_system_image.sh 最后 cp 到 ISO/*.img 会因文件占用失败,三个镜像时间戳都不动。build/configs/ 目前不存在,both 只会 WARN 后用同一份 SYSTEM 打三份。打包日志里的 FAT32 是 GPT p1 ESP(Limine 不能读 ext4),p2 才是 ext4;linux-extra-rootfs.img 必须放在 ESP,所以镜像看起来像“大 FAT32”。SATA sidecar 重建也会打出 FAT32 字样,但那不是 ISO 系统盘。

Suggested Action

验证脚本设 SATA_IMG_OVERRIDE 为不存在的路径。打包前先停 QEMU。不要把 SATA 测试盘当成系统镜像。

Metadata

  • Source: conversation
  • Related Files: ISO/run_qemu_kvm.sh, CODE/linux/qemu_verify_loop.sh, CODE/UTSM/kernel/dsk_loader.c, build.ps1
  • Tags: qemu, sata, iso, dsk-loader
  • Pattern-Key: harden.input_validation

[LRN-20260907-003] insight

Logged: 2026-09-07T22:30:00+08:00 Priority: high Status: resolved Area: backend

Summary

ESP ≥ 4GiB 时 pack 使用 32KiB FAT 簇。DSK 仍按 8 扇区读 4KiB 缓冲,desktop.elf 入口是垃圾代码,一跳就复位。

Details

修好后串口有 fat32 spc=0x40、desktop ready、user/desktop 图标。firstInit 走 LFN system/user/use/firstInit.txt。

Suggested Action

簇缓冲 ≥ 32KiB,读长度用 BPB spc。

Metadata

  • Source: error
  • Related Files: CODE/dsk/main.c, CODE/tools/fat32_io.h, CODE/linux/pack_system_image.sh
  • Tags: fat32, cluster, desktop
  • See Also: LRN-20260907-002

[LRN-20260907-004] insight

Logged: 2026-09-07T22:45:00+08:00 Priority: high Status: resolved Area: backend

Summary

virtio-mmio 未实现的 SHM 长度必须是 (u64)-1,否则 Linux virtio-gpu probe -EBUSY。virtio-blk config 必须与 Linux uapi 同布局。

Details

修好后 guest Initialized virtio_gpu + SET_SCANOUT 1024x768。vdb/vdc 仍 sector 0 I/O error(见 ERR-20260907-001)。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/virtio_mmio.c, CODE/UTSM/vmm/virtio_blk.c
  • Tags: virtio, gpu, shm

[LRN-20260908-001] insight

Logged: 2026-09-08T23:30:00+08:00 Priority: high Status: pending Area: backend

Summary

initramfs 必须在 mount --move /dev 之前挂 /dev/vdc;KDE 在 extra-rootfs 的 /mnt/persist。glibc #GP 在 endbr64,不是 drm fbdev 的 SET_SCANOUT。

Details

[ -b /dev/vdc ] 在 /dev 被 move 走之后恒为假。kmsg 日志才能从串口里捞到 init 行。验证脚本不能把启动时 virtio-gpu fbdev KDE scanout w= 当成 Plasma。 musl busybox 无 SHSTK 会在 push 上对地址 0 写崩溃;Arch bash/glibc 有 IBT,崩在 endbr64。Host 侧不要 wrmsr CET MSR(#GP 掉 UTSM)。

Suggested Action

给 Linux guest 做正确的 VMX CET 虚拟化,或换一套无 IBT 的用户态。在此之前 startplasma 起不来。

Metadata

  • Source: error
  • Related Files: CODE/linux/initramfs/init, CODE/UTSM/vmm/vmexit.c, CODE/linux/guest/deshab-kde-session
  • Tags: overlay, vdc, cet, ibt, glibc

[LRN-20260910-001] insight

Logged: 2026-09-10T12:30:00+08:00 Priority: high Status: pending Area: backend

Summary

Nested KVM 不虚拟化 CET VMCS;用户态 #GP 能进 L1 但 guest_fetch 读到 0,不能按字节 skip ENDBR。Host SHSTK 让 musl busybox push 写地址 0。

Details

insn0=0 但 RIP 仍是 libc ...140。盲 skip 4 字节会消掉 dmesg 里的 #GP,但 busybox.static 仍 segfault at 0 ip=0x4bede0 error 6。IA32_VMX_TRUE_EXIT/ENTRY_CTLS 的 CET save/load 位 nested 不允许。不要在 host 上 wrmsr CET。exec_async 的 stderr 是 /dev/null,session 日志要写 /dev/kmsg。

Suggested Action

修好用户态 GVA walk(别读到 zeropage),再按真实 ENDBR/NOP 跳过 4 字节。在 CET 漏进 L2 的情况下 Plasma/glibc 起不来。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/vmexit.c, CODE/UTSM/vmm/linux_boot.c, CODE/linux/guest/deshab-kde-session
  • Tags: cet, nested-kvm, guest-fetch, busybox
  • See Also: LRN-20260908-001

[LRN-20260910-002] insight

Logged: 2026-09-10T13:40:00+08:00 Priority: critical Status: pending Area: backend

Summary

Nested KVM 让 L0 CET 作用于 L2 用户态,但 L1/L2 都无法读写 CET MSR。

Details

L1 CR4.CET=0 且 CPUID 无 CET,WRMSR #GP。VMCS CET save/load 位 nested 不允许。VM-entry MSR-load U_CET=0 得到 exit 34。L2 wrmsrl_safe(0x6a0) 返回 -EIO。WSL arch_prctl(ARCH_SHSTK_DISABLE) EINVAL。busybox 在 0x4bede0 的 push r13 写地址 0(SHSTK);glibc 在 …140 #GP(IBT)。盲 skip 4 字节会把 libc RIP 跑飞,不要再用。不要 host 全局 wrmsr IA32_U_CET。

Suggested Action

需要 L0 真正虚拟化 CET(或换一套会给 vCPU 加载 CET=0 的 KVM),否则无法启动 glibc Plasma。不要再盲 skip ENDBR。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/linux_boot.c, CODE/UTSM/vmm/vmexit.c, CODE/linux/patches/utsm_hcall.c, ISO/run_qemu_kvm.sh
  • Tags: cet, nested-kvm, shstk, ibt, busybox
  • See Also: LRN-20260910-001

[LRN-20260910-003] insight

Logged: 2026-09-10T14:40:00+08:00 Priority: high Status: pending Area: backend

Summary

park 之后拦截 #PF 会让 utsm_exec_daemon 在 0x402661 写 0x4a36a0 崩溃;nested 下 #PF 不能当普通异常 reinject。

Details

16 字节对齐盲 skip 同样会弄坏 daemon。CR2 不是 VMCS 字段,resume 前 mov cr2 也不能修好。SHSTK 模拟因此没机会跑。不要在 Linux guest 的 exception bitmap 里开 #PF。

Suggested Action

CET 仍只能靠 L0 虚拟化。保持 #GP/#CP 仅在真实 ENDBR/NOP 字节上 skip。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/linux_resume.c, CODE/UTSM/vmm/vmexit.c
  • Tags: cet, page-fault, nested-kvm, daemon
  • See Also: LRN-20260910-002

[LRN-20260910-004] insight

Logged: 2026-09-10T16:30:00+08:00 Priority: high Status: pending Area: backend

Summary

L1 用 VMCS/tracked CR3 走 libc GVA 会落到 hole 零页;CPU 仍在执行真实 libc。盲 skip 4 会把 RIP 拆到下一条再 #GP。

Details

KVM_GET/SET_MSRS 对 CET 返回 nmsrs=0。arch_prctl EINVAL。不要把 /bin/sh 指到 musl busybox.static。用户态 #GP 的 VMCS_INSTRUCTION_LENGTH 是 2/3,不是 ENDBR 的 4。ept_gpa_to_hpa 对 walk GPA 有 HPA,但内容全 0。CR3 拦截有效,故障时 CR3=0x2fa2000。不要再对 fetch-fail 的 0x7f 16 字节对齐 RIP 盲 skip 4。

Suggested Action

对第一次用户态 #GP 打完整页表 walk(PML4[255] 等)。用能看见真实 libc 字节的翻译再 skip ENDBR。不要 skip ilen(nested 报短了)。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/vmexit.c, CODE/linux/patch_boot_on_img.sh, CODE/linux/qemu_disable_cet.c
  • Tags: cet, page-walk, cr3, endbr, busybox
  • See Also: LRN-20260910-003

[LRN-20260910-005] insight

Logged: 2026-09-10T16:45:00+08:00 Priority: critical Status: pending Area: backend

Summary

Nested KVM 下 EPT leaf 未设 Ignore PAT 时,guest PAT=WC(virtio-gpu shmem)与 EPT WB 组合成保留类型,触发 EPT misconfig;VMM 若因此 resume=0 会直接杀掉 Linux vCPU。

Details

串口:desktop ready 后 EPT misconfig gpa=0x3e20000,随后 sh 在 clear_page_erms 对非规范地址 RDI=0x0005088000005000 #GP。KVM 对 RAM leaf 一律打 VMX_EPT_IPAT_BIT。不要把 2MB PD leaf 当成页表指针去写 4K PTE。不要从 /mnt/d loop-mount 4GiB extra-rootfs。

Suggested Action

EPT leaf(含 2MB)写 WB+Ignore PAT;misconfig 时 repair leaf 再 resume。extra-rootfs 只在 WSL 本机盘上 mkfs/mount。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/ept.c, CODE/UTSM/vmm/vmexit.c, CODE/linux/patch_boot_on_img.sh
  • Tags: ept, nested-kvm, pat, virtio-gpu, extra-rootfs
  • Pattern-Key: harden.input_validation

[LRN-20260910-006] insight

Logged: 2026-09-10T19:45:00+08:00 Priority: critical Status: pending Area: backend

Summary

单 vCPU 上 daemon sched_yield 后立刻 PARK/HLT,会在 virtio 完成中断注入前冻住整机;linux_resume() 必须能在非 HLT 的 preemption timeslice 上回到 DSK。

Details

async 子进程(KDE session)对 persist/ext4 的 [ -x ] 会进入 D-state。PID1 yield 立刻返回,64×1024 次 yield 远短于 10ms 抢占周期,随后 HLT,virtio IRQ 来不及注入。idle=poll 不能救:runnable 的 PID1 不会把时间让给 idle。HLT park 路径上调用 vmexit_before_resume()(virtio poll)会在 host 栈上 #PF(CR2=3)。timeslice 只允许在 linux_resume() 期间 armed,linux_launch() 不可提前归还。

Suggested Action

async 时 daemon 禁止 park;linux_compat 循环 linux_resume 直到 EXEC_EXIT;HLT/timeslice 出口不要跑 guest virtio poll,改在下次 linux_resume 入口 vmx_linux_prepare_entry()。

Metadata

  • Source: error
  • Related Files: CODE/linux/initramfs/bin/utsm_exec_daemon.c, CODE/UTSM/vmm/vmexit.c, CODE/UTSM/vmm/linux_compat.c, CODE/UTSM/vmm/linux_resume.c
  • Tags: hlt, virtio, timeslice, kde, persist
  • Pattern-Key: harden.input_validation
  • See Also: LRN-20260910-007

[LRN-20260910-007] correction

Logged: 2026-09-10T20:15:00+08:00 Priority: critical Status: pending Area: backend

Summary

linux_resume() 从 park 跳回 host 时 CPU 上仍是 guest GPR。用栈上 failed(%rbp 寻址)会在 CR2=3 处 host #PF。必须像 linux_launch 一样写 RIP 相对全局变量。

Details

vmexit_asm 先恢复 guest GPR 再 jmp g_saved_return_rip。vscode test -e 第一次 resume 后 RIP=0xffffffff80006535,RAX=3,Linux 直映寄存器仍在 R9。DSK 从未启动。改成 g_linux_resume_failed(%rip) 并 push/pop rbx/rbp/r12-r15 后:vscode skip、desktop ready、KDE session 打出 checking persist mount。

Suggested Action

所有 vmlaunch/vmresume 着陆垫禁止依赖 guest 破坏后的 rbp 栈槽。


[LRN-20260910-008] correction

Logged: 2026-09-10T20:22:00+08:00 Priority: high Status: pending Area: backend

Summary

KDE 宿主循环里每帧 exec("sleep 0.05") / test -f 会占满唯一 vCPU:daemon waitpid 同步 exec,async session 停在 checking persist mount。应追加 ABI 兼容的 run_slice(只 linux_resume,无 IPC)。

Details

verify: interpreter alive + checking persist mount,从未 persist check done / entering KDE。kde_ok=2(spawned)。guest TSC 不稳时 sleep 可能空转。linux_compat_service.run_slice 放在表尾。

Suggested Action

desktop/DSK KDE 循环用 run_slice;原生切换探测降到每 32 次 slice 一次。不要再 exec sleep。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/include/utsm/linux_compat.h, CODE/desktop/lxc.c, CODE/dsk/main.c, CODE/linux/guest/deshab-kde-session
  • Tags: kde, run_slice, persist, sleep
  • Pattern-Key: harden.input_validation
  • See Also: LRN-20260910-006

[LRN-20260912-001] best_practice

Logged: 2026-09-12T12:45:00+08:00 Priority: critical Status: pending Area: infra

Summary

不要把 linux-extra-rootfs.img 当 Limine boot module。4GiB 打进 RAM 会在 log=21013 把 6G WSL QEMU 掐死。

Details

Windows Terminal 也会在 t=26s 回到提示符,不只是 Cursor 的 45s 管道问题。virtio-blk /dev/vdc 应映射 ESP 上的 FAT32 文件,经 AHCI 读写。

Suggested Action

limine.conf 注释 extra-rootfs module;virtio_extra_rootfs_blk_init 走 ESP 簇映射。

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/virtio_blk.c, SYSTEM/limine/limine.conf
  • Tags: limine, extra-rootfs, wsl, qemu
  • See Also: ERR-20260911-002

Metadata

  • Source: error
  • Related Files: CODE/UTSM/vmm/linux_resume.c, CODE/UTSM/vmm/vmexit_asm.S
  • Tags: linux_resume, gpr, rbp, idt, vscode

[LRN-20260912-002] insight

Logged: 2026-09-12T14:45:00+08:00 Priority: high Status: pending Area: backend

Summary

KDE extra-rootfs glibc 带 XSAVE/YMM/ZMM GNU property;L2 CPUID 隐藏 XSAVE 后 persist bash/Xorg 在 chroot 里立刻 127。不要 objcopy --remove-section=.note.gnu.property。

Details

vdb e2fsck 干净;运行时 checksum 打在 grep/mkdir/mount。静态 utsm_bindmount 已能 bind /dev。persist ld.so 直接跑会 SHSTK 写地址 0;chroot persist bash=127;叠 vdb ld.so+libc=139。

Suggested Action

给 L2 做 XSAVE 保存/恢复并放开 CPUID,或 extra 换无 AVX glibc / Xfbdev。不要再拆 GNU property section。

Metadata

  • Source: conversation
  • Related Files: CODE/linux/guest/deshab-kde-session, CODE/UTSM/vmm/vmexit.c, CODE/linux/initramfs/bin/utsm_bindmount.c
  • Tags: kde, xsave, persist, chroot


[LRN-20260912-003] best_practice

Logged: 2026-09-12T21:55:00+08:00 Priority: high Status: pending Area: tooling / desktop

Summary

mcopy -o 热补 ESP 内已存在的长名文件会删除 LFN 链(只剩 8.3 短名),fat32_io.h 的 LFN 查找随之 -3;热补长名文件必须 mdel + mcopy 重建条目。

Details

M1 zhfont 集成:宿主 zhfont_test 全 PASS 但 QEMU 内 f32_read_path_lfn_to 对 simhei_16.dbf 返回 -3。Python 直读 FONT 目录簇发现 dbf 条目无 0x0F LFN 项(simhei.ttf 的完好)。根因是先前的 mcopy -o 热补剥离了 LFN。修复后 [zhfont] dbf loaded (16px ok)。另:Windows QEMU 验证 desktop 时 q35 内置 AHCI 用 -device ide-hd,bus=ide.0 挂盘会被 ahci.drv 识别为端口 2 ATAPI 签名(identified ports=0),须按 run_qemu_kvm.sh 的 -device ahci,id=ahci0 ... bus=ahci0.0 显式建控制器;2G 内存验证需临时注释 limine.conf 的 4.9GB Linux 模块行(sed 注释 → 验证 → 恢复)。

Suggested Action

热补长名文件:mdel + mcopy,之后 mdir 确认行尾长名仍在。QEMU desktop 冒烟:显式 ahci0 + 2G + lite limine.conf。详细记录见 .learnings/hotpatch-mcopy-lfn-pitfall.md。

Metadata

  • Source: error
  • Related Files: CODE/desktop/zhfont.c, CODE/desktop/f32io.c, ISO/run_qemu_kvm.sh, SYSTEM/limine/limine.conf
  • Tags: mtools, lfn, hotpatch, qemu, ahci, zhfont