C# 实体启动诊断
实体机若停在 [Kernel] KernelConsole initialized: … chars,这句话本身不是错误信息。固定运行时在这之后关闭早期画面输出,然后调用 XFESystem 的 BeforeRun。旧镜像随后发生的自检失败只能从串口观察,不能用这一行断定具体根因。
诊断版从 Start 入口开始使用已有 framebuffer 显示下列阶段,覆盖驱动初始化和基础控制台阶段;进入 BeforeRun 时重新启用被基础生命周期关闭的文字通路。普通启动异常和自检失败会显示最近阶段和原因。首个桌面画面呈现前关闭早期文字通路,避免后续日志覆盖桌面。该通路不调用已经退出的 UEFI 服务,也不写入磁盘。
| 阶段 | 操作 |
|---|---|
| A00 | 已进入内核生命周期 |
| A10 | 初始化设备和驱动;返回后才进入 A20 |
| A20 | 驱动阶段结束,开始初始化控制台 |
| A21 | 基础控制台就绪 |
| B00 | 已进入 XFESystem 托管内核 |
| B10 | 输入与内置资源 |
| B20 | 托管泛型运行时 |
| B21 | 垃圾回收与深层栈根 |
| B22 | 异常处理 |
| B30 | 定时器、调度与线程 |
| B40 | 弱引用与冻结内存 |
| B50 | JavaScript 引擎生命周期 |
| B60 | 内存文件与控制台程序 |
| B70 | 登记桌面显示后执行的后台网络初始化 |
| B80 | 浏览器与文档渲染 |
| B90 | 桌面显示表面 |
| B99 | 即将呈现桌面 |
如果仍无法启动,记录最后一个阶段码及 XFE BOOT FAILED 后的文字。完全没有 A00 时,问题发生在生命周期入口之前,或写入的不是这份诊断镜像。硬件异常、失效的中断和运行时 failfast 可能只能留下阶段码;诊断提示不是崩溃恢复机制。
串口补丁修复固定 x64 Serial.ComWrite 的无限轮询:单字节最多检查 4096 次发送状态;全 1 状态或超限后禁用本次启动的串口发送。原有串口初始化和就绪时的端口写入保留,不新增硬件复位或端口探测。丢弃串口日志不应阻止启动,屏幕诊断走独立通路。这是已确认的代码缺陷修复,尚不能据此声称已定位本次实体启动失败。
验证分别覆盖补丁的实际生成 IL、正常串口 QEMU 启动,以及 QEMU 不创建 UART 设备时的桌面画面。QEMU 通过不等于该华硕实体机、USB 输入或 RTX 显示驱动已验收。
多核硬件上的单核执行模型
当前内核只启动 BSP,没有启动其他 AP。固定依赖却曾把 ACPI 中发现的全部处理器数量用于调度器初始化,与原生线程/EH/GC 的单核契约冲突。启动平台补丁将调度器数量设为实际启动的一个,LAPIC 中断向调度器传逻辑 CPU 0。ACPI 枚举结果和硬件 APIC 路由标识保持原样,日志分别报告发现的物理 CPU 数与调度 CPU 数;这项修复不代表已支持多核并行。
周期性的 [LAPIC] Timer tick、[STRIDE] OnTick 是调试打印,不是重启。补丁仅跳过两处正常周期打印,保留定时器计数、调度、错误 RSP 提示和原有中断应答。避免在中断中装箱、逐字符写屏幕和覆盖启动阶段,不能仅靠不再刷屏判定启动成功。
网卡就绪检测以 Stopwatch 时间戳限制总等待五秒,等待已有 LAPIC 中断,不再依赖可能缺失的 PIT IRQ0 软件定时器。该预算仍要求 LAPIC 中断可返回,且不承诺损坏的硬件中断或后续 DHCP 内部等待也受同一预算保护。
适配器检测和 DHCP 整体在首帧之后的独立线程执行,均不占用桌面启动或 UI 线程。因此内部 DHCP 等待失效也不会直接阻塞桌面显示;这不代表 DHCP 超时和网络线程自身已得到完整恢复。Physical 拓扑字段表示 ACPI 发现的逻辑处理器条目数,不等同物理插槽或物理核心数量。