Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Spiderschwein13 am 21. June 2009, 21:16
-
hey Leute,
nach einer langen Pause mach ich jetzt mit meinem Kumpel wieder an unserem kleinen OS weiter...
Zur Zeit sind wir dabei, den VESA Modus über das Bios zu initialisieren (RM)... das ganze machn wir per inline-ASM, allerdings bringt der gcc-compiler folgende Fehlermeldung:
C:\DOKUME~1\Familie\LOKALE~1\Temp\ccRwH4rZ.s: Assembler messages:
C:\DOKUME~1\Familie\LOKALE~1\Temp\ccRwH4rZ.s:21: Error: junk `00h' after express
ion
Parameter für gcc
gcc -masm=intel -m32 -ffreestanding -o C:\IUse\tmp\main.o -c main.c -Werror -nostdinc
Wir entwickeln jetzt unter Windoof, unter Linux kommt aber der selbe Fehler..........
Hier unser Code....
int main(){
//Die folgende Funktion switcht in den RM
asm("cli\n\t"
"mov eax,cr0\n\t"
"and al,not 1\n\t"
"mov cr0,eax\n\t"
"sti\n\t");
//Initialisiere VESA
asm("push ax\n\t"
"push bx\n\t"
"mov ax, 4f00h\n\t" <-------- Die Anweisung macht nen Error :(
"mov bx, 0x7e0\n\t"
"mov es, bx\n\t"
"mov di, 0x0\n\t"
"int 0x10\n\t"
"cmp ax, 0x004f\n\t"
"jne .1\n\t"
"mov bx, 0x7e0\n\t"
"mov es, bx\n\t"
"mov di, 0x0\n\t"
"mov ax, [es:di+4]\n\t"
"mov ax, 0x4f01\n\t"
"mov di, 0x0\n\t"
"mov bx, 0x800\n\t"
"mov es, bx\n\t"
"mov cx, 0x0115\n\t"
"int 0x10\n\t"
"mov ax, 0x4f02\n\t"
"mov bx, 0x4115\n\t"
"int 0x10\n\t"
"cmp ax, 0x004f\n\t"
"je .3\n\t"
".1:\n\t"
".2:\n\t"
"jmp .2\n\t"
".3:\n\t"
"pop bx\n\t"
"pop ax\n\t"
"ret\n\t");
// ".1:\n\t" Dannach kommt eigtl eine Instruktion was er machen soll, wenns schiefgeht ...
}
-
Hey, ich bin der 2.te Programmierer bei unserem OS...
Hier noch ein paar Zusatz-Infos:
Das ganze OS wird vom Grub geladen, weshalb es schon im PM ist.
Neben dem obigen Code, haben wir noch folgendes in ASM (welches den C-Kernel laedt- das ganze wird mit ld gelinkt):
global loader
extern main
FLAGS equ 0
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .text
align 4
MultiBootHeader:
dd MAGIC
dd FLAGS
dd CHECKSUM
loader:
mov esp,0x200000
push eax
push ebx
call main
cli
hlt
Mit dem Code im Kenrel
asm("cli\n\t"
"mov eax,cr0\n\t"
"and al,not 1\n\t"
"mov cr0,eax\n\t"
"sti\n\t");
deaktivieren wir das 0-bit (das Protected-Mode-Enable-Bit (PE)) im Register 0 um in den Real Mode zu kommen. Ist das so ausreichend ?
-
Zur Zeit sind wir dabei, den VESA Modus über das Bios zu initialisieren (RM)...
Ich wüsste nicht, dass man VESA per BIOS initialisiert, auser du meinst da VBE!
-
"mov ax, 4f00h\n\t" <-------- Die Anweisung macht nen Error :(
gcc/gas kennt die hex-Schreibweise ??h nicht. das Problem sollte damit gelöst werden können die Schreibweise an die im restlichen Quelltext anzupassen.
-
Hey ...
Aber ich habe extra -masm=intel als Parameter gewaehlt um die Intel-ASM-
Syntax zu nutzen ... Deshalb sollte es doch auch mit hex funktionieren ...
Oder etwa nicht ?
Ja, spiderschwein hat die Vesa Bios Extension (VBE) gemeint.
Wie muss die Adresse sonst heisen (ohne 00h) ?
-
Selbst wenn es gehen würde, wäre das die einzige Konstante mit h statt 0x. Das schaut ja nich aus ^^
0x4f00
-
kk .. mal mit 0x004f probieren ... :)
doch nicht 0x4f00 .. oder ?
Vesa INT 10 ist 0x004f
-
Eine Sekunde zu langsam ... 0x4f00 nicht 0x004f
-
Vesa INT 10 ist 0x004f
-> http://www.ctyme.com/intr/rb-0273.htm
Es ist 4f00h = 0x4f00
-
http://wiki.osdev.org/Getting_VBE_Mode_Info
INT 0x10, AX=0x4F00
-
Zur Korrektheit von -masm=dialect - Hab grad mal ins gcc-manual gesehen (http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options), soweit ich das verstehe kontrolliert die Option was für code der gcc ausgibt - nicht was mit dem vorhandenen Inline-ASM geschieht.
Weitere Empfehlungen,
a) Bitte nicht mit Grafik anfangen. Das wird nix.
b) Wenn schon Grafik so früh sein muss aber eh grub verwendet wird - man kann die vbe-modes schon via grub setzen lassen und inner Multiboot übergeben bekommen
c) um solche Sprünge möglichst zu vermeiden wurde vm86 entwickelt - verwenden, dann ersparst du dir auch die PM-Wiederaktivierung
Mal so btw, kommt man wirklich so einfach bis innen RM runter, oder was passiert da?
-
Ja, der Code zum RM-Switchen ist zwar nicht sonderlich "robust",
aber es funktioniert :)
Hmm ...
Wir fahren ja mehrgleisig ...
Ich versuche z.B. Memory-Managment und die CDI u implementieren ;)
(Der Code oben ist natuerlich noch laengst nicht alles, sondern nur ne art Experiment fuer VESA ;) )
-
Wenn sowieso CDI eingebaut werden soll, würde ich vm86 stark empfehlen - ich experimentier momentan mit cdi-video für tyndur ;) (momentan auf cirrus unter qemu beschränkt, nen normaler vesa-treiber wird aber auch noch gebastelt ;) )
-
Hey :)
Habe gerade den PC gewechselt und das ganze kompiliert ..
Funktioniert 1a ...
Aber wegen vm86:
Kennt jmd. ein gutes Tut oder hat jmd. einen Beispielcode zum
switchen in den vm86 (virtual 8086 mode) + initialisieren von vesa (vbe)?
-
Virtual 8086 Mode (http://osdev.berlios.de/v86.html) von Tim Robinson
-
Beispielcode hatte ich in den Quellen von LightOS gefunden! Ist recht einfach zu finden und dort wird es recht deutlich muss man sich aber erst mal zurechtfinden! Kann euch leider grad nicht sagen, welche Datei das war, da ich es erst neu downloaden müsste!
-
Virtual-8086-Interface: v86.hpp (http://repo.or.cz/w/lightOS.git?a=blob;f=kernel/include/kernel/x86/v86.hpp;h=4597a50c99a3ea77e3087fd2386830ea0b9ee1ee;hb=HEAD) und v86.cpp (http://repo.or.cz/w/lightOS.git?a=blob;f=kernel/x86/v86.cpp;h=9b609c0d4e462de949923013c01aad54cf21273d;hb=HEAD)
Virtual-8086-Monitor: v86m.hpp (http://repo.or.cz/w/lightOS.git?a=blob;f=kernel/include/kernel/x86/v86m.hpp;h=169a29d07fb4db9a1996bda1ba76d6d85eea319b;hb=HEAD) und v86m.cpp (http://repo.or.cz/w/lightOS.git?a=blob;f=kernel/x86/v86m.cpp;h=ba466f5fa80aafedcb80a316c99fe4cb7e57fe92;hb=HEAD)
VBE Interface: vbe.hpp (http://repo.or.cz/w/lightOS.git?a=blob;f=kernel/include/kernel/x86/vbe.hpp;h=bd75f50849bf9332d584b6191aeb917490a0d43e;hb=HEAD) und vbe.cpp (http://repo.or.cz/w/lightOS.git?a=blob;f=kernel/x86/vbe.cpp;h=93391719a9bc010a179f2d82f78545212d9c5142;hb=HEAD)
paar benötigte Assemblerroutinen: _v86.S (http://repo.or.cz/w/lightOS.git?a=blob;f=kernel/x86/_v86.S;h=ef611b4f41a4e92ab263791c760fb5a2481905ea;hb=HEAD)
Ich hab ein paar Sachen natürlich von dem oben erwähnten Tutorial. Ansonsten erweisen sich auch die Intel Manuals als Hilfe, wenn man mal was genau wissen will.
-
thx bluecode, dass du sachen aus lightOS nochmal rausgesucht hast! :-D
-
thx :)