#1 23.01.2009 18:30:48

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

CGA/VGA im eigenen Betriebssystem

Ich war mir nicht sicher wohin und habe deshalb die "..." frei interpretiert.

Ich fange mal mit 4 Bildern an (sortiert von 1 nach 4 wink ):
[Bild entfernt]
angestellter Grafikmodus (ueber Register)


[Bild entfernt]
nach Wechsel in Textmodus


[Bild entfernt]
Grafikmodus per "int" 10h angestellt und dann in Textmodus gewechselt


[Bild entfernt]
die ganze Zeit im Textmodus

So, nach den Bilder etwas Informationen:
Ich schreibe ein eigenes Betriebssystem (praktische Übung für "Betriebssysteme") und gehe über das von der Uni hinaus. Nun wollte ich während mein Betriebssystem läuft in den Grafikmodus wechseln. Die Tutorials im Internet nutzen (soweit ich sie finden konnte) alle die Bios-Interrupts. Das ist bei mir jedoch nicht moeglich, da die Bios-Interrupts nur im Real-Mode (16Bit) existieren, mein Betriebssystem aber im Protected-Mode (32Bit, MMU, ...) läuft. Folglich bleibt mir nur der Weg über die Register (z.B. http://www.osdever.net/FreeVGA/vga/graphreg.htm, http://www.osdever.net/FreeVGA/vga/crtcreg.htm).
Also habe ich danach gesucht und ein paar Quellcode-Beispiele gefunden (z.B. http://bos.asmhackers.net/docs/vga_with … 20bios.htm). Mit Hilfe dessen kann ich in den Grafikmodus während des Protected-Mode gelangen.
Soweit so gut, Bild 1 zeigt das Resultat (da gehe ich die von mir definierten Farben alle durch). Der gewählte Modus soll übrigends 13h, also 320x200 Pixel bei 256 Farben sein (anderes ist noch nicht geplant).
Jedoch wollte ich nun auch wieder zurück und da fängt das Problem an. Mittlerweile bin ich so weit, dass er "nur noch" einen schwarzen Bildschirm bei richtiger Breite und Höhe anzeigt (Bild 2). Geschafft habe ich dies, indem ich die veränderten Register gesichert habe (und ausgegeben, siehe Bild 4), per Code die Werte gespeichert und dann wieder zugewiesen habe.
Bin ich im Grafikmodus und  versuche dahin zu wechseln, passiert nichts. Versuche ich aus dem "eigenen" Grafikmodus dahin zu wechseln, so kommt der schwarze Bildschirm, mit Ausnahme des Cursors (der an der richtigen Position ist). Auch sehe ich, dass das BS noch das macht, was es soll (starte ich Programme springt der Cursor zu den richtigen Stellen). Der Cursor hat mittlerweile auch die richtige Farbe.
Wenn ich vor dem Umschalten in den Protected-Mode im Bootloader per BIOS-Interrupt in den Grafikmodus (13h) wechsle, dann sieht das genauso wie in meinem aus. Schalte ich dann jedoch den Grafikmodus aus, so erhalte ich Bild 3, was zeigt, dass die Grafikmodi nicht gleich sind. Das Problem könnte ich beheben, indem ich mit den int 10h Werten genau verfahre wie mit den Konsolenwerten und diese Werte dann zum Moduswechsel nutze (dann benötige ich auch nur eine Funktion).

Meine Frage ist nun, wie ich korrekt in den Text-Modus zurück komme (und eine ordentliche Erklärung wäre ich auch nicht abgeneigt, auch wenn es kein muss ist wink ).
Ich habe es auch schon mit den Werten von http://wiki.osdev.org/VGA_Hardware#List … r_settings versucht, doch das brachte erst Recht nichts, da waren beide Modi (Text + Grafik) fehlerhaft.

Danke im Voraus!

LOTIPATS

EDIT:
Ich gebe hier mal die ganze C++-Datei an:
EDIT2: Quellcode entfernt
EDIT3: Bilder entfernt

Beitrag geändert von Lotipats (30.08.2012 13:57:27)

Offline

 

#2 03.09.2009 23:12:22

TheDon
Member
Registriert: 14.01.2006
Beiträge: 32

Re: CGA/VGA im eigenen Betriebssystem

Hallo,

sehr spät aber doch eine Antwort. Ich zähle michn nicht zu den Systemprogrammierern darum kann ich dir jetzt mal keine praktischen Tipps geben. Aber du kannst dir mal den Linux Kernelsourcecode (http://www.kernel.org) runterladen und nachsehen wie der Framebuffer-Kerneltreiber (VESA) das macht.

mfg
TheDon


TheDon

Offline

 

#3 04.09.2009 07:38:47

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: CGA/VGA im eigenen Betriebssystem

Das Problem ist, der Linux-Kernel ist nicht gerade klein, da muss man sich erst einmal durch finden. Auch wollte ich nicht in einen VESA-Modus gehen, da dort auch noch einmal mehr Arbeit ist, auch fuer die Ausgabe. Weiterhin ist VESA nicht gleich VESA, das hängt vom Hersteller ab. Ich müsste dann also, wie es wohl auch der Linux-Kernel macht (man beachte die ganzen Treiber unter drivers\video) für jeden einen eigenen Treiber erstellen.
Das, was ich auf Anhieb von VGA gefunden habe, ist fuer den Realmode. Für VESA habe ich auch eine Text-Daten zur Erklaerung gefunden (also in den Kernel-Quelltexten):"Switching mode later on (in protected mode) is impossible; BIOS calls work in real mode only." sad

Aber dennoch danke für die Antwort. Jetzt weiß ich auch, dass ich u.U. Treiber-schreib-Erklärungs-Dateien im Kernel-Quelltext finden kann. smile

LOTIPATS

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson