Autor Thema: Globale Varablen funktionieren nicht  (Gelesen 11954 mal)

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« am: 10. February 2010, 17:09 »
Hallo,
Ich habe mich in der letzten Zeit ein wenig mit Lowlevel auseinander gesetzt und  einen kleinen Bootloader geschrieben. Jetzt habe ich  begonnen einen kleinen "Kernel" zu schreiben.
Aus irgend einen Grund kann ich in meinem "Kernel" plötzlich nicht mehr auf globale Variablen zugreifen. :?
Wenn ich von meiner main-Funktion aus auf eine Globale Variable zugreife dann hat sie IMMER den Wert 0.
Auserderdem habe ich plötzlich Probleme mit meiner printf-Funktion. Wenn ich sie mehrmals aufrufe dann wird kein Text mehr ausgegeben bzw der Bildshirm bleibt oder wird schwarz. (Vor ein paar Tagen hat alles noch Problemlos funktioniert.
Ich verwände gcc 4.4.3 unter ArchLinux

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. February 2010, 17:20 »
Kannst du den Code irgendwohin hochladen?

Mal völlig ins Blaue geraten: Variablen, die sich magischerweise nicht ändern lassen, hatte ich schonmal. Am Ende hat sich herausgestellt, dass sie an einer ROM-Adresse gelandet sind. Wo läuft denn dein Kernel bzw. wo liegen die Daten?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 10. February 2010, 17:28 »
Link: http://svn.bluestain.net/david/Projekte/DAVEOS/trunk/
Ist zwar nicht mehr die Aktuellste version, aber hier hatte ich das Problem auch schon!

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 10. February 2010, 19:23 »
Kann mir Niemand helfen??? ??? :? :?

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 10. February 2010, 19:55 »
hatte das Problem auch schon einige male
Ursache: Der kernel wurde zu groß, und dadurch nicht vollständig vom bootloader geladen.
Da du ebenfalls einen eigenen bootloader verwendest, würde ich das mal als mögliche Ursache betrachten.

Ich empfehle dir grub zu verwenden (was dir die meisten hier wahrscheinlich empfehlen würden), oder vorerst FAT12 in dein bootloader implementieren - im wiki gibt's einige links zu guten pdf's.
« Letzte Änderung: 10. February 2010, 20:00 von RedEagle »

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 10. February 2010, 20:17 »
hmm, dann werd ichs mal mit GRUB probieren!!!
Mein Bootloader ist wirklich sch****  :-D :-D
Danke für den Tipp
---------------------------------------------------------------
Ich habe mal schnell dieAnzahl der zuladenen Sektoren in meinem Bootloader geändert.
Das Problem mit meiner printf-Funktion scheint gelöst zu sein. Die Globalen Variablen haben aber immer noch den Wert 0 bzw einen den sie nicht haben sollen.
hmm, könnte es sein dass die Aktivierung des A20 Gate nicht funktioniert hat???
« Letzte Änderung: 10. February 2010, 20:44 von dldave »

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #6 am: 10. February 2010, 20:51 »
Wenn werte die 0 sein sollten, aber nicht 0 sind kann es daran liegen :mrgreen:

das es Probleme mit dem A20 gate gibt ist auch möglich
einfach mal was an eine adresse schreiben, und von der adresse +1MiB lesen - ist es das selbe liegts daran :)
« Letzte Änderung: 10. February 2010, 20:52 von RedEagle »

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 11. February 2010, 13:13 »
Ok, ich hab gerade  einen Wert an der Adresse  0x15000 erstellt, und dann  bei 0x115000 wieder ausgelesen. ES IST DER SELBE WERT :-P :-P
Ich hatte das A20 Gate mittels System Control Port A eingeschaltet, da die Variante mit dem Tastaturkontroller immer abgeschtürzt ist.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 11. February 2010, 13:21 »
GRUB würde das mit dem A20-Gate automagisch machen. :-)
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 11. February 2010, 13:25 »
Bevor ich Grub einsätze (das werde ich so schnell wie möglich machen) möchte ich es mit meinem eigenen Loader schaffen . :-D :mrgreen:

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #10 am: 11. February 2010, 16:51 »
Na ja, ich bezweifle, dass das per Tastaturcontroller fehlschlägt, immerhin sollte das sogar mit USB-Tastaturen funktionieren... Wenn ein System so wenig Kompatibilität zu diesen "alten" Methoden hat, würde mich das sehr wundern.
Ehrlich gesagt bin ich ja derzeit eher der Überzeugung, dass du etwas falsch abgeschrieben hast. :wink:

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #11 am: 11. February 2010, 17:31 »
[..]Wenn ein System so wenig Kompatibilität zu diesen "alten" Methoden hat, würde mich das sehr wundern.[..]
Mein neuster PC (~4 Jahre alt) hat ebenfalls auch Probleme damit.
Es gibt eine methode per int 0x15 (?) die A20 geschichte zu regeln, hab es allerdings noch nicht ausprobiert

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 11. February 2010, 18:49 »
Ich arbeite mit Quemu. Damit sollte es eigentlich keine Probleme geben.
Ich habe das A20 Gate immer aktiviert bevor ich in den PM gewechselt habe.
Vieleicht könnte es daran liegen?!?
----------------------------------------------------------
Zitat
Ok, ich hab gerade  einen Wert an der Adresse  0x15000 erstellt, und dann  bei 0x115000 wieder ausgelesen. ES IST DER SELBE WERT
Vieleicht liegt es nicht am A20-Gate. Egal  welche Adresse mein char pointer hat
es wird immer das selbe Zeichen zurück geliefert.

char* str= (char*)0x15000;
char* str2= (char*)0x0; //0x115000;
 int main()
 {

     *str='A';
     str++;
     *str=0;
     str--;
    k_clearscreen();
    k_printf(str2);
    return 0;
 }
« Letzte Änderung: 11. February 2010, 19:00 von dldave »

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #13 am: 11. February 2010, 20:15 »
Zitat von: dldave
Ich arbeite mit Quemu. Damit sollte es eigentlich keine Probleme geben.
Ich habe das A20 Gate immer aktiviert bevor ich in den PM gewechselt habe.
Vieleicht könnte es daran liegen?!?
So ziemlich sicher nicht.

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 11. February 2010, 20:54 »
Ich habe total keine Ahnung wiso so eine "so einfache Sache" nicht läuft. :?
 :-o

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 12. February 2010, 09:32 »
char* str= (char*)0x15000;
char* str2= (char*)0x0; //0x115000;
 int main()
 {

     *str='A';
     str++;
     *str=0;
     str--;
    k_clearscreen();
    k_printf(str2);
    return 0;
 }
Was sollte dieser Code tun und was tut er? str sieht mir bis auf die Initialisierung ziemlich unbenutzt aus.

Edit: Ah, du meinst, dass es trotzdem funktioniert, obwohl es keinen Sinn ergibt? Ich würde mal auf ein Problem mit deinem k_printf tippen.
« Letzte Änderung: 12. February 2010, 09:34 von taljeth »
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 12. February 2010, 19:08 »
Ich weise str eine Adresse zu und schreibe ein A hinein. Dann gebe ich str2 aus.
Egal auf welche Adresse str2 zeigt wird immer str ausgegeben.
Ich glaube eher nicht dass es an der printf Funktion liegt. Wenn ich  mit if die Werte vergleiche komme ich auf das selber Ergebnis.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #17 am: 12. February 2010, 19:50 »
welche Adresse haben denn str und str2 (zur Laufzeit!)?

dldave

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 12. February 2010, 20:38 »
Ich verstehe nicht genau was du meinst.
Zitat
Zur Laufzeit
str =0x15000
str2=0

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #19 am: 12. February 2010, 20:50 »
wenn beim kopieren des kernels oder während des linkens was schief läuft könnte es sein, das die Daten der globalen variablen sich ändern - du hättest dann dort nicht die adressen drin stehen, die du ihnen im quellcode zugewiesen hast.
so kann es z.B. sein, das beide variablen auf 0x00000000 zeigen.

 

Einloggen