71 Commits
Author SHA1 Message Date
TermiNexus 3995cb9545 debug(timer): 门32读回+软int0x20+PIC ISR,一次性区分中断分发路径
LAPIC 配置已确认正常(base/ver/svr/lint0 全部读回正确)但硬件中断仍不达。
新增三段诊断:1) 读回 IDT 门 32 的 base/sel/type;2) 软件 int 0x20 验证
分发路径(门有效→H+返回,门无效→[GP] err=0x20);3) 读 PIC1 ISR 确认
PIT IRQ0 是否真正到达 PIC 并被响应。
2026-08-26 18:42:58 +08:00
TermiNexus ee329c313f fix(apic): early_init 改用 IA32_APIC_BASE EN 位判断,避免 cpuid 误判跳过 init
lint0 读回 0x0(QEMU 复位默认 0x10000)说明此前读的是 RAM,_lapic_base 为 0,
init() 很可能未执行。msr_read 已在前置流程验证可用,改按 MSR bit11 判断更可靠。
main.vp 增补综合诊断:打印 base/version/svr/lint0 重写读回/特性位,一次性区分
init 未执行、MMIO 映射失效、写不粘三种假设。
2026-08-26 18:39:07 +08:00
TermiNexus 9ff53aa1fa debug(apic): 读回 LINT0 与 APIC BASE MSR,验证 EXTINT 配置是否生效
PIT 正常(cnt=1109)但中断不送达。读回验证:
- lint0=0x700 → EXTINT 未屏蔽(正确);0x10700 → 被屏蔽;其它 → 写入失败
- apic_base_msr bit11 → APIC 使能状态
用后移除。
2026-08-26 18:32:21 +08:00
TermiNexus 471cfa16bf debug(timer): timer_init 读 PIT 计数器,验证 PIT 是否在走
中断仍不送达 timer_handler(无 H)。读 PIT 计数器(latch+读 0x40)打印:
- 计数在 1~1193 之间变化 → PIT 正常,问题在中断送达(PIC/APIC/IDT)
- 计数为 0/不变 → PIT 本身没跑(outb 未生效/环境问题)
用后移除。
2026-08-26 18:29:20 +08:00
TermiNexus 57c4092d19 debug(timer): timer_handler 一次性 H + msleep 自旋 s,判定 ISR 是否被调用
apic.eoi 修复后仍挂在 sti done(无 msleep done)。加两处确定性诊断:
- timer_handler 首次进入打印 'H':ISR 被调用则出现
- msleep 每 1M 次迭代打印 's':hlt 唤醒(中断触发)但 ticks 不推进则出现
判定:
- 无 H → 定时中断未到达 timer_handler(IDT/PIC/APIC 路由)
- 有 H → ISR 已调用,问题在 handler/ticks 推进
用后移除。
2026-08-26 18:26:34 +08:00
TermiNexus 9082056fe0 fix(timer): timer_handler 补 LAPIC EOI,修复 APIC 启用后定时中断被屏蔽
APIC 启用后(LINT0=EXTINT 送达),每次中断会置 LAPIC ISR,必须写
LAPIC_EOI(0x0B0) 清除。此前只发 PIC EOI(0x20/0xA0),LAPIC ISR 卡住 →
首个定时中断后后续中断全被屏蔽 → ticks 不推进 → timer_msleep 永久挂起
(清理诊断后稳定复现,serial.log 停在 "sti done" 无 "msleep done")。
两个分支(timer_running 早退 + 正常路径)都补 apic.eoi()。
2026-08-26 18:23:16 +08:00
TermiNexus f675540c64 chore(boot): 移除全部中断排查诊断(int20 测试 + T/[T]/D 打印)
定时中断已确认恢复(APIC LINT0=EXTINT)。移除 int 0x20 软件触发测试与
isr32_handler 'T'、timer_handler '[T]'、isr_default 'D' 打印,回归干净
内核,定位 sti 后新出现的 #GP(疑似 int 0x20 测试触发)。
2026-08-26 18:19:41 +08:00
TermiNexus 3c163a5936 debug(boot): sti 后软件触发 int 0x20,二分定位中断不送达
APIC LINT0=EXTINT 已配置但仍无定时中断。加 int 0x20(向量 32)软件触发:
- 有 T → IDT gate 32 正常,问题在 PIT/PIC 硬件送达
- 无 T → IDT/lidt 问题
用后移除。
2026-08-26 18:16:09 +08:00
TermiNexus 9ec3627a5a fix(boot): 启用 apic.early_init,配置 LINT0=EXTINT 恢复 PIC 定时中断
QEMU/OVMF(UEFI)下本地 APIC 已启用,PIC 外部中断须经 LAPIC LINT0 送达
CPU。apic.init() 将 LINT0 配为 EXTINT(取消屏蔽);此前 early_init 被注释,
LINT0 保持未配置/屏蔽 → 定时器中断被 APIC 吞掉 → sti 后 timer_msleep 等
不到 ticks 永远挂死(serial.log 停在 "sti done",T/D 诊断均无输出)。
2026-08-26 18:14:29 +08:00
TermiNexus 10857e58ed debug(intr): isr32_handler 入口打印 T + isr_default 打印 D,定位定时中断丢失
前一轮 timer_handler [T] 未打印 → timer_handler 未被调用。本轮加两处
确定性诊断:isr32_handler 入口 'T'(IRQ0 是否到达 isr32)、isr_default
'D'(是否有中断向量到默认处理)。三种结果:
- 无输出 → 定时中断根本没触发(PIC/PIT/APIC 路由问题)
- D 输出 → 中断触发但向量到默认处理(IDT gate 未设置)
- T 输出 → IRQ0 到达 isr32(问题在 handler 内)
用后移除。
2026-08-26 18:11:47 +08:00
TermiNexus 7336ddff48 debug(timer): timer_handler 每 250 拍打印 [T],验证定时器中断触发
sti 后卡死在 timer_msleep,静态分析 PIT/PIC/IDT/ISR/timer_handler/
msleep/sched_tick 的 IR 全部正确。加串口诊断确认 ISR 是否触发:
若串口无 [T] → 中断未触发(PIC/PIT/IDT 运行期问题);有 [T] 仍挂 →
ticks 未推进/ISR 未返回。用后移除。
2026-08-26 18:07:47 +08:00
TermiNexus 8b40203b63 提交新的建议忽略 2026-08-06 18:08:50 +08:00
TermiNexus be92f671d0 根据静态注解修正了部分的 global 修正(遍历截止fat32 fileio.vp) 2026-07-31 13:36:26 +08:00
TermiNexus 9d786dd5b1 self 传参的相关修复 2026-07-30 17:30:47 +08:00
TermiNexus 49d074e487 通过插件的静态推导修复了一些错误 2026-07-30 17:28:27 +08:00
TermiNexus 065fcbdf43 调整了 VKernel 的版本 2026-07-30 17:26:17 +08:00
TermiNexus 56d127cb88 将 project.json 改为了 project.vpj,初步尝试了使用 Viper 插件高亮 2026-07-30 17:24:35 +08:00
TermiNexus 20e7289c61 将 .py 和 .pyi 后缀名改为了 .vp 和 .vpi 后缀名 2026-07-30 16:34:26 +08:00
Viper 10cefa51ad Add MIT LICENSE 2026-07-19 14:39:40 +08:00
Viper a1234d5382 Add bilingual README 2026-07-19 12:42:11 +08:00
Viper 6813947181 Initial import of ViperOS 2026-07-19 12:38:20 +08:00