STREX |
Entrepose un registre exclusif |
| ARM |
Syntaxe
|
STREX{cond} Rd, Rt, [Rn {, #offset}]
|
|
STREXB{cond} Rd, Rt, [Rn]
|
|
STREXH{cond} Rd, Rt, [Rn]
|
|
STREXD{cond} Rd, Rt, Rt2, [Rn]
|
Paramètres
| Nom |
Description |
| cond |
Ce paramètre optionnel permet d'indiquer le code de condition |
| Rd |
Ce paramètre permet d'indiquer le registre de destination pour l'état de retour. |
| Rt |
Ce paramètre permet d'indiquer le registre à entreposer. |
| Rt2 |
Ce paramètre permet d'indiquer le deuxième registre pour entreposer le double mot. |
| Rn |
Ce paramètre permet d'indiquer le registre dans lequel l'adresse mémoire est basé. |
| #offset |
Ce paramètre optionnel permet d'indiquer le déplacement à appliquer dans la valeur de Rn. |
Description
Cette instruction permet d'effectuer l'entreposage d'un registre exclusif.
Remarques
- STREX fait partie du mécanisme d'exclusion mutuelle : L'instruction STREX est utilisée pour l'implémentation de sections critiques sans verrou matériel
explicite. Elle fonctionne en tandem avec LDREX et ne réussit l'écriture que si aucun autre cour n'a accédé à l'adresse ciblée depuis le dernier LDREX, assurant ainsi une
exclusion mutuelle atomique.
- Le registre Rd retourne l'état de l'opération : Le registre Rd ne contient pas une donnée utilisateur, mais un indicateur d'état : s'il vaut 0,
l'écriture a réussi ; s'il vaut 1, elle a échoué. Cela permet au programme de savoir s'il doit réessayer, et ainsi boucler sur une opération atomique en toute sécurité.
- Permet des opérations atomiques complexes sans instructions supplémentaires : En combinaison avec LDREX, cette instruction autorise la construction de
primitives de synchronisation atomiques telles que les mutex, spinlocks, sémaphores,..., ce qui est essentiel dans les systèmes multicoeurs ou les systèmes d'exploitation
temps réel.
- Les variantes STREXB, STREXH et STREXD offrent une granularité différente : Les variantes STREXB, STREXH et STREXD permettent respectivement d'écrire un
octet, un demi-mot ou un double mot de façon exclusive. Cela permet d'adapter le mécanisme d'exclusion à la taille réelle des données manipulées, réduisant ainsi les
collisions mémoire inutiles.
- La réussite de STREX dépend du comportement d'autres coeurs : Si un autre processeur modifie la même adresse mémoire entre le LDREX et le STREX,
l'instruction échoue volontairement. Cela empêche les incohérences dans le cache ou les accès concurrents destructeurs et renforce la cohérence mémoire.
- Souvent utilisée pour implémenter les opérations 'compare-and-swap' : Bien que l'architecture ARM ne dispose pas directement d'une instruction CMPXCHG
comme sur x86, le couple LDREX/STREX permet de la simuler efficacement, avec la même garantie d'atomicité, ce qui est indispensable pour les algorithmes non bloquants.
- STREX ne doit jamais être utilisé seul : Sans un LDREX précédant, STREX échouera presque systématiquement, car il repose sur l'état d'exclusivité du
cache. Il est donc fondamental que les deux instructions soient regroupées dans une séquence qui ne soit pas interrompue par d'autres accès à l'adresse visée.
- Très utile pour le développement bas niveau en assembleur ou en C avec inline ASM : Les développeurs de noyaux, de firmwares ou de bibliothèques de
synchronisation utilisent STREX pour créer des outils de synchronisation performants sans recours au système d'exploitation, ce qui améliore la réactivité et la
portabilité sur les plateformes ARM.
Dernière mise à jour : Dimanche, le 12 novembre 2017