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

76 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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