Wie 'ersetzt' ein OS den Standard VGA Treiber?
-
Bei einem 'gewöhnlichen' x86er kurz nach dem POST und knapp vor dem Laden des Inhalts des MBR durch das BIOS ist offensichtlich schon ein VGA-Treiber für die (elementare) Grafikausgabe vorhanden (gar als Hardware eingebaut ??).
Bevor das OS gestartet wird, reagiert das BIOS wie es scheint auf Interrupts dadurch, dass es irgend eine 'vorinstallierte' Treiberfunktion als Interruptbehandlungsroutine betrachtet.Wenn jetzt ein 'modernes' OS gestartet wird, habe ich mich gefragt, wie das Betriebssystem es anstellt, den 'vorinstallierten' VGA-Treiber, der scheinbar schon immer dabei ist, durch andere Treiber quasi zu 'ersetzen'.
Irgendwo führt doch das BIOS gewiss eine Aufzeichnung darüber, welche Routine im Falle eines Hardwareinterrupts angesteuert werden soll. Überschreibt das Betriebssystem kurzerhand die Adresse der 'voreingestellten' Behandlungsroutine durch die Adresse des neuen Treibers bzw. die Adresse einer von diesem Treiber bereitgestellten Funktion? (Was dann das BIOS wohl dazu veranlassen würde, zur Adresse der 'neuen' Treiberfunktion zu springen, um einen Interrupt behandeln zu lassen).
-
Narrensicher schrieb:
Bevor das OS gestartet wird, reagiert das BIOS wie es scheint auf Interrupts dadurch, dass es irgend eine 'vorinstallierte' Treiberfunktion als Interruptbehandlungsroutine betrachtet.
Jein. Die CPU reagiert auf Interrupts, nicht das BIOS. Ein Interrupt führt grob gesagt dazu, dass die entsprechende Interrupt-Routine angesprungen wird, und das ist anfangs in der Tat eine Routine des BIOS. Was nicht heißt, dass man das nicht umbiegen kann, das ist einfach nur ein Far-Pointer in der Interruptvektortabelle.
Wenn jetzt ein 'modernes' OS gestartet wird, habe ich mich gefragt, wie das Betriebssystem es anstellt, den 'vorinstallierten' VGA-Treiber, der scheinbar schon immer dabei ist, durch andere Treiber quasi zu 'ersetzen'.
Da sind zwei Punkte zu beachten. Einerseits kann man diese Routinen wie gesagt ohne weiteres umbiegen. Andererseits arbeitet die CPU nach dem Reset im Real Mode, jedes "moderne" OS schaltet die CPU aber relativ schnell in den Protected Mode, in dem die Interrupt-Behandlung aber sowieso etwas anders funktioniert, und das "klassische" BIOS gar nicht lauffähig ist (da mag sich in den letzten 10 Jahren einiges verändert haben
)
-
Bashar schrieb:
Interruptvektortabelle.
Jetzt klingelt's! Diese Interruptvektortabelle - die ist doch 'hardware-seitig' implementiert? Steht also nicht irgendwo im tatsächlichen oder virtuellen Speicher. Die Tabelle selbst lässt sich doch nicht 'überschreiben'? Doch hoffentlich nur jener Bereich im Speicher, auf den die Zeiger in dieser Tabelle zeigen? Sonst könnte womöglich software-seitig grober Schaden angerichtet werden, wenn diese Tabelle einfach überschreibbar wäre.
Ich bleib ohnehin erstmal im Real Mode, vom Protected Mode hört man ja Schauermärchen, dass man sich womöglich um alle Interrupthandler selber kümmern muss und dergleichen.Erstmal danke für die Orientierung
-
Narrensicher schrieb:
Jetzt klingelt's! Diese Interruptvektortabelle - die ist doch 'hardware-seitig' implementiert? Steht also nicht irgendwo im tatsächlichen oder virtuellen Speicher.
Doch, im Real-Mode ab Adresse 0:0, im Protected-Mode gibts irgendein Register dafür, damit kenn ich mich nicht so aus.
Die Tabelle selbst lässt sich doch nicht 'überschreiben'? Doch hoffentlich nur jener Bereich im Speicher, auf den die Zeiger in dieser Tabelle zeigen? Sonst könnte womöglich software-seitig grober Schaden angerichtet werden, wenn diese Tabelle einfach überschreibbar wäre.
Doch, die ist im Real-Mode genauso beschreibbar wie alles andere.
-
Im Protcted-Mode gibt es die Interrupt Descriptor Table (IDT). Das passende Register welches den Descriptor beinhaltet heißt IDTR und ist afaik 48 Bit (ab 386er) breit. In der IDT gibts es dann für jede/n Interrupt, Exception, IRQ einen 4 Byte langen Eintrag, der die Adresse des Interrupt-Handlers enthält. Für genaueres solltest du dir aber lieber ein Protected-Mode Tutorial anschauen (z.B. FH Zwickau PMode Tutorial).