Автор разрабатывает floss — ядро операционной системы AArch64, ориентированное на QEMU и платы Raspberry Pi. Тестирование на реальном оборудовании выявило проблемы, которые не были обнаружены при эмуляции QEMU. В этом посте подробно описывается реализация блокировки спина с использованием инструкций загрузки с захватом (ldaxr) и сохранения с захватом (stxr) для обеспечения взаимного исключения между ядрами процессора. Блокировка использует 32-битное слово, где 0 означает разблокировано, а 1 — заблокировано. Инструкция ldaxr включает семантику захвата, предотвращающую переупорядочивание памяти, тогда как stlr (сохранение-освобождение) при разблокировке обеспечивает семантику освобождения. Реализация защищает от переплетения вывода ядер, гарантируя, что только одно ядро печатает за раз. Однако на реальном оборудовании иногда возникают исключения во время операций загрузки с захватом, которые не эмулируются QEMU. Автор подтверждает корректность с помощью тестирования, отмечая, что базовая блокировка спина не обеспечивает справедливости и имеет низкую производительность из-за ожидания с активным циклом, предлагая будущую работу с использованием wfe/sev для энергоэффективного ожидания.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing