Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: neq 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)
-
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
-
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 ?
-
schon gut die frage mit dem resource center hat sich erledigt *schämfürdummheit*
-
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
-
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.
-
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.
-
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
-
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.
-
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.
-
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.