2009-10-06 21 views
5

Ist es möglich, alle Interrupts mit einem ASM/C/C++ Programm zu deaktivieren, um die volle Kontrolle über den Prozessor zu bekommen?Disable Hardware & Software Interrupts

Wenn ja -> wie?

Wenn nicht -> Wie funktionieren "atomare" Betriebssystemaufrufe (zum Beispiel Eingabe eines kritischen Abschnitts)?

Danke für Ihre Hilfe!

+4

Sie müssen angeben, welchen Prozessor Sie verwenden. Und welches Betriebssystem, wenn überhaupt. Auf einem modernen Desktop/Server-Betriebssystem läuft der Benutzerland-Code normalerweise in einem nicht privilegierten Modus, der Sie daran hindert, dies zu tun. – nos

+0

Welcher Prozessor? Welches Betriebssystem? –

+0

MS Windows (XP SP2/SP3, Vista, 7) x86- und x64-Versionen, moderne Intel-Prozessoren (z. B. Intel Core 2 Duo) –

Antwort

3

auf X86 und die meisten anderen modernen Prozessoren können Sie atomare Anweisungen erhalten. Diejenigen, die GURANTEED sind, werden nicht beendet, bevor ein anderer Thread/Prozessor auf diesen Speicher zugreifen kann.

Unter Win32 haben Sie die Interlocked * -Funktionen, die das von Ihnen auf unterstützten Plattformen abstrahieren.

Auf einem MIPS kann eine Menge Anweisungen ein .I am Ende der Anweisung hinzugefügt haben, um die Verriegelung zu garantieren.

+1

Auf einem x86 können bestimmte Befehle mit "lock" versehen werden, um sie atomar zu machen. – hirschhornsalz

+0

Ahh danke :) Es musste so sein :) – Goz

+0

kannst du mir bitte ein Quellcode-Beispiel geben? –

4

In x86 Montage die die Befehle

  • sti Enable
  • Bit unterbrechen
  • cli klare Interrupt-Freigabebit

Diese Befehle setzen und den IF Flag löschen. Wenn das IF-Flag gesetzt ist, wird die CPU Hardware-Interrupts verarbeiten, und wenn es klar ist, ignoriert die CPU Hardware-Interrupts. Es hat jedoch keinen Einfluss auf die Behandlung von nicht maskierbaren Interrupts und beeinflusst auch keine Softwareunterbrechungen oder Ausnahmen. Diese Anweisungen funktionieren auch nicht im unprivilegierten Modus (normalerweise alles höher als Ring 0, abhängig von IOPL).

+4

hast du es rückwärts. STI ermöglicht Interrupts. CLI deaktiviert. –

+0

Es deaktiviert auch keine Software-Interrupts oder Ausnahmen – Stewart

+0

Vielen Dank für Ihre Kommentare und Änderungen: STI ermöglicht Interrupts, CLI deaktiviert Interrupts ist in der Tat richtig. Ich war mir sicher, dass es umgekehrt war, aber ich lernte meine Assembly auf einem C64, also habe ich nachgesehen: Der 6510 hatte CLI do disable und STI zu aktivieren. Ich bin verwirrt;-) –

0

Das x86 hat ein Interrupt-Flag (IF) im FLAGS-Register. Wenn dieses Flag auf 0 gesetzt ist, sind Hardware-Interrupts deaktiviert, andernfalls sind sie aktiviert. Der Befehl cli setzt dieses Flag auf 0 und sti setzt es auf 1. Anweisungen, die Werte in das FLAGS-Register laden (wie z. B. popf und iret), können dieses Flag ebenfalls modifizieren.

viel Glück!

Verwandte Themen