2.1 KiB
2.1 KiB
02 CPU、异常与中断
目标
建立 x86_64 CPU 基础设施,让 kernel 能捕获异常并接入后续硬件中断。
前置条件
- early log 可在 firmware 退出后稳定输出。
- panic 路径可用。
建议边界
arch/x86/:GDT、TSS、IDT、异常入口、IRQ 入口。kernel/:通用 trap 分发、panic 策略、调试输出。include/tianole/:必要的通用 trap 数据结构。
实现内容
- 建立 x86_64 GDT。
- 建立最小 TSS。
- 建立 IDT。
- 增加异常入口汇编。
- 保存寄存器到统一 trap frame。
- C 层分发 exception。
- 之后再接 PIC/APIC 和 IRQ。
- 异常路径输出异常栈、寄存器现场和符号化所需信息。
非玩具化约束
- 汇编入口只保存现场和跳转,不写策略。
- C handler 接收统一 trap frame。
- exception 和 IRQ 的入口可共享框架,但语义要区分。
- 不把中断处理写进
kernel/main.c。 - oops/panic 策略要和 trap 分发分离。
验收方式
- 主动触发 invalid opcode 或 divide error。
- 日志输出 vector、rip、rsp、error code。
- 未处理异常进入 panic。
当前状态
基础完成:
- x86_64 GDT 已加载。
- 最小 TSS 已建立并通过
ltr加载。 - IDT 已建立,当前覆盖 CPU exception vector 0-31。
- 异常入口汇编已统一保存通用寄存器现场。
- C 层 trap dispatch 已接收统一
trap_frame。 - 未处理异常进入
panic("unhandled CPU exception")。 KERNEL_TEST_TRAP=1会通过ud2主动触发 invalid opcode。scripts/check.sh已自动验证 invalid opcode 日志和 panic 路径。
后续扩展:
- PIC/APIC 初始化。
- 外部 IRQ 分发。
- timer interrupt。
- page fault 的专门处理策略。
- double fault 独立 IST 栈。
- 用户态异常返回。
- 可恢复异常处理。
- oops 格式和符号化输出。
验收依据:
- 正常启动日志包含
traps initialized。 - invalid opcode 测试能输出 vector、error code、rip、rsp、rflags。
- 未处理异常能进入
panic("unhandled CPU exception")。
下一阶段:
03-memory.md,先建立物理页、页表和内核堆。