2009-10-06 9 views
5

Est-il possible de désactiver toutes les interruptions avec un programme ASM/C/C++ pour obtenir un contrôle total sur le processeur?Désactiver les interruptions matérielles et logicielles

Si oui -> comment?

Sinon -> comment fonctionnent les appels système "atomiques" (par exemple, entrer une section critique)?

Merci pour votre aide!

+4

Vous devez indiquer le processeur que vous utilisez. Et quel système d'exploitation, le cas échéant. Sur un système d'exploitation de bureau/serveur moderne, le code utilisateur fonctionne généralement dans un mode non privilégié, ce qui vous empêche de le faire. – nos

+0

Quel processeur? Quel système d'exploitation? –

+0

MS Windows (XP SP2/SP3, Vista, 7) versions x86 et x64, processeurs Intel modernes (par exemple Intel Core 2 Duo) –

Répondre

3

sur x86 et la plupart des autres processeurs modernes, vous pouvez obtenir des instructions atomiques. Ceux qui sont GARANTIS de ne pas avoir fini de s'exécuter avant qu'un autre thread/processeur puisse accéder à cette mémoire. Sous Win32, vous disposez des fonctions Interlocked * qui vous permettent de les résumer sur les plates-formes prises en charge.

Sur un MIPS, beaucoup d'instructions peuvent avoir un .I ajouté à la fin de l'instruction pour garantir l'interverrouillage.

+1

Sur un x86, vous pouvez préfixer certaines instructions avec "lock" pour les rendre atomiques. – hirschhornsalz

+0

Ahh merci :) Il devait y avoir quelque chose comme ça :) – Goz

+0

pouvez-vous me donner un exemple de code source s'il vous plaît? –

4

En assembleur x86 les commandes sont

  • sti ensemble d'interruption bit de validation
  • cli interruption claire bit de validation

Ces commandes définies et effacer le IF Flag. Lorsque l'indicateur IF est défini, l'UC gère les interruptions matérielles et, lorsqu'elle est libérée, l'UC ignore les interruptions matérielles. Cela n'affecte cependant pas le traitement des interruptions non-masquables, ni les interruptions ou exceptions logicielles. Ces instructions ne fonctionnent pas non plus en mode non privilégié (généralement tout ce qui est supérieur à 0, en fonction de IOPL).

+4

vous l'avez récupéré. STI permet les interruptions. CLI désactive. –

+0

Il ne désactive pas non plus les interruptions logicielles ou les exceptions – Stewart

+0

Merci à vous pour vos commentaires et vos modifications: STI active les interruptions, les interruptions de la CLI désactivent en effet les bonnes. J'étais sûr que c'était l'inverse, mais j'ai appris mon assemblage sur un C64, donc j'ai cherché: le 6510 avait CLI désactiver et STI pour activer. Je suis confus;-) –

0

Le x86 possède un indicateur d'interruption (IF) dans le registre FLAGS. Lorsque cet indicateur est défini sur 0, les interruptions matérielles sont désactivées, sinon elles sont activées. La commande cli place cet indicateur à 0 et sti le définit à 1. Les instructions qui chargent des valeurs dans le registre FLAGS (telles que popf et iret) peuvent également modifier cet indicateur.

bonne chance!

Questions connexes