Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Projekt: OS-Development  ::  Memory Managment  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
abc.w
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2008
Beiträge: 1364
Beitrag abc.w Mitglied 18:25:16 13.03.2010   Titel:              Zitieren

Oder es fehlt einfach irgendwo ein "volatile"...
taljeth
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.09.2009
Beiträge: 148
Beitrag taljeth Mitglied 18:29:16 13.03.2010   Titel:              Zitieren

Bei Treibern mag das ja regelmäßig vorkommen, aber eine Speicherverwaltung, die volatile braucht, wäre mir suspekt. ;)

_________________
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.
Lowlevel - die deutschsprachige OS-Dev-Community
Badestrand
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2006
Beiträge: 4342
Beitrag Badestrand Mitglied 18:34:41 13.03.2010   Titel:              Zitieren

An der Speicherverwaltung kann es gar nicht liegen, die wird erst später initialisiert, nach dem Crash. Der Code, der bis zum Absturz durchlaufen wird, ist auch relativ überschaubar. Direkt nach dem Eintritt in die main-Funktion wird die "init"-Funktion aufgerufen, die folgende Sachen ausführt:
C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
clear_screen();
settextcolor(14,0);
printformat("PrettyOS [Version 0.0.0.221]\n");
gdt_install();
idt_install();
timer_install();
keyboard_install();
syscall_install();
settextcolor(15,0);
C/C++ Code:
1
2
3
4
5
6
7
8
9
clear_screen();
settextcolor(14,0);
printformat("PrettyOS [Version 0.0.0.221]\n");
gdt_install();
idt_install();
timer_install();
keyboard_install();
syscall_install();
settextcolor(15,0);
C/C++ Code:
1
2
3
4
5
6
7
8
9
clear_screen();
settextcolor(14,0);
printformat("PrettyOS [Version 0.0.0.221]\n");
gdt_install();
idt_install();
timer_install();
keyboard_install();
syscall_install();
settextcolor(15,0);


Auf den ersten Blick in diese Funktionen sieht das alles recht ungefährlich aus. Die Sachen laufen auch gut durch, beim return geht irgendwas schief, scheint also der Stack kaputt zu sein. Bloß woher :confused: Ich bin schon dabei, zu debuggen und zu disassemblern, ist aber eine eklige Arbeit..
Unregistrierter





Beitrag Unregistrierter 19:03:53 13.03.2010   Titel:              Zitieren

Ist eher alles ein Problem mit den Kompilerflags. Folgendes Beispiel:

C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
// ckernel.c Revision 219

int main()
{
for(;;); // <- Endlosschleife :)

    init();
(...)
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
// ckernel.c Revision 219

int main()
{
for(;;); // <- Endlosschleife :)

init();
(...)
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
// ckernel.c Revision 219

int main()
{
for(;;); // <- Endlosschleife :)

    init();
(...)
}

Ohne Flag "-O" stürzt PrettyOS ab, woraus vorerst nur folgen soll, daß die Endlosschleife nicht ausgeführt wurde (also "verschwunden" ist).

Mit Flag "-O" bleibt PrettyOS in der Endlosschleife hängen, was heißt, daß sie nicht "verschwunden" ist.

Daraus folgt, daß der GCC auch ohne Angabe von Optionen zur Optimierung den Quellcode wie auch immer verändert. Insofern wirst Du wahrscheinlich im Quellcode auch keine Fehler finden. :)
Badestrand
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2006
Beiträge: 4342
Beitrag Badestrand Mitglied 19:10:09 13.03.2010   Titel:              Zitieren

Da läuft beim Linken was schief, aber ist der Grund jetzt klar. Der eigentlich als Einstiegscode gedachte "KernelStart" liegt irgendwo in der Mitte des Binaries.

Mit Compiler-Option -O0 wird die "init"-Funktion nicht ge-inline-t und liegt am Anfang des Binaries, d.h. der Code springt direkt in die init-Funktion, ohne vorher in der "main" gewesen zu sein. Logisch, dass dann keine gültige Rücksprungadresse auf dem Stack liegt und es kracht.

Mit -O wird die "init"-Funktion ge-inline-t und die "main"-Funktion liegt direkt am Anfang des Binaries. Damit klappt es zwar, ist aber nicht im Sinne des Erfinders, die "KernelStart"-Funktion gibt es ja nicht umsonst, sie setzt z.B. den Stack auf 0x01900000.

D.h. irgendwie bekommt der Linker es nicht hin, die "KernelMain" an den Anfang des Binaries zu setzen, obwohl die Funktion im Linkerscript als "ENTRY" markiert ist. Hat jemand eine Idee?

edit: Danke, +gjim+!


Zuletzt bearbeitet von Badestrand am 19:11:01 13.03.2010, insgesamt 1-mal bearbeitet
Badestrand
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2006
Beiträge: 4342
Beitrag Badestrand Mitglied 19:17:32 13.03.2010   Titel:              Zitieren

Ok, habs. Im Linkerscript muss STARTUP(kernel.o) gesetzt sein, das ENTRY spielt keine Rolle. Ich comitte.

edit: Was für ein Krampf :)


Zuletzt bearbeitet von Badestrand am 19:17:45 13.03.2010, insgesamt 1-mal bearbeitet
XanClic
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.10.2009
Beiträge: 95
Beitrag XanClic Mitglied 19:49:33 13.03.2010   Titel:              Zitieren

Trotzdem könnte man hier mal anmerken, dass man genau wegen sowas ELF oder ähnliche Formate will (die also einen Entrypoint haben)...

_________________
http://www.lowlevel.eu/
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 21:11:37 21.03.2010   Titel:              Zitieren

Eine Frage aus dem IRC:
Zitat:
ich frag mich, ob es wirklich nötig ist, die page tables für den kernel bereich im voraus zu allokieren.

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
lk
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.03.2009
Beiträge: 213
Beitrag lk Mitglied 18:08:41 29.07.2011   Titel:              Zitieren

Kann jemand die meory map irgendwie erwitern ? Mehr details wären cool, vielleicht auch graphisch.

Apropo, ich kann auch osdev.org empfehlen.

_________________
Wird wahrscheinlich falsch sein, aber wat solls. :)
Und wenn man am Ende der Kräfte ist: jmp 0xC0FFEE
Mr X
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1074
Beitrag Mr X Mitglied 18:14:53 29.07.2011   Titel:              Zitieren

Im Repository befindet sich unter /documentation/memory.txt eine detailiertere und aktuellere Übersicht.
C/C++ Forum :: Projekt: OS-Development  ::  Memory Managment  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.