孙浩宇 closed issue #4: 子 issue #4：Trap/中断/异常处理 at NameNotFound / OSKernel2026-N...

孙浩宇
2026-04-05T14:25:44Z

子 issue #4：Trap/中断/异常处理

描述

实现 LoongArch64 的异常入口、中断分发和 syscall 入口。

依赖

#3（Boot 启动完成，能进入 rust_main）

与 #6 类型设计强耦合：trap entry 必须知道 TrapFrame 布局才能保存/恢复寄存器。建议 #4 和 #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 的 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）

参数：a0a6 (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