-
Ritter
[ASM] Wie soll denn das funktionieren?
Nachtrag:
Ok, hat sich im Großen und Ganzen erledigt. Im Protected Mode hat tatsächlich jedes Programm eine eigene Interrupt-Vektor-Tabelle. Und mit cli und sti sperrt man nur die Interrupts innerhalb des Programmes bzw. der "protecteten" Umgebung.
Hiho.
Wer keine Zeit hat oder nicht mehr als drei Sätze am Stück lesen kann (;-)), aber trotzdem wissen will, worum es geht, der darf den folgenden Text gerne überspringen und an dem Punkt "Das Problem in Kurzform" weiterlesen.
Zunächst möchte ich mich für die Überschrift entschuldigen. Sie verleitet zu falschen Annahmen über das Thema dieses Threads und ist eindeutig gewählt, um das Interesse des Betrachters zu wecken, aber genau diese Frage habe ich mir eben gestellt.
Die Ausgangssituation:
Wie ihr vielleicht in einem anderen Thread von mir mitbekommen habt, versuche ich, mit NASM ein Programm zum Auslesen der seriellen Schnittstelle zu schreiben. Während ich bei meinem ersten Programm noch das Verfahren Polling (in regelmäßigen Abständen prüfen, ob Daten zum Abholen bereit liegen) verwendet habe, wollte ich nun versuchen, das Ganze mit Interrupts zu realisieren. Eigentlich gar nicht so schwer, wenn man erstmal das Funktionsprinzip begriffen hat. Also setzte ich mich hin und tippte die ersten Zeilen des Programms ein, als mir plötzlich ein Gedanke kam ...
Am selben Ort, ein wenig früher:
Wenn man sich Assembler-Tutorials durchliest, dann lernt man normalerweise zunächst den 8086-Prozessor und seine Register kennen, schaut sich an, wie der 1 MB große Arbeitsspeicher adressiert wird und grüßt dann die Welt.
Nun möchte man plötzlich ein Programm schreiben, bei dem es nötig ist, Interrupts zu verwenden. Man schaut also im Internet nach und findet heraus, dass am Anfang des 1 MB goßen Speichers ein paar 4 Byte große Adressen stehen. Dies sind die Adressen, die aufgerufen werden, wenn ein bestimmtes Hardware-Ereignis stattfindet und ein Interrupt-Request generiert wird. Also setzt man sich hin und tippt die ersten Zeilen des Programms ein, als einem plötzlich ein Gedanke kommt ...
Das Problem in Kurzform: ... mehr oder weniger ...
Wenn man in der Interrupt-Vektor Tabelle am Anfang des Arbeitsspeichers etwas ändert, dann müssten doch alle anderen Programme, die den jeweiligen Interrupt verwenden, plötzlich Probleme bekommen.
Sind die Adressen, die mir von den Tutorials als physikalische Adressen suggeriert wurden, überhaupt physikalisch, oder greife ich auf einen simulierten Arbeitsspeicher zu und das ganze ist eine einzige große Verschwörung? Ich weiß nicht mehr, was real ist und was nicht. ;_;
Die Sache mit der Interrupt-Vektor-Tabelle ist eigentlich mein größtes Problem. Wenn ich beispielsweise den Tastaturinterrupt mit einer eigenen Interrupt-Service-Routine bediene (wollte ich aus Testgründen erstmal machen, bevor ich mich der seriellen Schnittstelle zuwende), dann dürfte doch eigentlich bei keinem anderen Programm mehr eine Tastatureingabe funktionieren.
Noch suspekter sind mir aber fast die Befehle cli und sti. Damit soll man angeblich alle Interrupts sperren können. Nun bin ich mir aber ziemlich sicher, das Windows das nicht zulassen würde. Und trotzdem kann ich diese Befehle in einem Assembler-Programm problemlos verwenden.
Ich habe es zwar nicht ausprobiert, aber wenn ich ein Programm schreibe, das die Interrupts sperrt und dann vor dem Freigeben eine Zeit lang wartet, dann bin ich mir relativ sicher, dass Sachen wie Tastatureingaben in anderen Fenstern/Programmen trotzdem funktionieren würden.
Ich hoffe, irgendjemand kann mir das erklären
Geändert von derBenny (28.10.2006 um 16:40 Uhr)
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln