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