Sspeak-agentopenarch 0.1.0 —— A0 探针:riscv64 上下文切换
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
openarch 0.1.0 —— A0 探针:riscv64 上下文切换 ⚠️ **0.1.0 是一个探针,不是一层。** 实现了一个 arch,以及决定这一层能否成立的两个 原语中的一个。 ## 为什么先做最硬的 这一层的门不是「能不能在第二个架构上编过」,而是「抽象在第二个架构上碎不碎」。 上下文切换与页表项是决定处,其余(per-CPU 基址、屏障、时钟中断)在架构之间差异 小得多,做完它们也不能说明这一层成立。 ## 零成本的论证与通常那条不同 方案里这一层的通则是「显式 inline 优先,LTO 兜底」。**这条在这里不适用,照搬会得到 一个会崩的设计**:编译器生成的 prologue 相对当前栈保存寄存器,而 epilogue 会在栈指针 被替换之后恢复它们,读的是另一个上下文的帧。 因此切换是裸汇编符号,代价是一次 call。这不是妥协 —— **切换本来就是一次调用**, 所以判据是「发出的指令序列与手写调用相同」,而不是「调用消失」。 实测反汇编:调用点是参数装载 + 一条 jal,无任何归属于接口的额外指令。 ## 实测 探针在 qemu 中跑通:main → task(arg=42)→ 切回 main,且 callee-saved 寄存器 穿过切换后完好()。后者是「能跑」测不到的那一半契约。 ## ⚠️ 未被证明的 **门没有通过,而且一个 arch 通不过它。** aarch64 缺 mcpp 目标表行与模拟器。 地址空间未开始 —— 内存属性是预期的碎裂点(x86 走 PAT 索引、aarch64 走 MAIR 索引、 riscv 直接写进表项)。 发布一个「七个接口 × 三个架构」的版本会产出大量没有测试能跑的代码,而那正是本项目 设计记录最直接警告的失败模式。 | 1 个月前 | |
openarch 0.1.0 —— A0 探针:riscv64 上下文切换 ⚠️ **0.1.0 是一个探针,不是一层。** 实现了一个 arch,以及决定这一层能否成立的两个 原语中的一个。 ## 为什么先做最硬的 这一层的门不是「能不能在第二个架构上编过」,而是「抽象在第二个架构上碎不碎」。 上下文切换与页表项是决定处,其余(per-CPU 基址、屏障、时钟中断)在架构之间差异 小得多,做完它们也不能说明这一层成立。 ## 零成本的论证与通常那条不同 方案里这一层的通则是「显式 inline 优先,LTO 兜底」。**这条在这里不适用,照搬会得到 一个会崩的设计**:编译器生成的 prologue 相对当前栈保存寄存器,而 epilogue 会在栈指针 被替换之后恢复它们,读的是另一个上下文的帧。 因此切换是裸汇编符号,代价是一次 call。这不是妥协 —— **切换本来就是一次调用**, 所以判据是「发出的指令序列与手写调用相同」,而不是「调用消失」。 实测反汇编:调用点是参数装载 + 一条 jal,无任何归属于接口的额外指令。 ## 实测 探针在 qemu 中跑通:main → task(arg=42)→ 切回 main,且 callee-saved 寄存器 穿过切换后完好()。后者是「能跑」测不到的那一半契约。 ## ⚠️ 未被证明的 **门没有通过,而且一个 arch 通不过它。** aarch64 缺 mcpp 目标表行与模拟器。 地址空间未开始 —— 内存属性是预期的碎裂点(x86 走 PAT 索引、aarch64 走 MAIR 索引、 riscv 直接写进表项)。 发布一个「七个接口 × 三个架构」的版本会产出大量没有测试能跑的代码,而那正是本项目 设计记录最直接警告的失败模式。 | 1 个月前 |