Autor Thema: Funktionen in C-Kernel  (Gelesen 8679 mal)

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« am: 16. August 2005, 18:15 »
Hallo,

ich habe hier ein Phänomen dem ich nicht folgen kann...

wen ich in meinem C-Kernel nur in der Main ohne Funktionsaufrufe arbeite funktioniert es einwandfrei, doch sobald ich Funktionen schreibe dann rebootet mein Rechner...

Arbeite unterLinux mit GCC und setze auf der Basis vom C-Kernel Tutorial auf.

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 16. August 2005, 18:20 »
hi,
es könnte sein, dass du vielleicht ein falsches oder fehlerhaftes Linkerscript hast.
Am besten überprüfe es nochmal oder poste es hier !

cu,
stefan2005

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #2 am: 16. August 2005, 18:31 »
wenn ich die funktionen inline mache funktioniert es - also es liegt definitiv an den funktionen.

Mein Linker Script:

OUTPUT_FORMAT("binary")
INPUT(kernel32.obj ckernel.obj)
ENTRY(start)
SECTIONS
{
  .text  0x10200 : {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(1);
  }
  .data  : {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(1);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(1);
  }
  end = .; _end = .; __end = .;
}

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #3 am: 16. August 2005, 18:33 »
und auch noch meine main() mit der Funktion die ich aufrufe...


void init_video(void)
{
  return;
}
                                                                                                                           
int _main()
{                                                                                                                            
  char *Text = "Welcome to Protected Mode";
  char *VideoMem = (char*)0xB8000;

  init_video();
                                                                                                                           
  while(*Text)
  {
    *VideoMem = *Text;
    *VideoMem++;
    *VideoMem = 7;
    *VideoMem++;
    *Text++;
  }
                                         
  while(1)
   asm volatile ("nop");
                                                                                                                           
  return(0);
}


Ich glaube das dies irgendwie mit den Variablen zusammenhängt... speziell wenn die Funktionen in einem anderen .obj File sind.

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #4 am: 16. August 2005, 18:55 »
ich habe das problem bis jetzt auch noch nicht gelöst und mich bisher noch mit anderen sachen beschäftigt. Es passiert immer dann wenn an einen anderen Ort im Kernel gesprungen werden soll. Passiert bei mir auch im ASM-Code. Probier mal aus obs dort geht oder nicht.

mfg, jeb

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #5 am: 16. August 2005, 18:59 »
Zitat von: jeb
ich habe das problem bis jetzt auch noch nicht gelöst und mich bisher noch mit anderen sachen beschäftigt. Es passiert immer dann wenn an einen anderen Ort im Kernel gesprungen werden soll. Passiert bei mir auch im ASM-Code. Probier mal aus obs dort geht oder nicht.

mfg, jeb


Nein im ASM funktioniert es! Ich glaube eher das sich das Problem aus Globalen Variablen oder extern deklarierten Funktionen zusammenstellt was in anderen .obj Dateien definiert wird...

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #6 am: 16. August 2005, 19:56 »
Okay, ich hab mal umhergespielt und folgendes bemerkt: DAs Problem das mein Computer rebootet passiert nur dann wenn ich eine extern definierte Funktion aufrufe die sich nicht im selber Source File befindet. Mach eich vielleicht hierbei beim linken etwas falsch oder ist bei mehreren in C geschriebenen Object Files etwas zu beachten?

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 16. August 2005, 22:53 »
hi,
ich kenn mich zwar in C nicht besonders gut aus, aber es könnte doch sein, dass, wenn du zum C-Kernel springst, nicht direkt zur _main Funktion springst sondern an den Anfang der C-Datei, wo eventuell eine andere Funktion stehen könnte.
Versuch einfach mal soweit wie möglich zu debuggen (mit while(true) ;) oder in deine andere Funktion eine kleine Ausgabe einzubauen, mitder du erkennst, dass die eventuell aufgerufen wurde, bevor die Kernel-Main gestartet wurde, evt. auch mit while(true) ; ... !
Hast du auch deinen C-Kernel mit einer Assemblerdatei verlinkt ?

cu,
stefan2005

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #8 am: 16. August 2005, 23:04 »
ja ist alles toll verlinkt, ohne funktionsaufruf funktioniert es... nur wenn ich ein externes File dazulinke und daraus eine Funktion aufrufe rebootet er!

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #9 am: 17. August 2005, 14:13 »
welche kommandozeile nutzt du denn zum compileren und linken?

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #10 am: 17. August 2005, 15:32 »
Zitat von: maumo
welche kommandozeile nutzt du denn zum compileren und linken?


Das selbe wie in Teejays C-Kernel Tutorial nur eben das ich beim linken ein Object mehr anhänge!

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #11 am: 17. August 2005, 19:41 »
hasts mal ohne optimierung versucht?

es könnte auch sein das du das problem hast, welches ich unter fbsd hatte:
wenn eine funktion kein "_" besitzt rebootet der rechner (ich weiss: volliger mist, aber so wars).

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #12 am: 17. August 2005, 20:25 »
Zitat von: maumo
hasts mal ohne optimierung versucht?

es könnte auch sein das du das problem hast, welches ich unter fbsd hatte:
wenn eine funktion kein "_" besitzt rebootet der rechner (ich weiss: volliger mist, aber so wars).


Was meinst du mit "ohne optimierung"

Wie soll ich das mit dem _ machen? einfach die Funktion umbenennen?

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #13 am: 19. August 2005, 15:27 »
1. -O weglassen
2. ignorieren

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #14 am: 19. August 2005, 15:35 »
Zitat von: maumo
1. -O weglassen
2. ignorieren


schon probiert - hilft nichts...

kann mir vielleicht jemand den teejay kernel mit einem 2ten c-file bestuecken und es testen und wenn es geht mir die sourcen senden?

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #15 am: 19. August 2005, 15:40 »
warte ne sekunde...
mail?

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #16 am: 19. August 2005, 15:52 »
also bei mir klapts jetzt gar nicht mehr...
???
ich werd noch verrückt! :evil:

woigl

  • Beiträge: 93
    • Profil anzeigen
    • http://www.nogos.org
Gespeichert
« Antwort #17 am: 19. August 2005, 16:18 »
Zitat von: maumo
also bei mir klapts jetzt gar nicht mehr...
???
ich werd noch verrückt! :evil:


ja mails mir bitte - woigl@nogos.org

 

Einloggen