Je suis en train de porter une extension de noyau à AIX 32/64 bit sur PowerPC multi-processeurs, écrite en C. Je n'ai pas besoin de plus d'opérations de lecture atomique et d'écriture atomique (je n'ai pas besoin de fetch-and-add , compare-and-swap etc.) Juste pour clarifier: pour moi, "atomicité" signifie non seulement "pas d'entrelacement", mais aussi "visibilité à travers plusieurs cœurs". Les opérations fonctionnent sur des pointeurs, donc les opérations sur les variables 'int' sont inutiles pour moi.comment implémenter une affectation atomique sous AIX/powerpc?
Si je déclare la variable "volatile", la norme C indique que la variable peut être modifiée par des facteurs inconnus et n'est donc pas soumise à des optimisations. D'après ce que j'ai lu, il semble que les lectures et les écritures régulières soient supposées être non entrelacées, et les linux kernel souces semblent être d'accord. il dit:
__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
stw
est « mot de magasin », qui est censé être atomique, mais je ne sais pas ce que le « % U0% X0 » signifie. Je ne comprends pas comment cette instruction d'assemblage impose de la visibilité. Quand je compile mon extension de noyau, 'std' est utilisé pour l'assignation que je veux, mais il devrait aussi être atomique pour une machine 64 bits, d'après ce que j'ai lu. J'ai très peu de compréhension des spécificités de PowerPC et de son jeu d'instructions, mais je n'ai pas trouvé dans la liste d'assemblage du fichier compilé des instructions de barrière de mémoire ("sync" ou "eieio").
Le noyau fournit le service fetch_and_addlp() qui peut être utilisé pour implémenter la lecture atomique (v = fetch_and_addlp(&x, 0)
, par exemple).
Mes questions sont les suivantes:
suffit pour déclarer la variable « volatile » pour atteindre lire et écrire atomicité dans le sens de la visibilité et pas désentrelacement? Si la réponse à 1 est "non", comment cette atomicité est-elle atteinte?
Quelle est la signification de "% U0% X0" dans l'implémentation atomique de Linux PowerPC?
Ce n'est pas le sens de « atomique »! Si vous souhaitez commander des garanties, utilisez une barrière de mémoire. (Ou tout simplement utiliser un verrou, car apparemment tout le monde se trompe de barrières.) –
@tc: Malheureusement, la communauté des microprocesseurs n'est pas d'accord sur la signification du mot "atomique". Quand j'ai défini l'architecture de commande de mémoire Intel x86 vers 1991, j'ai utilisé la définition que tc utilise - "atomique" se référant à voir une opération tout fait ou pas du tout, jamais à mi-chemin et "ordre de mémoire". ARM, cependant, utilise plus récemment «atomique» pour désigner l'ordre de la mémoire, «atomicité à emplacement unique» pour ce que tc et moi appelait simplement «atomique» et «atomicité à emplacements multiples» ou «écriture atomicité» pour désigner l'ordre de la mémoire. propriétés du système. –