From 3995cb9545d30f83ac7062d4f4c66f8487617cc4 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 26 Aug 2026 18:42:58 +0800 Subject: [PATCH] =?UTF-8?q?debug(timer):=20=E9=97=A832=E8=AF=BB=E5=9B=9E+?= =?UTF-8?q?=E8=BD=AFint0x20+PIC=20ISR=EF=BC=8C=E4=B8=80=E6=AC=A1=E6=80=A7?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E4=B8=AD=E6=96=AD=E5=88=86=E5=8F=91=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LAPIC 配置已确认正常(base/ver/svr/lint0 全部读回正确)但硬件中断仍不达。 新增三段诊断:1) 读回 IDT 门 32 的 base/sel/type;2) 软件 int 0x20 验证 分发路径(门有效→H+返回,门无效→[GP] err=0x20);3) 读 PIC1 ISR 确认 PIT IRQ0 是否真正到达 PIC 并被响应。 --- VKernel/Kernel/main.vp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/VKernel/Kernel/main.vp b/VKernel/Kernel/main.vp index 55da781..10971e7 100644 --- a/VKernel/Kernel/main.vp +++ b/VKernel/Kernel/main.vp @@ -92,9 +92,32 @@ class ViperKernel: 1 if (_dbg_feat & cpu.CPU_FEATURE_APIC) else 0) serial.puts(c.Addr(_dbg_buf)) + # [DBG] 读回 IDT 门 32,验证 isr32 分发地址是否正确安装(用后移除) + _g32: t.CUInt64T = (t.CUInt64T(intr.idt.idt[32].base_low) | + (t.CUInt64T(intr.idt.idt[32].base_middle) << 16) | + (t.CUInt64T(intr.idt.idt[32].base_high) << 32)) + _g32buf: t.CArray[t.CChar, 96] + viperlib.snprintf(c.Addr(_g32buf), 96, "[DBG] idt32 base=0x%lx sel=0x%x type=0x%x\n", + _g32, intr.idt.idt[32].selector, intr.idt.idt[32].type_attr) + serial.puts(c.Addr(_g32buf)) + asm.sti() serial.puts("[main] sti done\n") + # [DBG] 软件触发 int 0x20:门 32 有效则分发到 isr32→timer_handler 打印 H 并返回; + # 门无效则 #GP(isrCommonhandler 打印 [GP] err=0x20),一次性区分分发路径(用后移除) + serial.puts("[DBG] before swint\n") + c.Asm("int 0x20", op=[t.ASM_DESCR.CLOBBER_MEMORY]) + serial.puts("[DBG] after swint\n") + + # [DBG] 读 PIC1 ISR:bit0 置位说明 PIT IRQ0 已到达 PIC 并被响应(用后移除) + asm.outb(0x20, 0x0B) # OCW3 读 ISR + asm.io_wait() + _pic_isr: t.CUInt8T = asm.inb(0x20) + _isrbuf: t.CArray[t.CChar, 48] + viperlib.snprintf(c.Addr(_isrbuf), 48, "[DBG] pic_isr=0x%x\n", _pic_isr) + serial.puts(c.Addr(_isrbuf)) + timer.timer_msleep(100) serial.puts("[main] msleep done\n") rtc.rtc_init()