XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8

x64 启动处理器与时钟中断修补

本工具仅改写 Source/XFESystem.Kernel/obj/.../cosmos/ref 下的两份私有引用,不修改 NuGet 包、ACPI 物理 CPU 枚举、硬件 APIC 路由、其他设备的中断或 EFI。

固定 Cosmos 3.0.94 只运行 BSP,尚未启动 AP。HAL 原先向调度器报告 ACPI 中所有 CPU,调度器却固定采用逻辑 CPU 0;项目的线程 EH 合约又仅支持一个实际运行的 CPU。本工具将 X64PlatformInitializer.GetCpuCount() 改为返回 1,并将 LAPIC timer ISR 和设备 IRQ 尾部 X64InterruptController.Dispatch 传给调度器的两个索引统一改为逻辑 0。后者仅替换 ReschedulePendingFromIrq 的 CPU 参数,其正常/未处理 IRQ 的两处 EOI、spurious vector 保护及异常分支均完整保留,由整个 Dispatch 方法的原始/结果 IL 指纹约束。原 LocalApic.GetId() 方法保持字节码不变,其他路由调用仍取得真实硬件 APIC ID。

ISR 原先 first-five/every-100-ticks 正常日志块会在关闭中断时装箱对象、轮询串口并写固件 framebuffer。本工具物理移除该完整正常日志块,保留 tick 递增、保存的上下文地址计算、invalid RSP 检查和错误日志,以及恰好一次原 SchedulerManager.OnTimerInterrupt 调用。ISR 原先不负责 EOI,修补后仍由原 InterruptManager.Dispatch 负责,不新增或吞掉 EOI。错误分支保留原诊断及其装箱行为;本补丁不声称所有 ISR 均无分配。

新增两个无参数、只读叶导出,返回类型都是 uint32:

  • XfeRuntimePhysicalCpuCount:读取未改动的 AcpiMadt.CpuCount,表示固件描述的物理执行单元数。
  • XfeRuntimeSchedulerCpuCount:返回 1,表示本版本实际建立的 BSP 调度模型。

运行

在 Cosmos RunPatcher 完成后、NativeAOT WriteIlcRsp 之前调用;与现有 Core.dll GC/EH 补丁互不改写同一文件。

内核项目还必须包含 <UnmanagedEntryPointsAssembly Include="Cosmos.Kernel.HAL.X64" />。固定 SDK 原先仅为 Core 生成 unmanaged entry points;HAL 的 --root 只保留其初始化,不能代替这一项。遗漏时两个只读诊断导出会在原生链接阶段报 undefined symbol,不能当成验收通过。

dotnet run --project Tools/BootPlatformPatch/BootPlatformPatch.csproj -c Release -- C:/Absolute/Kernel/obj/Release/net10.0/linux-x64/cosmos/ref
dotnet run --project Tools/BootPlatformPatch/Tests/BootPlatformPatch.Check.csproj -c Release -- C:/Absolute/XFESystem

Mono.Cecil 固定为 0.11.6,带依赖锁。只接受程序集身份 3.0.94.0、整个官方原始文件 SHA256 与目标方法完整 IL 指纹;所有未知形态、版本变化、损坏 receipt 或一半原始一半已修补的文件对均拒绝。完整祖先路径及输入、receipt、锁文件拒绝 symbolic link/junction,包括 dangling link。先完整验证并在内存生成、重新读回 Cecil 验证后才写入。

官方原始 SHA256:

  • Core.X64:95359dc648a01a2e31ae5fbb513efa3fd796acebd55b69c244c9d4ab988578c0
  • HAL.X64:6267612213cbf40a3b20bf56a763652f9075363fb2561d71036d4fe23b164efd

旁侧 XfeBootPlatformV1.json receipt 记录原始/结果 SHA256、工具 DLL SHA256、包版本、逻辑 CPU 数及修补范围;SchedulerCpuIndex=0、SchedulerCpuIndexSitesPatched=2、DeviceIrqSchedulerUsesLogicalCpuZero=true 绑定两个调度入口的相同契约。重复调用同时核对 receipt 与两份实际 DLL,不重新写文件或改变 receipt。Cosmos 重新复制两份精确官方 DLL 后可重新生成补丁;只恢复其中一份会拒绝。

两个文件重命名不是一个完整文件系统事务。工具先持久化 XfeBootPlatformV1.Pending.json,全部实际文件读回、receipt 原子替换成功后才移除该 marker。任何 I/O 异常会留下 marker,后续构建拒绝消费这一对文件;不能将部分写入当成成功。恢复时应先检查 marker/receipt,再由原 Cosmos RunPatcher 恢复两份官方私有 DLL;确认两份 SHA256 匹配上述原始值后再移除 pending marker,并重新运行。工具不提供跳过 guard 的强制选项。

宿主 fixture 检查真实官方程序集、Cecil 写出/重读、其他方法不变、正常/错误分支、CPU 索引、错误版本/变异 IL、实际文件 receipt、重复执行字节幂等及半提交拒绝。它不代替原生多核 ACPI 环境或实体机验收;没有创建测试镜像。