Autor Thema: C/C++ - Kernel ruft keine Funktionen auf :(  (Gelesen 4003 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« am: 10. December 2005, 09:42 »
Hi
Ich hab folgenden Code:
#include "bootio.hpp"
#include "types.hpp"

namespace boot
{

char *VRAM = (char*)0xB8000;
//Werte
WORD _position = 0;
BYTE _color    = 0x07;

//-----------------------------------------------------------------------------------

void clrscr()
{
 for(int i=0; i<(80*25*2); i+=2)
 {
  VRAM[i  ] = ' ';
  VRAM[i+1] = _color;
 }
 _position = 0;
}

//-----------------------------------------------------------------------------------

void gotoxy(WORD x, WORD y)
{
 _position = (y*25+x)*2;
}

//-----------------------------------------------------------------------------------

void setcolor(BYTE color)
{
 _color = color;
}

//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------

void print(char *string)
{
 int i=0;

 do
 {
  VRAM[_position  ] = '#';//string[i];
  VRAM[_position+1] = 0xEC;//_color;
 
  i++;
  _position += 2;
 }
 while(string[i-1] != 0);
 
 return;
}

}

#include "types.hpp"
#include "bootio.hpp"

int main()
{

char *VRAM = (char*)0xB8000;
VRAM+=4;
*VRAM = '['; //Geht
VRAM++;
*VRAM = 0xEC;

 boot::gotoxy(1, 1);
 boot::setcolor(0x0A | 0x80); //0x80 == Blinken
 boot::print("Test"); // Text wird nicht ausgegeben
 

VRAM++;
*VRAM = ']'; //Geht auch
VRAM++;
*VRAM = 0xEC;
 
 return 0;
}


Die main-Funktion wird zwar ausgeführt, aber die Funktionen werden nicht durchgegangen...

Wo liegt der Fehler??

Kompilieren tu ich so:
gpp -c -nostdlib -fno-builtin -fno-rtti -fno-exceptions -o d:\reos\_ckernel\bootio.obj d:\reos\_ckernel\bootio.cpp
gpp -c -nostdlib -fno-builtin -fno-rtti -fno-exceptions -o d:\reos\_ckernel\kernelc.obj d:\reos\_ckernel\kernelc.cpp

Und das ist meine link.txt:
OUTPUT_FORMAT("binary")
INPUT(d:\reos\_ckernel\kernelexe.obj d:\reos\_ckernel\kernelc.obj d:\reos\_ckernel\bootio.obj)
ENTRY(start)
SECTIONS
{
  .text  0x11E00 :
  {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(1);
  }
  .data  :
  {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(1);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(1);
  }
  end = .; _end = .; __end = .;
}


Was mache ich falsch??

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #1 am: 10. December 2005, 22:06 »
Ist evtl unkla, aber es würde mir auch schon helfen, wenn ich wüsste, welche komponenten für dieses Fehlverhalten verantwortlich ist.

Liegts am Kompiler, Linker, oder evtl am Wechsel von dem 16/32Bit Kernel zum C/C++ kernel??

Im speicher:

Bootloader
16 Bit Kernel
32 Bit Kernel
Datei (8 Sektoren)
32Bit ASM-Teil des Kernels
32Bit C/C++-Teil des Kernels

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. December 2005, 22:34 »
es liegt eigentlich immer an dem code. z.b. an diesem hier:

Zitat von: RedEagle
char *VRAM = (char*)0xB8000;
VRAM+=4;
*VRAM = '['; //Geht
VRAM++;
*VRAM = 0xEC;

nach dieser aktion ist VRAM = 0xb8005

da heisst wenn du jetzt z.b. was nach VRAM[0] schreibst landet es bei 0xb8005 und nicht 0xb8000. konkret gibt das probleme in print(). einmal ist alles verschoben und dann sind noch attribute und zeichen vertauscht.
Dieser Text wird unter jedem Beitrag angezeigt.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. December 2005, 22:52 »
Die Funktion goto funktioniert nicht richtig, da eine Zeile 80 Zeichen lang ist und nicht 25. Der Text sollte aber trotzdem angezeigt werden. Eventuell ist das Attribut falsch?

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 11. December 2005, 09:31 »
Hab den code jetzt mal so geändert, das möglichst wenig code existiert:
void test();
void test2();

int main()
{
 test2();
 test();
 return 0;
}

void test()
{
char *VRAM = (char*)0xB8000;
VRAM[2] = '#';
VRAM[3] = 0xCE;
return;
}

void test2()
{
 return;
}

test() wird tatsächlich aufgerufe, es wird auch kurtzzeitig die '#' angezeigt, aber dann startet bochs neu.
Wenn ich vorher test2() aufrufe, wird die Raute garnicht mehr angezeigt.
=> Es gibt probleme beim Verlassen einer Funktion (return)

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 11. December 2005, 11:48 »
Das heißt, bei folgendem Code stürtzt Bochs ab?

int test() {
// irgentwas machen, damits nicht geinlined wird
int volatile result = 5;
return result;
}

void main() {
test();
}


Überprüf mal, ob dein Stack richtig gesetzt ist.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #6 am: 15. December 2005, 12:16 »
Hab den Fehler gefunden. Es lag nicht am stack, aber scheinbar gibts da nen Problem mit Globalen Variablen:
char *VRAM = (char*)0xB8000;

void test3()
{
//char *VRAM = (char*)0xB8000;
VRAM[8] = '3';
VRAM[9] = 0xCE;
return;
}


So läuft wird nichts ausgegeben. Wenn VRAM aber local ist, gibts keine Probleme mehr. Woran liegt das??

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 15. December 2005, 12:59 »
Mach mal *(.rodata) in deine Textsection.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #8 am: 15. December 2005, 18:18 »
OUTPUT_FORMAT("binary")
INPUT(d:\reos\_ckernel\kernelexe.obj d:\reos\_ckernel\kernelc.obj d:\reos\_ckernel\lowio.obj d:\reos\_ckernel\bootio.obj)
ENTRY(start)
SECTIONS
{
  .text 0x11E00 :
  {
    code = .; _code = .; __code = .;
    *(.text)
    *(.rodata)
    . = ALIGN(1);
  }
  .data  :
  {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(1);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(1);
  }
  end = .; _end = .; __end = .;
}


Geht trotzdem noch nicht

 

Einloggen