我的两个 Cortex-A9 核心为何无法缓存一致:一段裸机 Rust 排障
来源: thejpster.org.uk — 2026-08-22
概述
作者在 Terasic DE0-Nano-SOC 开发板上用纯 Rust 写裸机程序,成功让 MMU 与两级缓存跑起来,并尝试通过 SCU(Snoop Control Unit)与中断把第二个 Cortex-A9 核心拉进 SMP。一切都很顺利,直到核心 1 设置了共享原子标志后核心 0 却始终观察不到——两个核心对同一内存地址看到完全不同的值。他贴出代码,邀请读者帮忙定位自己配置 SCU 时做错的地方。
核心要点
- 用 Rust 写 AArch32 裸机代码,在 DE0-Nano-SOC 上让两个 Cortex-A9 核心进入 SMP 模式。
- 核心 1 已把全局 AtomicBool 设为 true,但核心 0 始终读不到新值,缓存不一致。
- 作者移植了 Altera 的 SCU、L2C-310 与 L1 缓存驱动,仍无法让两核心达成一致。
- 他甚至发现 Arm 官方手册对 SCU_CTRL.EN 置 1 还是置 0 启用说法互相矛盾。
金句
两个处理器虽然各有独立的 L1 缓存,却共享一个所谓的 Snoop Control Unit,让它们对世界保持一致的视图。
👍 0
👎 0
返回 Lobsters 首页