EDS与PUS实践(六):用puslib交叉验证服务类型17的TC与TM
- 如果 TC 和 TM 都由同一份 XML、同一套 EdsLib 代码生成和解析,测试有可能只是“自己同意自己”。引入不读取 EDS XML 的 puslib,才算多了一条相对独立的检查路径。
最后一章不再增加新的架构功能,而是把整条系统路径重新走一遍,并建立一套可复用的验证与排错方法。目标是让“能够运行”变成一组可以复查的证据:ELF 段与符号正确,启动输出按阶段出现,任务切换有双向进展,Timer IRQ 能重复触发,设备清源与 EOI 都发生,MMU/Cache 状态可读,CPU1 能完成 SGI 往返。
前十章已经依次建立处理器状态、ABI、启动、协同上下文、异常现场、GIC/Timer、抢占、MMU、Cache 和双核底座。系统越完整,故障越不适合靠“多加几行打印”猜测,因为串口本身可能不可重入,读取 IAR 还有副作用,Cache 又可能让共享状态的观察滞后。
本章按照静态检查、分层断点、寄存器观察、串口证据和已知 Bug 五条线组织。文章末尾给出能力边界,避免把教学闭环夸大成完整产品操作系统。
这一章把单核可运行系统扩展为 Cortex-A9 双核启动底座。重点是共享状态和每核状态的边界:BSS、页表和 Distributor 只能由主核负责共享初始化;模式栈、GICC、PPI、CP15、TLB 和 L1 Cache 则必须由每个 CPU 分别建立。
单核路径已经能够启动 MMU、Cache、GIC 和任务调度,但直接让 CPU1 执行同一入口会引入竞争:两个核可能同时清 BSS、重复初始化全局对象,或者共用一份 SVC/IRQ 栈。为此启动入口先读取 MPIDR 分流,CPU1 在 release flag 上等待,CPU0 完成发布后再用 cache clean、屏障和事件唤醒次核。
本章给出启动时序、SGI 往返验证和次核初始化代码,同时明确“第二个核在线”不等于“已经完成 SMP 调度器”。