Lowlevel
Lowlevel => Das Wiki => Thema gestartet von: T-Head am 11. April 2005, 23:27
-
Hi,
da ich mich eigentlich noch nie mit Kernel-Entwicklung in C beschäftigt habe, grig ichs irgendwie net hin, den Kernel zu Compilieren, ...
Welchen Compiler, ... soll ich benutzen! :oops: :oops: :oops:
-
Versuch mal DJGPP den verwenden die meisten und ich kann ihn auch empfehlen. Such mal bei osdever.net im Downloadbereich.
-
Hi,
ich werds mal versuchen! In C++ hab ich bis jetzt immer nur DevC++ verwendet! Sollte ich probleme haben, ...
-
Hi,
und wie ganz genau muss ich das dann mit dem Compilieren dess OS`S machen?? N Normales Programm geht ja, nur hier Check ich's irgendwie net! :oops: :oops:
-
Den Bootloader natürlich mit nasm compilieren. Den C Teil sollte man mit dem Linker Script link.txt machen. Sorry aber ich weiß nicht genau wie man das macht, weil ich für meine eigenen Projekte nie so was erwendet habe.
-
schau doch hier bei den Tutorials ... wird sehr schön erklärt und hat noch ein hilf tool \:D/
-
Hi,
damit es gintg, musste ich den Code etwas umschreiben! In bootupinfo.h hat ein Semikolon gefehlt und die angabe dw VESA_bytesperscanline; war zwei mal vorhanden!
Dann habe ich den Code von kernel.c so geändert:
#include "datatypes.h"
#include "bootupinfo.h"
int main()
{
return 0;
}
Er war mal so:
#include "datatypes.h"
#include "bootupinfo.h"
void main()
{
return;
}
Das ging aber net!
-
Es kommt auf die Befehlszeile von gcc und vielleicht auch auf dessen Version an. Mit dem -ansi Parameter wirds sicher nicht akzeptiert, aber ohne geht bei mir void main prima...
-
Hi,
jetzt hat alles geklappt! Auser eins, das Linken! Ich habs in allen Formen und Varianten versucht, s ging aber nicht! Wie kann ich das machen?
Das hab ich bis jetzt gemacht:
gcc -ffreestanding -c -Os -o ckernel.obj kernel.c
nasm -f aout -o kernel32.obj kernel32.asm
mk c32kernel.bin kernel32.obj ckernel.obj
Jetzt will ich die datei c32kernel.bin durch den Linker jagen, wie es in TeeJay's Tut beschrieben wird, es funktioniert aber nicht! Die Datei c32.kernel.bin is danch zwar weg, es erscheint allerdings keine neue Datei (kernel.bin)!! :cry:
-
Hi,
ok, ich weiß jetz auch, wie das mit dem Linken geht! Da kann man das letzte, das ich da gemacht hab weglassen! Dann hab ich normal die 2 Dateien:
- kernel.obj
- kernel32.obj
wenn ich jetzt den Linker mit dem Linkerscripy ausführe, dann kommt folgende Meldung:
kernel32.obj: file not recognized: File format not recognized
-
Es gibt unter Windows eine LD-Version die a.out nicht kennt...
-
Hi,
dann wertd ichs mal mit ner anderen Probieren! 8)
-
Hi,
jetz kommt wieder ne andere Fehlermeldung:
kernel.obj(.text+0x4):kernel.c: undefined reference to `___main'
-
T-Head: waerst du so nett und wuerdest mir die ld-version per email zukommen lassen? das waer echt total super :oops:
ich find naemlich keine funktionierende >< (hab immernoch den gleichen file not recognized fehler..das frustriert!)
lg, hannibal
ps: alexander.panek AT brainsware.org ist meine mail-addy
-
Hi,
ich kann es dir auch hier Posten! :wink:
Lad dir einfach die DJGPP bin untils runter: http://www.osdever.net/downloads/compilers/elfbinutils2112.zip
-
Hi,
kann mir keiner sagen, was das bedeutet??
kernel.obj(.text+0x4):kernel.c: undefined reference to `___main'
-
Das ist ein Fehler vom Linker. Du scheinst eine Funktion aufzurufen die __main heißt. Poste mal den Code wo die Funktion exportiert/importiert und aufgerufen wird.
-
Hi,
ich Post mal alles, was ich habe:
kernel.c:
#include "datatypes.h"
#include "bootupinfo.h"
int main(void)
{
return(0);
}
bootupinfo.h:
#ifndef BOOTUPINFO_H
#define BOOTUPINFO_H
#include "datatypes.h"
typedef struct bootupinfo
{
//VBE 1.0+
dw VESA_modeattributes;
db VESA_windowattributesA;
db VESA_windowattributesB;
dw VESA_windowgranulayrity;
dw VESA_windowsize;
dw VESA_startwindowA;
dw VESA_startwindowB;
dd VESA_farwindowfunction;
dw VESA_widthinpixels;
dw VESA_hightinpixels;
db VESA_widthofcharacter;
db VESA_heightofcharacter;
db VESA_numofmemplanes;
db VESA_bitsperpixel;
db VESA_numbanks;
db VESA_memorymodel;
db VESA_sizeofbank;
db VESA_numimagepages;
db VESA_RESERVED;
//VBE v1.2+
db VESA_redmask;
db VESA_redfieldpos;
db VESA_greenmask;
db VESA_greenfieldsize;
db VESA_bluemask;
db VESA_bluefieldsize;
db VESA_reservedmask;
db VESA_resmaskpos;
db VESA_directcolormode;
//VBE v2.0+
dd VESA_lfbmem;
dd VESA_offscreenmem;
dw VESA_offscreenmemamount;
//VBE v3.0
dw VESA_bytesperscanline;
db VESA_numimgbanked;
db VESA_numimglinear;
db VESA_linearmodes[8];
dd VESA_maxpixelclock;
db VESA_RESERVED2[190];
dd SYSTEM_installedram; //Ermittelter RAM
}bootupinfo;
bootupinfo *infoblock=(bootupinfo*)0x30000;
#endif
datatypes.h:
#ifndef datatypes_h
#define datatypes_h
#define db unsigned char
#define dw unsigned short int
#define dd unsigned long
#endif
Soll ich kernel32.asm auch noch Posten???
-
Eigentlich ist nur kernel.c und kernel32.asm wichtig
bits 32
%include "macros.asm"
global start
start:
mov ax,0x10
mov ss,ax
mov ds,ax
mov fs,ax
mov gs,ax
mov es,ax
mov eax,0x9FFFF
mov esp,eax
mov ebp,eax
finit ;prepare the FPU so it can be used without problems
activateA20:
.1:
in al, 0x64
test al, 00000010b
jnz .1
mov al, 0xD0
out 0x64, al
.2:
in al, 0x64
test al, 00000001b
jz .2
in al, 0x60
or al, 00000010b
push eax
.3:
in al, 0x64
test al, 00000010b
jnz .3
mov al, 0xD1
out 0x64, al
.4:
in al, 0x64
test al, 00000010b
jnz .4
pop eax
out 0x60, al
remappic: ;IRQ's start with Int 0x20, directly after the exceptions
mov al,0x11
out 0x20,al
out 0xa0,al
mov al,0x20
out 0x21,al
mov al,0x28
out 0xa1,al
mov al,0x04
out 0x21,al
mov al,0x02
out 0xa1,al
mov al,0x01
out 0x21,al
out 0xa1,al
extern _main
call _main
jmp $
Interessant ist
extern _main
call _main
In kernel32.asm und void main() in kernel.c
Wie compilierst du das? Zuerst alle Files in Objects machen und erst dann alle linken!
-
Hi,
genau!
gcc -ffreestanding -c -Os -o kernel.obj kernel.c
nasm -f aout -o kernel32.obj kernel32.asm
Und dann Linken:
ld -T link.txt -o kernel.bin
Linkerscript:
OUTPUT_FORMAT("binary")
INPUT(kernel32.obj kernel.obj)
ENTRY(start)
SECTIONS
{
.text 0x10000 : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(1);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(1);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(1);
}
end = .; _end = .; __end = .;
}
-
Versuch mal coff statt aout also:
nasm -f coff -o kernel32.obj kernel32.asm
-
und versuchs mit "main" bzw. "_main" statt "__main"
-
Hi,
danke! Es geht! der Code von kernel32.asm muss so lauten:
bits 32
%include "macros.asm"
global start
start:
mov ax,0x10
mov ss,ax
mov ds,ax
mov fs,ax
mov gs,ax
mov es,ax
mov eax,0x9FFFF
mov esp,eax
mov ebp,eax
finit ;prepare the FPU so it can be used without problems
activateA20:
.1:
in al, 0x64
test al, 00000010b
jnz .1
mov al, 0xD0
out 0x64, al
.2:
in al, 0x64
test al, 00000001b
jz .2
in al, 0x60
or al, 00000010b
push eax
.3:
in al, 0x64
test al, 00000010b
jnz .3
mov al, 0xD1
out 0x64, al
.4:
in al, 0x64
test al, 00000010b
jnz .4
pop eax
out 0x60, al
remappic: ;IRQ's start with Int 0x20, directly after the exceptions
mov al,0x11
out 0x20,al
out 0xa0,al
mov al,0x20
out 0x21,al
mov al,0x28
out 0xa1,al
mov al,0x04
out 0x21,al
mov al,0x02
out 0xa1,al
mov al,0x01
out 0x21,al
out 0xa1,al
extern main
call main
jmp $
-
jetz das ganze nochmal schritt für schritt-anleitung, ich bekomms nämlich auch nich hin -.-
-
Am besten ins Wiki schreiben. Nasm kriegt bei mir nen Fehler wenn ich den Bootloader assemblieren will. 5x oder so hab ich Ivalid Operand Size.
-
Hi,
warum hast du was am Bootloader verändert???
Der war doch gut so wie er is! :wink:
-
Eigentlich nicht. Aber es interessiert mich trotzdem wie man den ändern könnte.
-
Hi,
also bei mir gehts! Ich habe den von: http://nasm.sourceforge.net/wakka.php?wakka=HomePage
-
Ich glaub ich hab meinen von osdever.net. Wie kompilierst du das? Ich mach das so: nasmw -f bin -o boot.bin boot.asm
Und dann sagt er mir:
D:\nasm\boot.asm:73: operation size not specified
D:\nasm\boot.asm:74: operation size not specified
D:\nasm\boot.asm:348: operation size not specified
D:\nasm\boot.asm:468: operation size not specified
-
dann gib einfach die operand size an:
push word blabla
-
Jetzt gehts. Hät ich auch allein drauf kommen können :lol: Egal. Ist es eigentlich sinnvoll einen 19kB Bootloader zu haben. Bei Fat scheints ja zu gehen. Aber hätte man bei ext2 ganauso viel Platz?
-
ich denke schon. wenn ext2 das nicht so wie FAT direkt am anfang unterstützt könnte man z.b. die stage2 (also alles ab zeile 52) auch aus dem dateisystem nachladen. so macht das z.b. GRUB.
oder man verschiebt die ext2-partition mit ein wenig nach hinten und tut den bootloader in eine eigene partition ... (auf disketten geht das natürlich nicht so)
und wenn man das nach ext2 porten will, müsste man den dateisystem abhängigen teil von dem bootloader komplett neuschreiben. ich denke mal, wenn keiner da ordentlich druck macht, wird es eh nicht so schnell einen ext2-port geben ...
-
Macht vielleicht Sinn zwei Dateien zu laden, also den kernel und den stage2 Teil. Dann kann man das beliebig erweitern und verändern. Egal, der Loader ist so gut wie er ist :wink: Aber noch eine Frage: Wird vom Loader auch Booten von Festplatte unterstützt oder nur Diskette?
-
Der Loader ist FAT12. Also wenn du deine Festplatte mit FAT12 formatierst würde der sicherlich auch damit umgehen können. Wenn ich den FAT12/16/32 also für alle drei kompatibel machen müsste, würde das schon etwas komplizierter für mich werden. Dann noch ext dazu wird noch komplizierter.
Naja egal also wenn FAT12 dann auch Festplatte, aber gedacht eigentlich bisher nur für FAT12+Diskette.
-
Hi,
ich denke auch, dass es reicht, das OS für andere Dateisysteme kompatibel zu machen, wenn es etwas weiter fortgeschritten ist! :wink:
-
Aber es ist immer gut wenn man sowas im Vorraus bedenkt. Aber Diskette sollte erstmal wirklich reichen. Also ich denke der Bootloader ist jetzt fertig. Die Frage ist jetzt wie es weitergeht.
-
Um das nochmal klar zumachen. Der Bootloader ist nicht ursprünglich für des CommOS geschrieben. Ich habe ihne nur dafür bereitgestellt. Mein OS nutzt den auch und wer den gerne in seinem eigenen Verwenden will kann dies tun.
Also ist er deswegen lange nicht fertig. Nur da mein OS im Moment keine weiteren Features vom Bootloader braucht (ausser vielleicht Erkennung ob Pentium+ da mein OS mindestens nen Pentium braucht) werde ich nix dazubasteln. Ich orientiere den Loader an meinem OS nicht am CommOS, nicht, dass das jemand falsch verstanden hat.^^
-
Hi,
das ist ja auch eigentlich egal, welcher Loader benutzt wird! Wir hätten genausogut auch irgend so ein anderes vertigteil nehmen können! :twisted:
-
machts doch^^ mir schnuppe^^
-
Hi,
ich hab ja nich gesagt, dass deiner Schlecht ist!
Ich benutz ihn auf jeden Fall! :P