2011-07-06 3 views
3

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:

  1. 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?

  2. Quelle est la signification de "% U0% X0" dans l'implémentation atomique de Linux PowerPC?

+0

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.) –

+0

@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. –

Répondre

0

J'ai réussi à répondre aux questions 1 et 2, mais pas 3:

  1. Non, ce ne suffit pas.
  2. Des barrières de mémoire sont toujours nécessaires. J'ai utilisé le XLC construit dans __lwsync(). Cela devrait à la fois empêcher la réorganisation par le processeur et publier la modification à d'autres processeurs.
1

Il existe des idiosyncrasies dans la syntaxe d'assemblage en ligne de GCC.

dans la ligne,

__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i)); 

la m est un opérande de sortie et le r est un opérande d'entrée. Le% 1 et% 0 se réfèrent à l'ordre d'argument (0-> m, 1-> r)

l'instruction d'assemblage prend 2 arguments et les% U0% X0 sont des contraintes sur les arguments. Ces contraintes consistent à forcer GCC à analyser les arguments et à s'assurer que vous ne faites pas quelque chose de stupide.Comme il s'avère, «U» est spécifique à powerpc (je suis habitué à l'ensemble de contraintes X64 :). La liste complète des contraintes se trouve dans:

http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints

Questions connexes