tianole/docs/agents/tasks/02-cpu-interrupts.md

2.1 KiB
Raw Blame History

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,先建立物理页、页表和内核堆。