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

XFESystem

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

公开
关注 0 Fork 0 Star 0
README.md

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

本工具仅改写 Source/XFESystem.Kernel/obj/.../cosmos/ref 下的四份私有引用:Core.X64、HAL.X64、Drivers 和由 Cosmos 生成的 System.Private.CoreLib。不修改 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,带依赖锁。只接受固定程序集身份、整个官方原始文件 SHA256 与目标方法完整 IL 指纹;CoreLib 10.0.0.0 是下文说明的 plugs 生成物。所有未知形态、版本变化、损坏 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(包括重新应用官方 plugs 的生成 CoreLib),核对固定原包哈希和方法形态后再移除 pending marker,并重新运行。工具不提供跳过 guard 的强制选项。

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

低延迟策略

保持上述单 BSP、逻辑 CPU 0、原 EOI 和中断调度契约,并增加三个精确 IL 修补:

  • X64PlatformInitializer.StartSchedulerTimer 仅将传给 LocalApic.StartPeriodicTimer 的参数改为 1 ms。TimerManager/PIT、LAPIC 校准和 IRQ handler 均不改;Stride 的 10 ms 记账分母仍保留,不将 1 ms IRQ 周期冒充显示刷新率。
  • 对应的 GcRuntimePatch 在其已独占的 Core.dll 内将 Stride OnTick 最后一处强制轮转比较设为 elapsedNs >= 1_000_000;只改终端阈值,前面的 10 ms 权重分母、真实 elapsed 计账、run queue 和时钟不变。原回调逐次比较 1 ms 与 10 ms,未累计时间片,因而会失去强制轮转;新策略明确选择 1 ms 低延迟时间片。实际 Core.dll 哈希和此策略归属 GC receipt,平台工具不对相同文件进行第二次写入。
  • XhciState.HotPlugMain 仅把无 MSI 路径的 DeviceBinding.Sleep(20) 改为 1 ms。MSI 路径的事件等待、设备锁、DrainEvents、finally 和退出检查均保留。不改 USB endpoint bInterval,因此不声称改变鼠标硬件报告率。
  • Cosmos 插入 CoreLib 的 Interop/Sys 五个 LowLevelMonitor_* 方法只将日志参数构建和输出共 42 条 IL 置为 NOP,去掉 8 次 Log.Write 和 1 次 WriteNumber。GCHandle 解析、Acquire/Release/Wait/TimedWait/Signal、超时分支、原返回值全部保留。等待语义通过实际原始/修补 IL 在宿主 doubles 上执行对照,包含负超时、0、7 和 1000 ms。

Drivers 官方原包 SHA256 为 c65e80e18b9d63a35c2f77384d104624ed9aa69a26db024514847e2997ed32bc。CoreLib 不是原包的直接拷贝,而是 Cosmos RunPatcher 应用 plugs 后的生成物;对其五个完整目标方法固定原始/结果 IL 指纹,并独立核对两个来源原包:Cosmos.Plugs 3.0.94 0118211a282ab2255ab46526cef0d3d0e78311db5804118e39ab42c9d203a2ba、NativeAOT CoreLib 10.0.12 64db826d55e769d4d3d639425e0e9f02b847e5ed1be13e4ab0619b2a7eefbec5。生成输入和整个结果各自记录 SHA256;不能把生成物哈希称为官方原包哈希。

receipt 保留原 Kind、CPU 和 Core/HAL 字段,新增 SchedulerTimerIntervalMs、XhciPolledDrainIntervalMs、SuppressedMonitorLogCalls、Drivers/CoreLib 全文结果哈希和来源哈希。重复调用必须同时核对四份结果和工具哈希;部分恢复、半写 marker、目标 IL 或 timeout/IRQ/锁语义改变均拒绝。Core.dll 的 GC/EH 修补仍由独立工具负责,没有重写相同程序集。

以上是调度与输入延迟策略,既不设置显示器模式,也不提供 GPU/CUDA、硬件光标或 VBlank;240 Hz 光标提交与实体 scanout 必须另行实测。