Lowlevel

Lowlevel => Das Wiki => Thema gestartet von: T-Head am 11. April 2005, 23:27

Titel: Blöde Frage zum CommOS
Beitrag 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:
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 12. April 2005, 14:05
Versuch mal DJGPP den verwenden die meisten und ich kann ihn auch empfehlen. Such mal bei osdever.net im Downloadbereich.
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 12. April 2005, 22:47
Hi,

ich werds mal versuchen! In C++ hab ich bis jetzt immer nur DevC++ verwendet! Sollte ich probleme haben, ...
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 12. April 2005, 23:25
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:
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 13. April 2005, 13:55
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.
Titel: Blöde Frage zum CommOS
Beitrag von: matthieuriolo am 13. April 2005, 14:15
schau doch hier bei den Tutorials ... wird sehr schön erklärt und hat noch ein hilf tool  \:D/
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 13. April 2005, 14:52
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!
Titel: Blöde Frage zum CommOS
Beitrag von: elfish_rider am 13. April 2005, 15:20
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...
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 13. April 2005, 15:37
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:
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 13. April 2005, 16:57
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
Titel: Blöde Frage zum CommOS
Beitrag von: Another Stupid Coder am 13. April 2005, 18:25
Es gibt unter Windows eine LD-Version die a.out nicht kennt...
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 13. April 2005, 21:26
Hi,

dann wertd ichs mal mit ner anderen Probieren!  8)
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 13. April 2005, 21:42
Hi,

jetz kommt wieder ne andere Fehlermeldung:

kernel.obj(.text+0x4):kernel.c: undefined reference to `___main'
Titel: Blöde Frage zum CommOS
Beitrag von: hannibal am 14. April 2005, 07:22
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
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 14. April 2005, 13:02
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
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 14. April 2005, 14:43
Hi,

kann mir keiner sagen, was das bedeutet??

kernel.obj(.text+0x4):kernel.c: undefined reference to `___main'
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 14. April 2005, 14:45
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.
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 14. April 2005, 14:53
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???
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 14. April 2005, 15:00
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!
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 14. April 2005, 15:12
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 = .;
}
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 14. April 2005, 15:26
Versuch mal coff statt aout also:

nasm -f coff -o kernel32.obj kernel32.asm
Titel: Blöde Frage zum CommOS
Beitrag von: Another Stupid Coder am 14. April 2005, 15:46
und versuchs mit "main" bzw. "_main" statt "__main"
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 14. April 2005, 15:51
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 $
Titel: Blöde Frage zum CommOS
Beitrag von: stultus am 15. April 2005, 19:04
jetz das ganze nochmal schritt für schritt-anleitung, ich bekomms nämlich auch nich hin -.-
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 16. April 2005, 11:09
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.
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 16. April 2005, 11:20
Hi,

warum hast du was am Bootloader verändert???
Der war doch gut so wie er  is!  :wink:
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 16. April 2005, 11:38
Eigentlich nicht. Aber es interessiert mich trotzdem wie man den ändern könnte.
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 16. April 2005, 18:58
Hi,

also bei mir gehts! Ich habe den von: http://nasm.sourceforge.net/wakka.php?wakka=HomePage
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 16. April 2005, 19:03
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
Titel: Blöde Frage zum CommOS
Beitrag von: Jidder am 16. April 2005, 19:18
dann gib einfach die operand size an:

push word blabla
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 16. April 2005, 19:23
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?
Titel: Blöde Frage zum CommOS
Beitrag von: Jidder am 16. April 2005, 19:49
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 ...
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 17. April 2005, 12:27
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?
Titel: Blöde Frage zum CommOS
Beitrag von: Roshl am 17. April 2005, 17:33
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.
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 17. April 2005, 18:11
Hi,

ich denke auch, dass es reicht, das OS für andere Dateisysteme kompatibel zu machen, wenn es etwas weiter fortgeschritten ist!  :wink:
Titel: Blöde Frage zum CommOS
Beitrag von: DarkThing am 17. April 2005, 18:57
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.
Titel: Blöde Frage zum CommOS
Beitrag von: Roshl am 17. April 2005, 19:18
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.^^
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 18. April 2005, 00:06
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:
Titel: Blöde Frage zum CommOS
Beitrag von: Roshl am 18. April 2005, 16:43
machts doch^^ mir schnuppe^^
Titel: Blöde Frage zum CommOS
Beitrag von: T-Head am 18. April 2005, 22:02
Hi,

ich hab ja nich gesagt, dass deiner Schlecht ist!
Ich benutz ihn auf jeden Fall!  :P