Autor Thema: osloader mit protected mode und vga  (Gelesen 6137 mal)

neq

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« am: 01. March 2004, 18:35 »
Also ich bin ein programmierer und deshalb auch ein ziemlich faules stück das das rad nicht gern neu erfindet :)

ich wollte mal wissen ob jemand einen guten Code zum Laden eines einfachen 32Bit C-Kernels hat.

ich brauche einen der automatisch in den Protected Mode wechselt und einen Grafikmodus lädt. Ich glaub der entsprechende Standart heisst VGA (vielleicht wars auch SVGA oder so). Ich meine so einen standart, wo ich ne auflösung von 800x600x32 laden kann.

das würde mir (und bestimmt vielen anderen, die an GUIs interesse haben) viel helfen.

um ehrlich zu sein hab ich es noch nie wirklich geschafft stabil in den protected Mode zu wechseln und erst recht nicht mit anschlissenden grafikmodus wechsel.

(und ich habs wirklich wochenlang versucht)

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #1 am: 01. March 2004, 19:47 »
Ist zwar noch ziemlich in der Entwicklung. Jedoch schaltet es schonmal in den PMode.

Grafikmodus musst du aber selbst noch schalten lassen.

Einen Bootloader hab ich weiter oben auch gepostet.
Dieser läd dir zumindest eine binäre Datei in den Speicher. Dieser Datei muss aber selbst noch Code enthalten die in den PMode schaltet.

Dazu kannst du Ansatzweise diesen hier benutzen.
Der ist aber noch nicht ausgereift und ich empfehle es auch nicht umbedingt diesen 1 zu 1 zu kopieren.

Wenn der Code mal fertig ist, wird er im Resource-Center gepostet.

[BITS 16]
    jmp        start
   
gdt_null:
    dw        0
    dw        0
    dw        0
    dw        0
   
gdt_code:
    dw        0xFFFF        ;Segmentgröße Byte 0/1
    dw        0            ;Segmentbasisadresse Byte 0/1
    db        0            ;Segmentbasisadresse Byte 2
    db        10011010b    ;Zugriffsberechtigungen
    db        11001111b    ;Zusatz + Segmentgröße Bits 16 - 19
    db        0            ;Segmentbasisadresse Byte 3
   

gdt_data:
    dw        0xFFFF
    dw        0
    db        0    
    db        10010010b
    db        11001111b
    db        0

gdt_end:    

gdt:
Limit    dw    0
Base    dd    0


start:
   
    cli

    mov        ax, 0x1000
    mov        ds, ax
    mov        es, ax
   
    mov        ax, cs
    and        eax, 0xFFFF
       
    shl        eax, 4            ;Physikalische Startadresse der GDT errechnen
    add        eax, gdt_null
    mov        [Base], eax
   
    mov        ax, cs
    and        eax, 0xFFFF
    shl        eax, 4
    mov        WORD [gdt_code+2], ax
    shr        eax, 16
    mov        BYTE [gdt_code+4], al
   
    mov        WORD [Limit], gdt_end - gdt_null
   
    lgdt    [gdt]
   
    mov        eax, cr0
    or        eax, 1
    mov        cr0, eax
   
    mov        eax, 0x10
    mov        ds, ax
    mov        ss, ax
    mov        es, ax
       
    db        0xea
    dw        PMODE
    dw        08h
   

[BITS 32]
extern    _main

global  _EnableA20Gate

;#######################################################################

PMODE:
    mov        esp, 0xFFFF
       
    jmp        PMODE
   
sti


;#######################################################################

_EnableA20Gate:
    cli
    push    ecx

.0:
    mov        ecx, 5
   
.1:
    mov        eax, 0
    in        al, 64h
    test    al, 00000001b
    je        .1
   
    mov        al, 0xD0
    out        64h, al
   
.2:
    mov        eax, 0
    in        al, 64h
    test    al, 00000001b
    jne        .2
   
    mov        eax, 0
    in        al, 60h
   
    push    eax

.3:
    mov        eax, 0
    in        al, 64h
    test    al, 00000001b
    je        .3
   
    mov        al, 0xD1
    out        64h, al
   
.4:    
    mov        eax, 0
    in        al, 64h
    test    al, 00000001b
    je        .4
   
    pop        eax
   
    or        al, 00000010b
    out        60h, al
   
.5:
    mov        eax, 0
    in        al, 64h
    test    al, 00000001b
    je        .5
   
    mov        al, 0xD0
    out        64h, al
   
.6:
    mov    eax, 0
    in        al, 64h
    test    al, 00000001b
    je        .6
   
    mov        eax, 0
    in        al, 60h
   
    test    al, 00000001b
    je        .Enabled
   
    loop    .0
   
.Failed:
    sti
    pop        ecx
    mov        eax, 0
    ret
   
.Enabled:
    sti
    pop        ecx
    mov        eax, 1
    ret

----------------------
Redakteur bei LowLevel

neq

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. March 2004, 22:35 »
oh ja der ansatz sieht ganz gut aus, danke.

werde mich damit morgen mal beschäftigen ...

wenn ich damit fortschritte gemacht hab, werd ich hier mal posten wies weiter geht ....

was is eigentlich dieser resource center ?

neq

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. March 2004, 22:44 »
schon gut die frage mit dem resource center hat sich erledigt *schämfürdummheit*

svler

  • Beiträge: 18
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. March 2004, 14:35 »
Hi,

ich bin neu hier. Den Quellcode oben hab ich 1:1 übernommen und er läuft prächtig. Leider hab ich keine Ahnung wie man im VESA Mode gemäß fogendem Code gesetzt...:

mov ax, 0x4F02
mov bx, 0x0101
int 10h

...Pixel am Bildschirm ausgibt. Wäre toll wenn ihr mir da helfen könntet. Ich möcht eaber nicht mit dem Mode 12h vom Interupt 10h arbeiten.

Gruß svler

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #5 am: 06. March 2004, 15:06 »
Im Real-Mode schreibst du dazu in das Segment 0xA000. Da dieses nur 64 KB groß ist muss du mit der Vesa-Funktion 5 das Speicherfenster öfters wechseln (je nachdem, an welcher Stelle du das Bild verändern möchtest):
dx = Fenster
bx = 0
ax = 0x4F05
int 0x10
Im PMode kannst du linear schreiben: Die Adresse bokommst du mit der Vesa-Funktion 1 heraus.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #6 am: 06. March 2004, 15:39 »
Im PMode ist die Adresse für Farbbildschrime standardmäßig bei 0xB8000.

Der obere Code enthält aber kleine Fehler. Eine besser Version davon gibts mit dem PMode Tut.
----------------------
Redakteur bei LowLevel

svler

  • Beiträge: 18
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 07. March 2004, 15:28 »
Hi,

ich fange an langsam alles zu verstehen. Könnte mir vieleicht jemand eine kleine Funktion in ASM (versteht sich) schreiben die mir ein Pixel am Bildschirm ausgibt. Ich würde da gerne im VESA Mode 0101h arbeiten. Wenn mir dann noch jemand erklären könnte wie ich im PMode die Funktion 4F0A (Get Protected Mode Interface) von int10h nutzen kann wäre ich überglücklich. Ich danke schon mal im voraus!!!

Gruß svler

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #8 am: 07. March 2004, 17:26 »
Also soweit ich weiß kannst du vom Pmode nur auf die VESA Ints zugreifen sofern du einen V86-Mode Task laufen lässt. Sprich eine Emulation des Real-Mode innerhalb des Protected Mode.

Mit VBE3 soll man auch vom Protected Mode direkt die ganzen Auflösungen usw ändern können ohne den V86 Mode. Allerdings muß das wiederum das BIOS der Grafikkarte unterstützen und wie ich aus anderen Foren lesen musste gibts kaum Karten die das unterstützen.
Von daher kann ich dir hier noch nicht helfen, weil ich mich damit noch nicht beschäftigt habe, da es zu jetzigem Zeitpunkt noch keinen Sinn macht.
----------------------
Redakteur bei LowLevel

svler

  • Beiträge: 18
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 08. March 2004, 07:34 »
OK danke,

aber könntest du mir mal ein kleinen beipiel code schreiben wie ich das pixel male? Und vielleicht auch wie ich vom PMode in den V86 oder Real Mode wechsle.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #10 am: 08. March 2004, 16:59 »
Also Pixel malen sollte recht einfach sein. Wie auch im Text-Mode kannst du auch in einem Grafikmode direkt in den Videospeicher schreiben. Der sollte soweit ich weiß ebenfalls bei 0xB8000 beginnen. Und da kommt es dann darauf an was für ein Modus du benutzt. Wenn du 1 Byte für die Farbe hast, dann hat jeder Pixel ein Byte, das du auf einen Farbwert setzen musst.

Beispielcode kann ich dir dafür hier nicht geben, weil ich das selbst noch nicht gemacht habe, da ich dazu noch keine Zeit hatte und es auch das LowLevel Magazin "noch" nicht erfordert.


Dafür ist aber das nächste Tutorial so gut wie fertig. Dieses beschreibt wie man einen C-Kernel zum laufen bekommt. Das wird entweder in der nächsten LowLevel Ausgabe veröffentlicht, oder falls dort kein Platz mehr ist (PMode Tut hat allein 37 Seiten) werde ich es extra veröffentlichen.
----------------------
Redakteur bei LowLevel

 

Einloggen