Autor Thema: Blöde Frage zum CommOS  (Gelesen 23237 mal)

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« 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:

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #1 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.

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #2 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, ...

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #3 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:

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #4 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.

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #5 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/

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #6 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!

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #7 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...

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #8 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:

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #9 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

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. April 2005, 18:25 »
Es gibt unter Windows eine LD-Version die a.out nicht kennt...

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #11 am: 13. April 2005, 21:26 »
Hi,

dann wertd ichs mal mit ner anderen Probieren!  8)

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #12 am: 13. April 2005, 21:42 »
Hi,

jetz kommt wieder ne andere Fehlermeldung:

kernel.obj(.text+0x4):kernel.c: undefined reference to `___main'

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #13 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
\\o
o//
\o/

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #14 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

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #15 am: 14. April 2005, 14:43 »
Hi,

kann mir keiner sagen, was das bedeutet??

kernel.obj(.text+0x4):kernel.c: undefined reference to `___main'

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #16 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.

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #17 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???

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #18 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!

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #19 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 = .;
}

 

Einloggen