Skip to content

调试现场

这一章没有 notes,但中断这块的坑很典型,从机制本身就能预见到几个。

头号坑是"忘了初始化 IDT 就触发异常"。症状是三重故障重启,连 dump 都没有。根因是 IDT 还没 lidt(或根本没建),CPU 查 IDT[3] 查到一个 Present=0 的空项,直接认为"没处理器"→ #GP → 又没 #GP 处理器 → 三重故障。修复就是 gdt_initidt_init 必须在任何异常触发之前。判断:确认串口上有没有 [INIT] IDT loaded 这行,没有就是漏了。

第二个是 ISR stub 压栈顺序写反。症状是 dump 出来的寄存器"错位"(比如 RAX 显示的是 RBX 的值)。根因是 stub 的 push 顺序和 InterruptFrame 字段顺序对不上。修复:严格按"rax 先压、r15 最后压"配 InterruptFrame 从 r15 起的字段定义,且压入和弹出顺序严格相反。

第三个是门类型选错。#PF 误用陷阱门,处理期间 IF 没清,如果之后接了 PIC,一个嵌套中断进来可能把栈搞乱。这种 bug 现阶段不爆(还没 sti),但埋着。对照"故障用中断门、陷阱用陷阱门"的原则核一遍。

第四个是 #PF 错误码读反。frame->error_code 各位含义记反(比如把 bit1 的读写弄反),dump 出来的"读/写"就是反的,误导排查。对着 Intel SDM 的 #PF 错误码位定义核。

035_multi_terminal-45-gf25de18 · f25de18 · 2026-08-04