作者一直在开发 floss,一个面向 QEMU 和 Raspberry Pi 板的 AArch64 操作系统内核。在真实硬件上测试时发现了 QEMU 模拟未捕获的问题。本文详细介绍了使用 load exclusive(ldaxr)和 store exclusive(stxr)指令实现自旋锁以在 CPU 核心之间实现互斥。该锁使用一个 32 位字,其中 0 表示未锁定,1 表示已锁定。ldaxr 指令包含获取语义以防止内存重排序,而 stlr(存储释放)在解锁时确保释放语义。该实现防止核心输出交错,确保仅一个核心一次打印。然而,真实硬件偶尔会在 load exclusive 操作期间导致 QEMU 未模拟的异常。作者通过测试验证了正确性,指出基本自旋锁缺乏公平性且由于忙等待性能较差,建议未来工作采用 wfe/sev 实现节能等待。
来源: Hacker News · 由HeadlinesBriefing整理摘要