HeadlinesBriefing HeadlinesBriefing 12 languages

When Ldaxr Doesn't Work: Exclusive Accesses and Cacheability on AArch64

Hacker News ·

🇬🇧 English

The author has been developing floss, an AArch64 operating system kernel targeting QEMU and Raspberry Pi boards. Testing on real hardware revealed issues not caught by QEMU emulation. This post details implementing a spin lock using load exclusive (ldaxr) and store exclusive (stxr) instructions for mutual exclusion between CPU cores.

The lock uses a 32-bit word where 0 means unlocked and 1 means locked. The ldaxr instruction includes acquire semantics to prevent memory reordering, while stlr (store-release) in unlock ensures release semantics. The implementation guards against core output interleaving, ensuring only one core prints at a time.

However, real hardware occasionally causes exceptions during load exclusive operations that QEMU doesn't emulate. The author validates correctness through testing, noting the basic spin lock lacks fairness and has poor performance due to busy-waiting, suggesting future work on wfe/sev for power-efficient waiting.

View original article →


🇸🇦 العربية

تحديات تنفيذ قفل الدوران AArch64 على الأجهزة الحقيقية

كان المؤلف يطور floss، وهو نواة نظام تشغيل AArch64 تستهدف QEMU ولوحات Raspberry Pi. كشف الاختبار على الأجهزة الحقيقية عن مشكلات لم يتم اكتشافها بواسطة محاكاة QEMU. تفصل هذه المشاركة تنفيذ قفل دوران باستخدام تعليمات التحميل الحصرية (ldaxr) والتخزين الحري (stxr) للاستبعاد المتبادل بين نوى وحدة المعالجة المركزية. يستخدم القفل كلمة 32 بت حيث يعني 0 غير مقفل و1 يعني مقفل. تتضمن تعليمات ldaxr دلالات الاستحواذ لمنع إعادة ترتيب الذاكرة، بينما تضمن stlr (التخزين-الإطلاق) في الفتح دلالات الإطلاق. تحمي التنفيذ من intercalation مخرجات النواة، مما يضمن أن noyau واحد فقط يطبع في وقت واحد. ومع ذلك، فإن الأجهزة الحقيقية تسبب أحيانًا استثناءات أثناء عمليات التحميل الحصرية التي لا يحاكي QEMU. يؤكد المؤلف على الصحة من خلال الاختبار، مشيرًا إلى أن قفل الدوران الأساسي يفتقر إلى العدالة وله أداء ضعيف بسبب الانتظار المزدحم، ويقترح عملًا مستقبليًا باستخدام wfe/sev للانتظار الفعال من حيث الطاقة.

لماذا قد تفشل عمليات التحميل الحصرية على الأجهزة الحقيقية AArch64 ولكنها تعمل في محاكاة QEMU؟

الأجهزة الحقيقية لديها بروتوكولات تماسك ذاكرة التخزين المؤقت الأكثر صرامة وقد تبطل المراقبين الحصرين بسبب أحداث خارجية، أو انقطاعات، أو تغييرات حالة الطاقة التي لا يحاكي QEMU بدقة. قد لا يحاكي نموذج الذاكرة المبسط لـ QEMU سلوك المراقب الحصرين بشكل صحيح، مما يؤدي إلى تحميلات حصرية ناجحة في المحاكاة التي ستفشل على السيليكون الفعلي.

العربية version →


🇧🇩 বাংলা

AArch64 স্পিন লক বাস্তব হার্ডওয়্যারে বাস্তবায়নের চ্যালেঞ্জ

লেখক QEMU এবং Raspberry Pi বোর্ড লক্ষ্য করে AArch64 অপারেটিং সিস্টেম কার্নেল floss বিকাশ করছেন। বাস্তব হার্ডওয়্যারে পরীক্ষা করার সময় QEMU এমুলেশন দ্বারা পকানো না হওয়া সমস্যা উঠে এসেছে। এই পোস্টে CPU কোরের মধ্যে পরস্পর বর্জনের জন্য load exclusive (ldaxr) এবং store exclusive (stxr) নির্দেশ ব্যবহার করে স্পিন লক বাস্তবায়নের বিস্তারিত ব্যাখ্যা দেওয়া হয়েছে। লকটি একটি 32-বিট শব্দ ব্যবহার করে যেখানে 0 মানে আনলকড এবং 1 মানে লকড। ldaxr নির্দেশটি অ্যাকুইজ SEMANTICS অন্তর্ভুক্ত করে যা মেমোরি পুনরায় ক্রমবিন্যাস রোধ করে, যখন stlr (স্টোর-রিলিজ) আনলক করার সময় রিলিজ SEMANTICS নিশ্চিত করে। বাস্তবায়নটি কোর আউটপুট ইন্টারলিভিং প্রতিরোধ করে, যা নিশ্চিত করে যে শুধুমাত্র একটি কোর এক সময়ে প্রিন্ট করে। যাইহোক, বাস্তব হার্ডওয়্যারে কখনও কখনও load exclusive অপারেশন চলাকালীন QEMU অনুকরণ না করা ব্যতিক্রম ঘটে। লেখক পরীক্ষার মাধ্যমে সঠিকতা যাচাই করেছেন, মনে করেছেন যে মৌলিক স্পিন লক ন্যায্যতা থেকে বিমুখ এবং বিজি-ওয়েটিং এর কারণে খারাপ কর্মক্ষমতা দেখায়, এবং ভবিষ্যতের কাজে wfe/sev এর মাধ্যমে শক্তি-কुशল অপেক্ষার সুপারিশ করেছেন।

কেন বাস্তব AArch64 হার্ডওয়্যারে load exclusive অপারেশন ব্যর্থ হতে পারে কিন্তু QEMU এমুলেশনে কাজ করে?

বাস্তব হার্ডওয়্যারে ক্যাশ কোহেরেন্সি প্রোটোকল আরও কঠোর এবং বাহ্যিক ইভেন্ট, ইন্টারপট বা পাওয়ার স্টেট পরিবর্তনের কারণে এক্সক্লूसিভ মনিটর বাতিল হতে পারে যা QEMU সঠিকভাবে অনুকরণ করে না। QEMU এর সরলীকৃত মেমোরি মডেল এক্সক্লूसিভ মনিটরের আচরণ সঠিকভাবে অনুকরণ করতে পারে না, যার ফলে এমুলেশনে সফল এক্সক্লूसিভ লোড হয় যা বাস্তব সিলিকনে ব্যর্থ হবে।

বাংলা version →


🇩🇪 Deutsch

Herausforderungen bei der Implementierung von AArch64-Spinlocks auf echter Hardware

Der Autor entwickelt floss, einen AArch64-Betriebssystem-Kernel, der auf QEMU und Raspberry Pi-Boards abzielt. Tests auf echter Hardware haben Probleme aufgedeckt, die von der QEMU-Emulation nicht erfasst wurden. Dieser Beitrag beschreibt die Implementierung eines Spinlocks mit Load-Exclusive (ldaxr) und Store-Exclusive (stxr) Befehlen für die gegenseitige Ausschließung zwischen CPU-Kernen.

Das Schloss verwendet ein 32-Bit-Wort, wobei 0 entsperrt und 1 gesperrt bedeutet. Die ldaxr-Anweisung beinhaltet Acquire-Semantik, um eine Speicherumordnung zu verhindern, während stlr (Store-Release) beim Entsperren Release-Semantik sicherstellt. Die Implementierung schützt vor der Durchmischung der Kernausgabe, sodass nur ein Kern gleichzeitig ausgibt.

Allerdings treten auf echter Hardware gelegentlich Ausnahmen während Load-Exclusive-Operationen auf, die QEMU nicht emuliert. Der Autor bestätigt die Korrektheit durch Tests und weist darauf hin, dass der grundlegende Spinlock keine Gerechtigkeit bietet und aufgrund von Busy-Waiting eine schlechte Leistung aufweist, wobei zukünftige Arbeiten mit wfe/sev für energieeffizientes Warten vorgeschlagen werden.

Warum können Load-Exclusive-Operationen auf echter AArch64-Hardware fehlschlagen, während sie in der QEMU-Emulation funktionieren?

Echte Hardware verfügt über strengere Cache-Kohärenz-Protokolle und kann exklusive Monitore aufgrund externer Ereignisse, Unterbrechungen oder Änderungen des Energiezustands ungültig machen, die QEMU nicht genau simuliert. Das vereinfachte Speichermodell von QEMU kann das Verhalten des exklusiven Monitors möglicherweise nicht korrekt emulieren, was zu erfolgreichen exklusiven Ladevorgängen in der Emulation führen kann, die auf echtem Silizium fehlschlagen würden.

Deutsch version →


🇪🇸 Español

Desafíos de la Implementación de Bloqueo de Giro AArch64 en Hardware Real

El autor ha estado desarrollando floss, un kernel de sistema operativo AArch64 que se dirige a QEMU y placas Raspberry Pi. Las pruebas en hardware real revelaron problemas no detectados por la emulación de QEMU. Esta publicación detalla la implementación de un bloqueo de giro utilizando instrucciones de carga exclusiva (ldaxr) y almacenamiento exclusivo (stxr) para exclusión mutua entre núcleos de CPU.

El bloqueo utiliza una palabra de 32 bits donde 0 significa desbloqueado y 1 significa bloqueado. La instrucción ldaxr incluye semántica de adquisición para evitar reordenamiento de memoria, mientras que stlr (almacenamiento-liberación) en desbloqueo asegura semántica de liberación. La implementación protege contra la intercalación de salida de núcleos, asegurando que solo un núcleo imprima a la vez.

Sin embargo, el hardware real ocasionalmente causa excepciones durante las operaciones de carga exclusiva que QEMU no emula. El autor valida la corrección mediante pruebas, señalando que el bloqueo de giro básico carece de equidad y tiene un rendimiento pobre debido a la espera ocupada, sugiriendo trabajo futuro en wfe/sev para espera eficiente en energía.

¿Por qué podrían fallar las operaciones de carga exclusiva en el hardware real AArch64 pero funcionar en la emulación de QEMU?

El hardware real tiene protocolos de coherencia de caché más estrictos y puede invalidar los monitores exclusivos debido a eventos externos, interrupciones o cambios de estado de energía que QEMU no simula con precisión. El modelo de memoria simplificado de QEMU puede no emular adecuadamente el comportamiento del monitor exclusivo, lo que lleva a cargas exclusivas exitosas en la emulación que fallarían en el silicio real.

Español version →


🇫🇷 Français

Défis de l'implémentation du verrouillage à rotation AArch64 sur le matériel réel

L'auteur développe floss, un noyau de système d'exploitation AArch64 destiné à QEMU et aux cartes Raspberry Pi. Les tests sur du matériel réel ont révélé des problèmes non détectés par l'émulation QEMU. Cet article détaille l'implémentation d'un verrouillage à rotation en utilisant les instructions de chargement exclusif (ldaxr) et de stockage exclusif (stxr) pour l'exclusion mutuelle entre les cœurs de CPU.

Le verrou utilise un mot de 32 bits où 0 signifie déverrouillé et 1 signifie verrouillé. L'instruction ldaxr inclut des sémantiques d'acquisition pour empêcher le réordonnancement de la mémoire, tandis que stlr (stockage-libération) lors du déverrouillage assure des sémantiques de libération. L'implémentation protège contre l'entrelacement de la sortie des cœurs, assurant qu'un seul noyau imprime à la fois.

Cependant, le matériel réel provoque parfois des exceptions lors des opérations de chargement exclusif que QEMU n'émule pas. L'auteur valide la correction par des tests, notant que le verrouillage à rotation de base manque d'équité et présente de mauvaises performances en raison de l'attente occupée, suggérant un travail futur sur wfe/sev pour une attente économe en énergie.

Pourquoi les opérations de chargement exclusif pourraient-elles échouer sur le matériel réel AArch64 mais fonctionner dans l'émulation QEMU ?

Le matériel réel présente des protocoles de cohérence de cache plus stricts et peut invalider les moniteurs exclusifs en raison d'événements externes, d'interruptions ou de changements d'état d'alimentation que QEMU ne simule pas avec précision. Le modèle de mémoire simplifié de QEMU peut ne pas émuler correctement le comportement du moniteur exclusif, ce qui entraîne des chargements exclusifs réussis dans l'émulation qui échoueraient sur le silicium réel.

Français version →


🇮🇳 हिन्दी

AArch64 स्पिन लॉक कार्यान्वयन की वास्तविक हार्डवेयर पर चुनौतियाँ

लेखक ने QEMU और Raspberry Pi बोर्ड्स को लक्षित करते हुए AArch64 ऑपरेटिंग सिस्टम कर्नेल floss विकसित किया है। वास्तविक हार्डवेयर पर परीक्षण से QEMU एमुलेशन द्वारा नहीं पकड़े गए मुद्दों का खुलासा हुआ। इस पोस्ट में लोड एक्सक्लूसिव (ldaxr) और स्टोर एक्सक्लूसिव (stxr) निर्देशों का उपयोग करके CPU कोर के बीच आपसी बहिष्करण के लिए स्पिन लॉक के कार्यान्वयन का विवरण दिया गया है। लॉक एक 32-बिट शब्द का उपयोग करता है जहाँ 0 का अर्थ अनलॉक्ड है और 1 का अर्थ लॉक्ड है। ldaxr निर्देश में अधिग्रहण अर्थशास्त्र शामिल है जो मेमोरी पुनर्क्रमण को रोकता है, जबकि अनलॉक में stlr (स्टोर-रिलीज़) रिलीज़ अर्थशास्त्र सुनिश्चित करता है। कार्यान्वयन कोर आउटपुट इंटरलीविंग के खिलाफ सुरक्षा प्रदान करता है, जिससे केवल एक कोर एक समय में प्रिंट करता है। हालाँकि, वास्तविक हार्डवेयर पर लोड एक्सक्लूसिव ऑपरेशनों के दौरान कभी-कभी QEMU द्वारा अनुकरण नहीं किए गए अपवाद उत्पन्न होते हैं। लेखक ने परीक्षण के माध्यम से सहीपन को मान्य किया है, यह नोट करते हुए कि बेसिक स्पिन लॉक में निष्पक्षता की कमी है और बिजी-वेटिंग के कारण खराब प्रदर्शन होता है, जिससे भविष्य के कार्य के लिए wfe/sev के माध्यम से शक्ति-कुशल प्रतीक्षा का सुझाव दिया जाता है।

वास्तविक AArch64 हार्डवेयर पर लोड एक्सक्लूसिव ऑपरेशनों में विफलता क्यों हो सकती है जबकि QEMU एमुलेशन में वे काम करते हैं?

वास्तविक हार्डवेयर में अधिक कड़ caché सुसंगति प्रोटोकॉल होते हैं और बाहरी घटनाओं, interrupts, या पावर स्टेट चेंज के कारण एक्सक्लूसिव मॉनिटर्स को अमान्य कर सकते हैं जो QEMU सटीक रूप से अनुकरण नहीं करता है। QEMU का सरलीकृत मेमोरी मॉडल एक्सक्लूसिव मॉनिटर के व्यवहार को ठीक से अनुकरण नहीं कर सकता है, जिससे अनुकरण में सफल एक्सक्लूसिव लोड होते हैं जो वास्तविक सिलिकॉन पर विफल हो सकते हैं।

हिन्दी version →


🇮🇩 Bahasa Indonesia

Tantangan Implementasi Spin Lock AArch64 pada Hardware Nyata

Pengarang telah mengembangkan floss, sebuah kernel sistem operasi AArch64 yang menargetkan QEMU dan papan Raspberry Pi. Pengujian pada hardware nyata mengungkapkan masalah yang tidak terdeteksi oleh emulasi QEMU. Pos ini menjelaskan penerapan spin lock menggunakan instruksi load exclusive (ldaxr) dan store exclusive (stxr) untuk eksklusivitas saling antara inti CPU.

Kunci menggunakan kata 32-bit di mana 0 berarti terbuka dan 1 berarti terkunci. Instruksi ldaxr mencakup semantik akuisisi untuk mencegah pengurutan ulang memori, sementara stlr (store-release) dalam pembukaan kunci memastikan semantik rilis. Implementasi ini melindungi dari campuran keluaran inti, memastikan hanya satu inti yang mencetak sekaligus.

Namun, hardware nyata kadang-kala menyebabkan pengecualian selama operasi load exclusive yang tidak diemulasi oleh QEMU. Pengarang memvalidasi keebenaran melalui pengujian, dengan mencatat bahwa spin lock dasar tidak adil dan memiliki kinerja buruk karena busy-waiting, menyarankan pekerjaan masa depan menggunakan wfe/sev untuk menunggu yang efisien energi.

Mengapa operasi load exclusive mungkin gagal pada hardware AArch64 nyata tetapi berhasil dalam emulasi QEMU?

Hardware nyata memiliki protokol koherensi cache yang lebih ketat dan dapat membatalkan monitor eksklusif karena acara eksternal, interupsi, atau perubahan status daya yang tidak diakurasi oleh QEMU. Model memori yang disederhanakan oleh QEMU mungkin tidak dapat dengan tepat mengemulasi perilaku monitor eksklusif, yang mengakibatkan beban eksklusif yang berhasil dalam emulasi yang akan gagal pada silikon sebenarnya.

Bahasa Indonesia version →


🇯🇵 日本語

AArch64 スピンロックの実際のハードウェアにおける実装の課題

著者は QEMU と Raspberry Pi ボードを対象とした AArch64 オペレーティングシステム カーネル floss を開発しています。実際のハードウェアでのテストにより、QEMU エミュレーションでは検出されなかった問題が明らかになりました。この投稿では、CPU コア間の相互排他のためにロード エクスクルーシブ (ldaxr) とストア エクスクルーシブ (stxr) 命令を使用したスピンロックの実装について詳しく説明します。ロックは 32 ビット ワードを使用し、0 がアンロック、1 がロックを意味します。ldaxr 命令には取得セマンティクスが含まれており、メモリの再順序付けを防止します。一方、アンロック時の stlr (ストア-リリース) はリリース セマンティクスを確保します。この実装は、コアの出力インターリーブを防ぎ、一度に 1 つのコアしか出力しないようにします。ただし、実際のハードウェアでは、ロード エクスクルーシブ操作中に QEMU がエミュレートしない例外が発生することがあります。著者はテストを通じて正しさを検証しており、基本的なスピンロックは公平性に欠け、ビジーウェイティングによるパフォーマンスが悪いことを指摘し、将来的には wfe/sev を使用した省電力待機のための作業を提案しています。

なぜ実際の AArch64 ハードウェアではロード エクスクルーシブ操作が失敗することがあるのに、QEMU エミュレーションでは成功するのでしょうか?

実際のハードウェアでは、キャッシュ コヒーレンシー プロトコルがより厳格であり、外部イベント、割り込み、または電源状態の変更によりエクスクルーシブ モニターが無効になることがあります。これは QEMU が正確にシミュレートしない場合があります。QEMU の簡素化されたメモリ モデルは、エクスクルーシブ モニターの動作を適切にエミュレートしない可能性があり、これによりエミュレーションでは成功するエクスクルーシブ ロードが実際のシリコンでは失敗する可能性があります。

日本語 version →


🇧🇷 Português

Desafios da Implementação de Bloqueio de Giro AArch64 em Hardware Real

O autor tem desenvolvido o floss, um kernel de sistema operacional AArch64 destinado ao QEMU e às placas Raspberry Pi. Os testes em hardware real revelaram problemas não detectados pela emulação do QEMU. Este post detalha a implementação de um bloqueio de giro usando instruções de carga exclusiva (ldaxr) e armazenamento exclusivo (stxr) para exclusão mútua entre os núcleos da CPU.

O bloqueio usa uma palavra de 32 bits onde 0 significa desbloqueado e 1 significa bloqueado. A instrução ldaxr inclui semântica de aquisição para evitar o reordenamento de memória, enquanto stlr (armazenamento-liberação) no desbloqueio garante semântica de liberação. A implementação protege contra a intercalação de saída de núcleos, assegurando que apenas um núcleo imprima de cada vez.

No entanto, o hardware real ocasionalmente causa exceções durante as operações de carga exclusiva que o QEMU não emula. O autor valida a correção através de testes, observando que o bloqueio de giro básico carece de justiça e tem desempenho ruim devido à espera ocupada, sugerindo trabalho futuro em wfe/sev para espera eficiente em termos de energia.

Por que as operações de carga exclusiva podem falhar no hardware real AArch64 mas funcionar na emulação do QEMU?

O hardware real tem protocolos de coerência de cache mais rigorosos e pode invalidar os monitores exclusivos devido a eventos externos, interrupções ou alterações de estado de energia que o QEMU não simula com precisão. O modelo de memória simplificado do QEMU pode não emular adequadamente o comportamento do monitor exclusivo, levando a cargas exclusivas bem-sucedidas na emulação que falhariam no silício real.

Português version →


🇷🇺 Русский

Проблемы реализации блокировки спина AArch64 на реальном оборудовании

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

Почему операции загрузки с захватом могут не работать на реальном оборудовании AArch64, но функционировать в эмуляции QEMU?

Реальное оборудование имеет более строгие протоколы согласованности кэша и может аннулировать эксклюзивные мониторы из-за внешних событий, прерываний или изменений состояния питания, которые QEMU не моделирует точно. Упрощённая модель памяти QEMU может некорректно эмулировать поведение эксклюзивного монитора, что приводит к успешным эксклюзивным загрузкам в эмуляции, которые бы провалились на реальном кремнии.

Русский version →


🇨🇳 简体中文

AArch64 自旋锁在真实硬件上的实现挑战

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

为什么 load exclusive 操作在真实 AArch64 硬件上可能失败但在 QEMU 模拟中有效?

真实硬件具有更严格的缓存一致性协议,并且可能由于外部事件、中断或电源状态变化而使独占监视器失效,而 QEMU 未能准确模拟这些情况。QEMU 的简化内存模型可能无法正确模拟独占监视器的行为,导致在实际硅片上会失败的独占加载在模拟中成功。

简体中文 version →