Autor Thema: VESA Bios Extensions  (Gelesen 18872 mal)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 03. February 2013, 15:00 »
Hallo,

Was ist, wenn man statt einem BIOS UEFI hat? Funktioniert das dann auch noch?
Ein normales System-BIOS enthält maximal Treiber für MDA (Text, 720x350) und CGA (max. 640x200). Alles höhere, einschließlich der VESA BIOS Extensions, liefert die Grafikkarte in ihrem Video-ROM mit. Wenn dein UEFI also noch ein BIOS emuliert, sollte es gehen.

In einem reinen UEFI-System benutzt du allerdings den Treiber der Firmware. Der benutzt keinen Real Mode-Code mehr.

Was ist mit anderen Auflösungen, als denen, die in der Liste stehen? Wie ist es überhaupt möglich, z.B. 1920x1080 Pixel darzustellen?
Andere Auflösungen, als in der Liste stehen, funktionieren nicht. Allerdings verbietet dem Hersteller niemand, 1920x1080 in die Liste zu schreiben... gelegentlich wird das angeboten.

Wie kann man, falls vorhanden, eine Grafikkarte dazu ausnutzen, die Pixel zu berechnen?
Nicht mit einem VESA-Treiber. Du kannst die Ausgabe allerdings beschleunigen, wenn du eine Kopie des Framebuffers im RAM hältst und nur die Teile, die sich geändert haben, in die Grafikkarte schreibst ("ShadowFB").

@Martin Erhardt: Du musst keinen Link auf die PM-Inbox setzen. Man sieht oben im Forum, ob da eine neue Nachricht angekommen ist oder nicht.

Gruß,
Svenska
« Letzte Änderung: 03. February 2013, 15:02 von Svenska »

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 03. February 2013, 16:36 »
@Svenska: Ich wusste das da noch nicht und hab daher gar nicht auf "Meine Mitteilungen" geachtet, daher hat er mir das verlinkt ^^ Ist mein Fehler^^

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 08. February 2013, 22:34 »
Hmmm... ich suche also nach der Adresse des LFB, wenn ich das richtig verstanden habe, und muss dafür in den vm86... brauch ich dafür assembler oder reicht C?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 09. February 2013, 00:19 »
Wenn du es in C schaffst, korrekten 16-Bit-Code für den VM86 zu erzeugen (also den Interrupt auszulösen und die Daten einzusammeln), dann reicht auch C. Ob es das wert ist, kann ich nicht einschätzen.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 09. February 2013, 12:15 »
Ja, ich glaube, das ist es :) Danke. Ich versuchs.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 09. February 2013, 17:08 »
Bin ich doof? "Die Funktionsnummer wird in AX übergeben".

Was ist denn bitte AX?

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 09. February 2013, 17:31 »
Was ist denn bitte AX?
Die letzten 16 bit von EAX
Ich habs auch schon vergessen :oops: :
http://forum.lowlevel.eu/index.php?topic=3166.msg36761#msg36761
« Letzte Änderung: 09. February 2013, 17:35 von Martin Erhardt »

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 09. February 2013, 17:39 »
Okay, hm, und wie "übergebe" ich etwas in AX? Ich dachte so: outb(???, FUNKTIONSNUMMER); ...

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 09. February 2013, 18:11 »
Konkret bei den VBEs
/*
 * BLABLA BLa werte in dx di usw. verschieben
*/
mov funktionsnummer, %%ax
int 0x10
« Letzte Änderung: 09. February 2013, 18:23 von Martin Erhardt »

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 09. February 2013, 18:24 »
Svenska meint, es reicht auch C...

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 09. February 2013, 18:28 »
C ist schön aber bei den VBEs wird im Realmode die Funktionsnummer in AX verschoben und über SW Interrupt 0x10 das BIOS aufgerufen das geht nu ma so ganz explizit  nur in ASM.  In C kann man ohne inline ASM oder Intrinsics (im Userland) keine interrupts auslösen und zeug nach AX verschieben sprich: es läuft auf das gleiche raus.
« Letzte Änderung: 09. February 2013, 18:31 von Martin Erhardt »

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 09. February 2013, 18:33 »
Ja also sowas asm volatile("int $0xa");oder?

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 09. February 2013, 18:36 »
0xA ist aber Interrupt 11 wir wollen Interrupt 16 bzw 0x10 steht jedenfalls im Wiki ... .
Verwende lieber Assembler für VM86 du machst sowieso alles in ASM oder inline ASM und sonst KANNST du gar nichts anderes machen mit C in VM86 weil gcc sich auf den 32bit Registersatz verlässt und daher an dieser stelle invalid opcode erzeugt. Du müsstest dieses zeug in ein Bootmodul auslagern das du mit bcc kompilierst und das ist es definitiv nicht wert.

Ich hoffe ich konnte zur Abwechslung mal wirklich helfen.
« Letzte Änderung: 09. February 2013, 18:41 von Martin Erhardt »

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 09. February 2013, 23:22 »
Ich mach es jetzt in ASM.

Also nochmal zusammenfassend: Folgende Informationen habe ich:

Zitat
Informationen zu einem Grafikmodus: 4F01h
Man durchläuft also die obige Liste der unterstützten Modi und prüft dann mit folgender Funktion, welche Eigenschaften der entsprechende Grafikmodus besitzt:
AX = 4F01h
CX = Nummer des Grafikmodus

Außerdem soll der Interrupt 0x10 aufgerufen werden, um die Funktion aufzurufen.

Ich mach also das, bevor es in den Protected Mode geht:
mov 0x4f01, %ax
mov 1, %cx
int $0x10 //<- Warum "$"? Anders compilert es nicht...

Naja, es passiert eigentlich etwas ganz logisches: Es erscheint mein "Bluescreen", weil er denkt, Interrupt 0x10 wäre die Exception Nummer 16...
Also was mach ich falsch?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 09. February 2013, 23:50 »
Ohne $ wird das ein Speicherzugriff. Das heißt, deine ersten beiden Zeilen tun nicht das, was du denkst, weil das $-Zeichen vor den Zahlen fehlt und sie Speicher auslesen. Dein Handler für die Exception wird aufgerufen, weil du nicht in den VM86 wechselst, sondern immer noch im Protected Mode bist. Selbst wenn du irgendwie in den VM86 wechselst, kannst du nicht einfach so beliebigen Assemblercode ausführen. Ich glaube in diesem Thread wird das ganze so dargestellt, als müsstest du nur ein, zwei Kleinigkeiten machen und schon kannst du den Grafikmodus setzen. Das ist nicht der Fall. VM86 ist relativ kompliziert, und ich würde dir raten, erstmal ohne Grafik auszukommen.

Dieser Text wird unter jedem Beitrag angezeigt.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 09. February 2013, 23:55 »
Ohne Grafik funktioniert ja schon alles Problemlos...

Ich hab das so verstanden, dass ich mir auch die Adresse des LFB besorgen kann, BEFOR ich in den Protected Mode wechsle... Insgesamt sieht das nämlich so aus:

_start:
    // Stack initialisieren
    mov $kernel_stack, %esp

call init_gdt
call init_intr

// VESA
mov $0x4f01, %ax
mov $1, %cx
int $0x10
call init_vesa

//protected mode
mov %cr0, %eax
or %eax, 1
mov %eax, %cr0

    // C-Code aufrufen
    call init
 
    // Falls wir jemals aus init zurueckkommen sollten, sperren wir die Interrupts und
    // halten einfach den Prozessor an. (man braucht ihn ja nicht unnötig heißlaufen lassen.)
_stop:
    cli
    hlt
 
    // Sollte es doch weitergehen, probieren wir erneut die CPU schlafen zu lassen
    jmp _stop

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 09. February 2013, 23:58 »
Wenn du dein System mit einem Multiboot-Bootloader lädst, bist du bereits im Protected Mode. Die Zeilen, die den Protected Mode aktivieren sind also wirkungslos.
Dieser Text wird unter jedem Beitrag angezeigt.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 10. February 2013, 01:59 »
Svenska meint, es reicht auch C...
Nein, meinte ich nicht. Ich schrieb, wenn du es schaffst, das in C hinzukriegen. Ich wüsste nicht, wie.

Lerne die Grundlagen. Bitte.

KtmnjjpfjsFvzG

  • Beiträge: 111
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 10. February 2013, 11:43 »
OK also ich schaffs nicht, das in C hinzukriegen.

Ich bin doch grad dabei, die Grundlagen zu lernen ^^!

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 10. February 2013, 14:08 »
Hallo,

du schreibst gerade ein OS und lernst die notwendigen Grundlagen quasi nebenbei. Ich vermute aber, dass dir der Blick aufs Ganze fehlt, du dir also nur das zusammenstückelst, was du gerade brauchst. Das ist dann weniger schön, irgendwann wirst du es brauchen. :-)
Wenn einem Wissen fehlt, kann man es nachschlagen. Wenn man aber nichtmal weiß, wo einem Wissen fehlt, wird das mit dem Nachschlagen sehr viel schwieriger (siehe die Frage mit dem Doppelpunkt). Dafür braucht es einen Überblick und den findet man in Büchern, die alle Themen mal anfassen und dabei nichts auslassen. Wikis und Tutorials sind gute Nachschlagewerke und Anleitungen, wenn man grob weiß, was man suchen muss.

Du wirst in deinem Betriebssystem ohne Assembler nicht auskommen, auch wenn du nicht viel davon benutzen wirst. Gehe mal in deine örtliche (Uni-/FH-/Stadt-)Bibliothek und suche dir ein Buch zum Thema x86-Architektur und -Assembler aus. Du musst es weder aufessen noch vollständig wochenlang durcharbeiten, aber wenn du da durch bist, wird dir einiges viel klarer sein als vorher.

Gruß,
Svenska

 

Einloggen