子 issue #4:Trap/中断/异常处理
子 issue #4 (closed):Trap/中断/异常处理
描述
实现 LoongArch64 的异常入口、中断分发和 syscall 入口。
依赖
-
#3 (closed)(Boot 启动完成,能进入
rust_main) - 与 #6 类型设计强耦合:trap entry 必须知道 TrapFrame 布局才能保存/恢复寄存器。建议 #4 (closed) 和 #6 共同设计 TrapFrame 结构体,然后分头实现。
需要实现的文件
| 文件 | 说明 |
|---|---|
kernel/src/arch/loongarch64/interrupt/mod.rs |
完整实现:中断开关(enable/disable_and_store/restore)、trap_handler 分发逻辑、ack、enable_irq、get_trap_num、 handle_user_page_fault_ext、handle_reserved_inst
|
kernel/src/arch/loongarch64/interrupt/trap.S |
trap entry/exit 汇编:保存全部通用寄存器到 TrapFrame、恢复、ERTN 返回 |
kernel/src/arch/loongarch64/interrupt/consts.rs |
LoongArch 异常码定义(替换 #2 (closed) 的 stub) |
kernel/src/arch/loongarch64/timer.rs |
时钟中断实现:CSR.TCFG 配置、CSR.TICLR 清除 |
关键技术点
异常入口配置
-
CSR.EENTRY:异常入口基地址 -
CSR.ECFG.VS:中断间距(0 表示所有中断共享入口,非 0 则按中断号偏移) - 建议初期使用共享入口(VS=0),在
trap_handler中通过CSR.ESTAT.Ecode分发
LoongArch 异常码
| Ecode | 名称 | 说明 |
|---|---|---|
| 0x0 | INT | 中断 |
| 0x1 | PIL | Load 页无效异常 |
| 0x2 | PIS | Store 页无效异常 |
| 0x3 | PIF | 取指页无效异常 |
| 0x4 | PME | 页修改异常 |
| 0x7 | PPI | 页特权等级不合规异常 |
| 0x8 | ADEF | 取指地址错误 |
| 0x9 | ADEM | 访存地址错误 |
| 0xB | SYS | 系统调用 |
| 0xC | BRK | 断点 |
| 0xD | INE | 指令不存在 |
| 0xE | IPE | 指令特权等级错误 |
| 0x3F | TLBR | TLB 重填异常 |
中断控制
-
全局中断开关:
CSR.CRMD.IE位 -
局部中断使能:
CSR.ECFG.LIE[12:0]— 13 个中断源- LIE[0:1]:软中断 SWI0/SWI1
- LIE[2:10]:硬中断 HWI0~HWI7 + PMI
- LIE[11]:定时器中断 TI
- LIE[12]:IPI
-
中断状态读取:
CSR.ESTAT.IS[12:0]
Syscall 约定
- 异常码
0xB(SYS) -
CSR.ERA:syscall 指令地址(返回时需 +4) - 参数:a0
a6 (r4r10),调用号:a7 (r11) - 返回值:a0 (r4)
时钟中断
-
CSR.TCFG:定时器配置(En使能位 +Periodic周期位 +InitVal初始值) -
CSR.TVAL:定时器当前倒计时值 -
CSR.TICLR:写 1 清除定时器中断(CSR.TICLR.TI位) - 时钟频率可通过
CSR.CPUCFG或固件传递获取
完成标准
- 时钟中断正常触发和处理(能看到 tick 计数增长)
- 手动触发
syscall指令不 panic,能正确分发 - 非法指令异常能被捕获并处理
-
interrupt::enable()/disable_and_store()/restore()正确控制中断
父任务:#1