Protected-Mode-Verständnisproblem am 80386+

Im Unterforum Alle anderen elektronischen Probleme - Beschreibung: Was sonst nirgendwo hinpasst

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 12 2025  20:13:12      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Alle anderen elektronischen Probleme        Alle anderen elektronischen Probleme : Was sonst nirgendwo hinpasst


Autor
Protected-Mode-Verständnisproblem am 80386+

    







BID = 442230

langesOhr

Gelegenheitsposter



Beiträge: 67
 

  


Hallo,

ich arbeite mich gerade in die Geheimnisse des 32-Bit-Protected Mode auf
I386+ ein. Dabei habe ich ein Verständnisproblem: Wenn in den Protected
Mode geschaltet wird, sind Interrupt 00-11H für die verschiedenen
Ausnahmen belegt (z.B. 0BH=Segment not present). Wenn man die abfangen
möchte, dann muss man eine IDT laden und entsprechende Handler bereitstellen.
Soweit alles ok.

Mein Problem ist aber: Was passiert denn mit den "alten" ISRs aus dem
Real-Mode? Der "Clock tick"-Chip hat doch die Umschaltung in den Protected
Mode nicht mitbekommen und schickt weiter alle 1/18 Sekunde einen IRQ08
an den Prozessor? Schaltet der dann kurz zurück in den RM, arbeitet die
BIOS-ISR ab und schaltet dann in den PM zurück? Oder bekomme ich dann je
Sekunde 18 "Double faults"? Oder passiert gar nichts mehr? Wenn letzteres,
wer bearbeitet dann die Tastatur (Interrupt 09?)

In den Tutorials im Netz habe ich bisher immer nur gefunden (wenn das
Thema überhabt angesprochen wurde): Interrupts abgeschaltet lassen...
Das geht, wenn eine DOS-Anwendung nur Daten in den hohen Speicherbereich
auslagern möchte. Ich möchte aber ein ganzes Programm im PM ausführen
(also ähnlich wie unter einem 32-Bit-DOS-Extender); einen bestehenden wie
Go32 nehmen geht nicht, weil das "aufgesetzte" Programm ohne
Betriebssystem läuft, und mir im RM allmählich der Speicher knapp wird.

Mit ratlosem Gruss

das lange Ohr

BID = 442316

kolbenquaeler

Gerade angekommen


Beiträge: 12

 

  

Hi,

vorweg: ich bin da auch nicht so der Crack, das Kapitel Protected Mode habe ich dereinst nur überflogen und nicht praktisch nachvollzogen, weil der für mich wenig interessant war.


Zitat :
langesOhr hat am  9 Jul 2007 22:53 geschrieben :

Mein Problem ist aber: Was passiert denn mit den "alten" ISRs aus dem
Real-Mode? Der "Clock tick"-Chip hat doch die Umschaltung in den Protected
Mode nicht mitbekommen und schickt weiter alle 1/18 Sekunde einen IRQ08
an den Prozessor? Schaltet der dann kurz zurück in den RM, arbeitet die
BIOS-ISR ab und schaltet dann in den PM zurück?


Das mit Sicherheit nicht, interessanterweise ist ein Befehl zum Züruckschalten in den RM garnicht vorgesehen, das ist wohl nur mit aufwändiger Trickserei machbar. Soweit ich das verstanden habe, werden die Hw-IRQs vom Prozessor prinzipiell wie im RM auch behandelt, eine Exception wird nur im Fehlerfall vom Prozessor selbst generiert.

Habe hier Michael Tischers PC-Intern 4 (von 1993, dementsprechend ausführlich ist auch das Kapitel PM abgehandelt) vorliegen, da steht so Einiges was Dich interessieren könnte, ist aber wohl zuviel, um es hier als Zitat zu posten. Falls Interesse besteht, kann ich Dir die paar Seiten vielleicht mal scannen und per PN zukommen lassen.


BID = 442355

langesOhr

Gelegenheitsposter



Beiträge: 67

Hallo,

@kolbenquaeler:

Ich habe inzwischen ein kleines Testprogramm vorliegen, das erfolgreich vom RM
zum PM und wieder zurückschaltet, allerdings nur mit abgeschalteten Interrupts.
Auf dem 80386+ kommt man aus dem PM genauso heraus, wie man hereingekommen ist,
das ist nicht das Problem. Die "aufwendige Trickserei" braucht man aber in der
Tat beim 80286, da ist der übliche Weg, über den Tastaturcontroller
Strg+Alt+Entf zu simulieren und im BIOS den Einsprung umzubiegen. Ich teste
der Einfachheit halber, ob ein 80386+ installiert ist, und breche andernfalls
ab.

Das Problem aber bleibt: Wenn man länger im PM bleibt, wie kann man dann z.B.
die Tastatur auslesen? Ich kann zwar kurz in den RM zurückgehen, um Funktion
00 von Interrupt 16H aufzurufen, aber was mache ich, wenn eine Taste gedrückt
wird und Interrupt 09 stattfindet, während der PM aktiv ist (z.B. Ctrl+Break?)

Mit ratlosen Grüssen

das lange Ohr

BID = 442387

kolbenquaeler

Gerade angekommen


Beiträge: 12


Zitat :
langesOhr hat am 10 Jul 2007 14:31 geschrieben :

was mache ich, wenn eine Taste gedrückt
wird und Interrupt 09 stattfindet, während der PM aktiv ist (z.B. Ctrl+Break?)

Wie geschrieben fehlt mir da selbst die praktische Erfahrung, jetzt nötige mich mal nicht, Dir irgendwelchen Unfug zu erzählen...

Das Interrupt-Handling im PM wird z.B. hier unter http://www.x86.org/articles/pmbasics/tspec_a1_doc.htmetwas detaillierter beschrieben.


link repariert, philip

[ Diese Nachricht wurde geändert von: psiefke am 13 Jul 2007 12:25 ]

BID = 442563

kolbenquaeler

Gerade angekommen


Beiträge: 12

Ups, bin offensichtlich sogar zum Verlinken zu doof, für alle Nicht-Informatiker (was auch immer die mit diesem Text anfangen mögen) hier noch mal der funktionierende Link:

http://www.x86.org/articles/pmbasics/tspec_a1_doc.htm

BID = 443064

Kurzschlus

Gesprächig



Beiträge: 192
Wohnort: Magdeburg

IRQ 9 wird von der PC-Hardware auf IRQ 2 umgeleitet.

BID = 443065

Kurzschlus

Gesprächig



Beiträge: 192
Wohnort: Magdeburg

Und diese PCI-Hardware loest dann noch einen anderen IRQ aus, der die eigentliche Verarbeitung im PM veranlasst. Oder so aehnlich, schon lange her, dass ich mich damit befasst habe.

BID = 443647

langesOhr

Gelegenheitsposter



Beiträge: 67

Hallo,

ich habe inzwischen etwas experimentiert. Mittlerweile kann ich eine
IDT aufsetzen, so dass bei einem IRQ0 (Clock tick) ein 32-Bit-Handler
aufgerufen wird und das Hauptprogramm nach dem Zurücksetzen des
Interruptcontrollers fortsetzt. Auch kurzfristiges Zurückschalten in
den Real Mode während des Interrupt-Handlers funktioniert - aber leider
stürzt mein Testprogramm sofort ab, wenn ich versuche, den alten
Interrupt-Handler aus dem BIOS via PUSHF/CALL FAR nachzustarten. Nach
den Informationsstückchen, die ich aus Google holen konnte, sollen
diese Handler im V86-Mode ausgeführt werden. Leider scheint dafür ein
TSS (Task switch segment) notwendig zu sein. Wie man das richtig
aufsetzt und was die CPU damit macht, steht leider nirgends

@kolbenquaeler: Den Link kannte ich bereits, aber danke für den
Versuch zu helfen.

Mit ratlosem Gruss

das lange Ohr

BID = 444275

langesOhr

Gelegenheitsposter



Beiträge: 67

Hallo,

ich habe das Problem mit den Hardware-Interrupts jetzt (fast) gelöst

Mein Testprogramm erstellt eine IDT für die Interrupts 00-0F; trifft ein IRQ ein, so sichert der
Handler (im 16-Bit Protected-Mode) zunächst ALLE Prozessorregister auf dem Stapel und schaltet
im Real Mode sofort auf einen privaten Stapel um. Dann lässt sich sogar die BIOS-ISR nachstarten
*total freu*. Kommt das BIOS zurück, so lädt der Handler nach CLI zunächst GDT und IDT neu und
schaltet wieder in den Protected Mode. Schliesslich werden SS:ESP wieder restauriert und alle
Register zurückgeholt.
Mein Fehler war bisher, dass mein Real-Mode-Handler zwar die Segmentregister erhalten hat - aber
eben die CPU beim Zurückschalten in den PM die zugehörigen Deskriptoren für DS-GS nicht
selbständig geladen hat. Deshalb müssen alle Segmentregister restauriert werden, *nachdem* der
Prozessor wieder im PM ist. Leider steht das nirgends...

Ein letztes Problem habe ich noch: Dieses Verfahren (entspricht dem von Windows 3.0 im Standard-
Modus) funktioniert wunderbar, solange das jeweilige Hauptprogramm ein 16-Bit-Codesegment
ausführt. Während 32-Bit-Code läuft, steht in meiner IDT aber immer noch der 16-Bit
Gatedeskriptor... Mit dem Ergebnis, dass der Handler beim IRET das
CS mit der oberen Hälfte von EIP lädt und dann

Weiss jemand, wie man einen 16-Bit-Interrupthandler im Protected-Mode so aufsetzt, dass er
sowohl Interrupts aus einem 16-Bit-Codesegment als auch einem 32-Bit-Codesegment abarbeiten
kann? Ich könnte ja theoretisch den CS-Selektor auf dem Stapel auslesen und in der GDT
nachschauen, ob es sich um ein 32-Bit-Segment handelt, aber dafür müsste ich ja zumindest
wissen, ob EIP 16 oder 32 Bit breit ist?

Mit freundlichen Grüssen

das lange Ohr (das immer noch im Nebel stochert...)


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 17 Beiträge im Durchschnitt pro Tag       heute wurden bisher 7 Beiträge verfasst
© x sparkkelsputz        Besucher : 188003018   Heute : 7037    Gestern : 15227    Online : 258        29.12.2025    20:13
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0378789901733