正常
调试现场
这一章没有 notes,但中断这块的坑很典型,从机制本身就能预见到几个。
头号坑是"忘了初始化 IDT 就触发异常"。症状是三重故障重启,连 dump 都没有。根因是 IDT 还没 lidt(或根本没建),CPU 查 IDT[3] 查到一个 Present=0 的空项,直接认为"没处理器"→ #GP → 又没 #GP 处理器 → 三重故障。修复就是 gdt_init → idt_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 错误码位定义核。