Revision 85 geht bei mir nur auf einem einzigen Computer fehlerfrei, und zwar PC 2.
PC 1 gibt einen GPF in der PCI-Liste aus und PC 3 startet neu (das ist der, der früher IMMER ging aber kaputt war und ich gestern wieder zusammengebaut habe).
In qemu läuft es, in VirtualBox auch, MS VPC hab ich nicht. In VitualBox läuft es allerdings SEHR langsam... da kann man die roten Punkte mitzählen^^
Revision 86: bei Eingabe von HELLO.ELF wird -->.ELF<-- nicht gefunden.
Bei Eingabe von "hello" hingegen funktioniert es - gewollt?! (Steht bereits auf der To-Do Liste, Nachtrag von Cuervo)
Nachtrag: Besteht die Möglichkeit einen extra Threat zum Testen der Revisionen zu öffnen? Ich glaube hier wird's langsam voll... (Danke für den Hinweis)
Nachtrag 2: Nachdem ich alle *.bin;*.map;*.elf - Dateien gelöscht habe, um ein "sauberes" System zu bekommen, musste ich feststellen, dass die Datei "HELLO.ELF" nicht gefunden wird. Wirklich aussagekräftige Fehlermeldung erhalte ich nicht. Habt ihr eine Idee?
Code:
tools/CreateFloppyImage2 PrettyOS FloppyImage.bin stage1_bootloader/boot.bin sta
ge2_bootloader/BOOT2.BIN kernel/KERNEL.BIN user/user_test_c/HELLO.ELF
Cannot open the file 'user/user_test_c/HELLO.ELF'
mingw32-make: *** [ckernel] Error -1
Code:
tools/CreateFloppyImage2 PrettyOS FloppyImage.bin stage1_bootloader/boot.bin sta
ge2_bootloader/BOOT2.BIN kernel/KERNEL.BIN user/user_test_c/HELLO.ELF
Cannot open the file 'user/user_test_c/HELLO.ELF'
mingw32-make: *** [ckernel] Error -1
Code:
tools/CreateFloppyImage2 PrettyOS FloppyImage.bin stage1_bootloader/boot.bin sta
ge2_bootloader/BOOT2.BIN kernel/KERNEL.BIN user/user_test_c/HELLO.ELF
Cannot open the file 'user/user_test_c/HELLO.ELF'
mingw32-make: *** [ckernel] Error -1
Ist es so gedacht, dass sich die externen Dateien nur ohne die Eingabe der Endung aufrufen lassen? Bsp: hello - funktioniert; hello.elf funktioniert nicht?!
_________________ Mein System zum testen von PrettyOS:
AMD64 X2 5200+;4 GB RAM;> 500 GB HDD
QEMU;Windows VirtualPC;VirtualBox
Zuletzt bearbeitet von anubis2k5 am 18:12:51 09.02.2010, insgesamt 1-mal bearbeitet
Ist es so gedacht, dass sich die externen Dateien nur ohne die Eingabe der Endung aufrufen lassen? Bsp: hello - funktioniert; hello.elf funktioniert nicht?!
Beides sollte funktionieren. Da ist was durch die Veränderungen durcheinander geraten. Gib bitte solange
Code:
HELLO .ELF
Code:
HELLO .ELF
Code:
HELLO .ELF
ein, bis es wieder geht.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 19:06:42 09.02.2010, insgesamt 1-mal bearbeitet
Nächste Meldung: Habe unter Bochs Probleme PrettyOS zum laufen zu bringen. Bochs kann scheinbar nicht vom Image booten - Pfadanpassung in der entsprechenden Config brachte leider keine Erfolge.
Zitat:
Meldung:
00020932447p[BIOS ] >>PANIC<< No bootable device.
_________________ Mein System zum testen von PrettyOS:
AMD64 X2 5200+;4 GB RAM;> 500 GB HDD
QEMU;Windows VirtualPC;VirtualBox
Mein Problem:
Texteingabe funktioniert in user-programmen nicht. ich bekomme nicht die möglichkeit (weder selbstgeschriebene noch hello.elf) einen Text einzugeben; das Programm beendet sich in dem Moment, wo man etwas eingeben müsste. (Wenn man den Text ausgeben lässt, nachdem man getch() genutzt hat, wird der Text nicht angezeigt, andernfalls jedoch schon).
EDIT: ich hätt wohl noch auf die Revision und die Umgebung eingehen sollen: Das Problem besteht mindestens seit Revision 86. 87 enthält es auch. Verwendetes System: Sun Virtual Box 3.1.2
Zuletzt bearbeitet von Mr X am 18:55:04 10.02.2010, insgesamt 1-mal bearbeitet
Beste Lösung: Der Kernel verwaltet die Tastatureingaben und gibt sie an das aktuelle Programm weiter (das, das sichtbar (oder so) ist), oder an das, das gemeldet hat, dass es eine Eingabe will. Dann müsste die Shell solange "anhalten".
Ausserdem kommen die Farben beim Multitasking durcheinander, also sollte jedes Programm seine Farbe merken und wieder aktivieren, wenn es dran ist...
Zuletzt bearbeitet von Cuervo am 07:58:58 11.02.2010, insgesamt 1-mal bearbeitet
eigentlich funktioniert alles soweit, aber ich hab noch etwas (nicht so wichtig, eigentlich) gefunden: Die Sekunden seit dem Start laufen viel! zu schnell.
Noch ein (erheblich größeres) Problem.
Es kommt mglw. durch das Multithreading.
Die Konsolenausgabe läuft nicht geordnet. Das äußert sich wie folgt:
Textfarbe ändert sich ohne zutun meinerseits mitten im user-programm und es werden Zeilen vertauscht. Dies tritt insbesondere nach Benutzereingabe auf.
EDIT: hälfte vergessen ;-)
getch funktioniert garnicht; selbe problem wie gehabt (falls das eigentlich hätte behoben sein sollen)
Zuletzt bearbeitet von Mr X am 19:33:42 11.02.2010, insgesamt 1-mal bearbeitet
getch funktioniert garnicht; selbe problem wie gehabt
Hast Du den Stack-Pointer auch gegenüber program.c verändert für das weitere Programm hello.c (oder test.c oder was auch immer)? Ist offenbar notwendig. Darüber müssen wir noch diskutieren.
start.asm:
Ich weiß nicht ob das schon irgendwo aufgenommen wurde: Nach dem Programmstart (hello.elf, clear.elf) wird der Prompt nicht wieder neu gezeichnet. Habs jetzt auch nochmal in VirtualBox getestet, wo's auch perfekt läuft.
_________________ Mein System zum testen von PrettyOS:
AMD64 X2 5200+;4 GB RAM;> 500 GB HDD
QEMU;Windows VirtualPC;VirtualBox
mit echter Floppy: (klappt offenbar nicht überall lt. Cuervo)
- FAT lesen zu langsam (umbauen auf einmaliges Lesen der gesamten FAT in ein Array, dann evtl. nur die Blöcke von 12 Bit entziffern, die wirklich für ein File beim Laden gebraucht werden)
- #define FATMAXINDEX 150 ///TEST <--- nur als Test brauchbar, denn der Wert kann überschritten werden (momentaner work-around: floppy disk vor dem Aufspielen der Files formatieren), dann #PF als Ergebnis
Allgemein:
- Zeichenausgaben (incl. Farbe) geraten beim Taskwechsel noch allgemein durcheinander (Kritische Ressourcen während Benutzung allokieren für eine Task --> "critical section")
- shell: Eingabe "hello.elf" --> sucht nach ".elf" (Eingabe-Algo überarbeiten)
Simulationen:
- MS Virtual PC liest nicht von Floppy
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 19:46:57 12.02.2010, insgesamt 1-mal bearbeitet
(1,4,5 geht, wenn ich das richtig sehe; 2 u. 3 werden als ".ELF" gewertet) als
Code:
"HELLO ELF"
Code:
"HELLO ELF"
Code:
"HELLO ELF"
interpretiert wird. Da habe ich mich irgendwie verhaspelt, das ging sogar schon.
Zitat:
Ebenso was externe Programme betrifft.
Das machen wohl einige momentan. Gute Ideen werden hier gerne gesehen. Man muss ja nur hello.c austauschen gegen eigenen Code. Allerdings sind die userlib.h/c und die syscalls noch ziemlich rudimentär. Anregungen werden gerne entgegen genommen.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 19:46:01 12.02.2010, insgesamt 5-mal bearbeitet
funktioniert es, also eine Ersetzung in Zeile 152 der benannten Datei.
Ohne diese Änderung gibt es einen Pufferüberlauf auf dem Stack, somit wird "name" überschrieben und am Ende kommt ".ELF" raus ("name" beginnt mit '\0').
Wir loggen das IRC nicht zentral mit, daher ist das "Forum" ein wichtiges Kommunikationsmedium, in dem der Fortschritt und die Wirren von PrettyOS festgehalten werden sollten. Daher die Bitte, alle wichtigen Beiträge hier ebenfalls einzupflegen.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
PrettyOS erkennt nur großgeschriebene Dateien, ein Fehler, den ich sehr spät bemerkt habe..-.- Ist etwas ungünstig, da ich aus Gewohnheit immer kleine Buchstaben verwende.
Aber ich habe ein anderes Problem: Wenn ich hello.elf starte und weiter Backspace mache, als eigentlich möglich ist (und danach dann normal weiterspiele), bekomme ich beim Beenden einen Pagefault:
Ohne in den Code gesehen zu haben würde ich raten, dass da ein Stackoverflow geschieht: Vermutlich wird die Eingabe des Benutzers in einem Array auf dem Stack gespeichert. Wenn man zu oft Backspace drückt, dann wird der ganze Stack mit \b (also 0x08) überschrieben und dann werden am Ende des Programms die gespeicherten Register vom Stack geholt (so entstehen 0x08080808 in EBX, ECX, ESI, (EDI) und EBP). Dahinter steht dann wohl noch eine C-Funktion, die am Ende den Stackframe mit "mov esp,ebp" und "pop ebp" aufzulösen versucht. Erstere Funktion führt dazu, dass 0x08080808 in ESP geladen wird und die zweite zieht zuerst 4 von ESP ab (sodass 0x08080804 drinsteht) und versucht dann, einen Wert von dieser Adresse zu laden. Diese ist offensichtlich nicht gemappt und das führt dann zum PF an dieser Adresse.
q.e.d.
EDIT: PS, bitte mal die Vordergrundfarbe bei Panics ändern. Dieses Dunkelrot ist echt nicht zu erkennen, da macht man sich die Augen kaputt. Hellrot wäre besser.
komisch, also wenn ich z.B. hello eingebe, wird daraus HELLO .ELF und hello.elf wird nur gefunden, wenn es groß geschrieben ist (auf der Diskette)...
Natürlich wird daraus HELLO.ELF, auf FAT wird Groß- und Kleinschreibung nicht unterschieden und es ist vorgeschrieben, dass Dateinamen als Großbuchstaben (zumindest ohne VFAT) gespeichert werden.
mag sein, PrettyOS zeigt jedenfalls hello.elf unter fdir an statt HELLO.ELF und findet es nicht, vermutlich weil die Eingabe in Großbuchstaben umgewandelt wird.
vermutlich weil die Eingabe in Großbuchstaben umgewandelt wird
Wie gesehen, machen wir das FAT12-gerecht. Kleinschreibung ist nicht vorgesehen für Filename und Extension. Wenn also von anderen Sytemnen auf die Diskette geschrieben wird, bitte nur Großschreibung verwenden.
Wenn es dich momentan stört, nimmst Du das toupper(entry); eben raus.
Damit haben wir den üblichen Konflikt zwischen Windows Client und Linux Server, wenn ich das richtig sehe.
Wie wird das allgemein im OSDEV-Bereich gehandhabt?
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Also ist das ein Fehler, weil die Datei ja hello.elf und nicht HELLO.ELF heißt.
Bei FAT ist es (ohne VFAT) halt einfach vorgeschrieben, dass der Dateiname großgeschrieben wird. Deshalb gibt es keinen Unterschied zwischen "hello.elf" und "HELLO.ELF".
Der Zug bewegt sich bei mir immer unter Bochs nur weiter, wenn ich eine Taste drücke (oder ist das Absicht?).
Ja, das hat sich so ergeben, weil wir den inneren Loop nun nicht in der gesamten Shell, sondern nur in getch drehen (siehe Definition von getch in user-Lib). Wir fangen die vom Kernel zurück gegebene 0 dort ab.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 20:56:32 21.02.2010, insgesamt 1-mal bearbeitet
Unter VirtualBox v3.1.4 r57640 stürtz PrettyOS Rev. 120 ab. Scheinbar geschieht dies, nachdem das Datum ausgegeben wird. Falls jemand interesse an der Log-Datei von VBox hat, ist diese hier zu finden: http://anubis2k5.bplaced.net/VBox.log
Unter Qemu läuft das OS normal.
_________________ Mein System zum testen von PrettyOS:
AMD64 X2 5200+;4 GB RAM;> 500 GB HDD
QEMU;Windows VirtualPC;VirtualBox
Das Problem ist bekannt und auch mit Microsoft Virtual PC läuft PrettyOS derzeit nicht, anscheinend gibt es auch Probleme mit einigen echten PCs, die damit vlt. zusammenhängen.
2. Uhr läuft ca. 2x zu schnell unter Virtual Box 3.1.4
3. Dieser Fehler ist etwas komplizierter zu beschreiben und ich hab ihn auch schon geschildert, wobei Erhard und ich nicht zu einer Lösung gekommen sind (Im IRC). Bevor das in Vergessenheit gerät, kommt hier die Fehlerbeschreibung (Ich hab das Verhalten auch noch etwas genauer Analysiert):
Das Problem tritt in Userprogrammen bei der Texteingabe auf. Die Backspace-Taste funktioniert nicht richtig, wenn man versucht, das erste Zeichen der Zeile zu löschen: Es wird das erste Zeichen dieser Zeile und das letzte Zeichen der vorigen Zeile gelöscht. Der Schreibcursor springt dann auch in die vorige Zeile. Testsystem: Virtual Box 3.1.4; Der Fehler tritt meines Wissens nach auch mit anderen Simulationen auf, komischerweise hab aber bislang nur ich ihn reproduzieren können .
mfg und in der Hoffnung, das die Fehler gefunden und behoben werden
Mr X
Nachdem ich mir gets() näher beguckt hab, bin ich zu dem Schluss gekommen, das der Fehler mglw. eher in getch() o.ä. zu suchen ist.
Abgesehen davon denke ich, das z.20 und 21 von einem else-Block umschlossen werden sollten; Es ist imho wohl eher nicht sinnvoll, Die Felder, wo gelöscht wurde mit dem Wert 8 zu füllen, nachdem man sie grad zuvor mit 0 gefüllt hat.
An gets(...) wird immer noch herum gemeckert.
Bei mir klappt es soweit. Grund für Probleme liegt vermutlich an anderer Stelle. Eingegebener String kommt sauber an. Rücksprung auf obere Zeile nur selten (muss mit dem Taskwechsel zusammen hängen, den man ja ausschalten kann in der Funktion <--- wurde von MrX getestet: brachte nichts). Mysteriös.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 01:32:42 25.02.2010, insgesamt 1-mal bearbeitet
[elf.c:74]: (style) struct or union member 'elf_header_t::shoff' is never used
[elf.c:75]: (style) struct or union member 'elf_header_t::flags' is never used
[elf.c:76]: (style) struct or union member 'elf_header_t::ehsize' is never used
[elf.c:79]: (style) struct or union member 'elf_header_t::shentrysize' is never used
[elf.c:80]: (style) struct or union member 'elf_header_t::shnum' is never used
[elf.c:81]: (style) struct or union member 'elf_header_t::shstrndx' is never used
[elf.c:101]: (style) struct or union member 'program_header_t::paddr' is never used
[elf.c:104]: (style) struct or union member 'program_header_t::flags' is never used
[elf.c:105]: (style) struct or union member 'program_header_t::align' is never used
[fat12.c:676]: (style) The scope of the variable j can be reduced
[paging.c:33]: (style) struct or union member '__attribute__::ext' is never used
[video.c:177]: (style) The scope of the variable temp can be reduced
[../tools/src/CreateFloppyImage.cpp:30]: (style) struct or union member 'BootSector::ignore1' is never used
[../tools/src/CreateFloppyImage.cpp:31]: (style) struct or union member 'BootSector::oem_name' is never used
[../tools/src/CreateFloppyImage.cpp:38]: (style) struct or union member 'BootSector::media_destriptor_byte' is never used
[../tools/src/CreateFloppyImage.cpp:40]: (style) struct or union member 'BootSector::sectors_per_track' is never used
[../tools/src/CreateFloppyImage.cpp:41]: (style) struct or union member 'BootSector::head_count' is never used
[../tools/src/CreateFloppyImage.cpp:42]: (style) struct or union member 'BootSector::hidden_sectors' is never used
[../tools/src/CreateFloppyImage.cpp:43]: (style) struct or union member 'BootSector::sector_count_ex' is never used
[../tools/src/CreateFloppyImage.cpp:44]: (style) struct or union member 'BootSector::drive_number' is never used
[../tools/src/CreateFloppyImage.cpp:45]: (style) struct or union member 'BootSector::ignore2' is never used
[../tools/src/CreateFloppyImage.cpp:46]: (style) struct or union member 'BootSector::boot_signature' is never used
[../tools/src/CreateFloppyImage.cpp:47]: (style) struct or union member 'BootSector::volume_serial' is never used
[../tools/src/CreateFloppyImage.cpp:48]: (style) struct or union member 'BootSector::fs_name' is never used
[../tools/src/CreateFloppyImage.cpp:50]: (style) struct or union member 'BootSector::bootloader' is never used
[../tools/src/CreateFloppyImage.cpp:51]: (style) struct or union member 'BootSector::bootloader_sig' is never used
[../user/user_program_c/userlib.c:418]: (style) The scope of the variable i can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced
[../user/user_test_c/userlib.c:418]: (style) The scope of the variable i can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced
[elf.c:74]: (style) struct or union member 'elf_header_t::shoff' is never used
[elf.c:75]: (style) struct or union member 'elf_header_t::flags' is never used
[elf.c:76]: (style) struct or union member 'elf_header_t::ehsize' is never used
[elf.c:79]: (style) struct or union member 'elf_header_t::shentrysize' is never used
[elf.c:80]: (style) struct or union member 'elf_header_t::shnum' is never used
[elf.c:81]: (style) struct or union member 'elf_header_t::shstrndx' is never used
[elf.c:101]: (style) struct or union member 'program_header_t::paddr' is never used
[elf.c:104]: (style) struct or union member 'program_header_t::flags' is never used
[elf.c:105]: (style) struct or union member 'program_header_t::align' is never used
[fat12.c:676]: (style) The scope of the variable j can be reduced
[paging.c:33]: (style) struct or union member '__attribute__::ext' is never used
[video.c:177]: (style) The scope of the variable temp can be reduced
[../tools/src/CreateFloppyImage.cpp:30]: (style) struct or union member 'BootSector::ignore1' is never used
[../tools/src/CreateFloppyImage.cpp:31]: (style) struct or union member 'BootSector::oem_name' is never used
[../tools/src/CreateFloppyImage.cpp:38]: (style) struct or union member 'BootSector::media_destriptor_byte' is never used
[../tools/src/CreateFloppyImage.cpp:40]: (style) struct or union member 'BootSector::sectors_per_track' is never used
[../tools/src/CreateFloppyImage.cpp:41]: (style) struct or union member 'BootSector::head_count' is never used
[../tools/src/CreateFloppyImage.cpp:42]: (style) struct or union member 'BootSector::hidden_sectors' is never used
[../tools/src/CreateFloppyImage.cpp:43]: (style) struct or union member 'BootSector::sector_count_ex' is never used
[../tools/src/CreateFloppyImage.cpp:44]: (style) struct or union member 'BootSector::drive_number' is never used
[../tools/src/CreateFloppyImage.cpp:45]: (style) struct or union member 'BootSector::ignore2' is never used
[../tools/src/CreateFloppyImage.cpp:46]: (style) struct or union member 'BootSector::boot_signature' is never used
[../tools/src/CreateFloppyImage.cpp:47]: (style) struct or union member 'BootSector::volume_serial' is never used
[../tools/src/CreateFloppyImage.cpp:48]: (style) struct or union member 'BootSector::fs_name' is never used
[../tools/src/CreateFloppyImage.cpp:50]: (style) struct or union member 'BootSector::bootloader' is never used
[../tools/src/CreateFloppyImage.cpp:51]: (style) struct or union member 'BootSector::bootloader_sig' is never used
[../user/user_program_c/userlib.c:418]: (style) The scope of the variable i can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced
[../user/user_test_c/userlib.c:418]: (style) The scope of the variable i can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced
[elf.c:74]: (style) struct or union member 'elf_header_t::shoff' is never used
[elf.c:75]: (style) struct or union member 'elf_header_t::flags' is never used
[elf.c:76]: (style) struct or union member 'elf_header_t::ehsize' is never used
[elf.c:79]: (style) struct or union member 'elf_header_t::shentrysize' is never used
[elf.c:80]: (style) struct or union member 'elf_header_t::shnum' is never used
[elf.c:81]: (style) struct or union member 'elf_header_t::shstrndx' is never used
[elf.c:101]: (style) struct or union member 'program_header_t::paddr' is never used
[elf.c:104]: (style) struct or union member 'program_header_t::flags' is never used
[elf.c:105]: (style) struct or union member 'program_header_t::align' is never used
[fat12.c:676]: (style) The scope of the variable j can be reduced
[paging.c:33]: (style) struct or union member '__attribute__::ext' is never used
[video.c:177]: (style) The scope of the variable temp can be reduced
[../tools/src/CreateFloppyImage.cpp:30]: (style) struct or union member 'BootSector::ignore1' is never used
[../tools/src/CreateFloppyImage.cpp:31]: (style) struct or union member 'BootSector::oem_name' is never used
[../tools/src/CreateFloppyImage.cpp:38]: (style) struct or union member 'BootSector::media_destriptor_byte' is never used
[../tools/src/CreateFloppyImage.cpp:40]: (style) struct or union member 'BootSector::sectors_per_track' is never used
[../tools/src/CreateFloppyImage.cpp:41]: (style) struct or union member 'BootSector::head_count' is never used
[../tools/src/CreateFloppyImage.cpp:42]: (style) struct or union member 'BootSector::hidden_sectors' is never used
[../tools/src/CreateFloppyImage.cpp:43]: (style) struct or union member 'BootSector::sector_count_ex' is never used
[../tools/src/CreateFloppyImage.cpp:44]: (style) struct or union member 'BootSector::drive_number' is never used
[../tools/src/CreateFloppyImage.cpp:45]: (style) struct or union member 'BootSector::ignore2' is never used
[../tools/src/CreateFloppyImage.cpp:46]: (style) struct or union member 'BootSector::boot_signature' is never used
[../tools/src/CreateFloppyImage.cpp:47]: (style) struct or union member 'BootSector::volume_serial' is never used
[../tools/src/CreateFloppyImage.cpp:48]: (style) struct or union member 'BootSector::fs_name' is never used
[../tools/src/CreateFloppyImage.cpp:50]: (style) struct or union member 'BootSector::bootloader' is never used
[../tools/src/CreateFloppyImage.cpp:51]: (style) struct or union member 'BootSector::bootloader_sig' is never used
[../user/user_program_c/userlib.c:418]: (style) The scope of the variable i can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced
[../user/user_program_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced
[../user/user_test_c/userlib.c:418]: (style) The scope of the variable i can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp1 can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp2 can be reduced
[../user/user_test_c/userlib.c:419]: (style) The scope of the variable temp3 can be reduced
Die Scope-Warnungen hab ich schonmal gefixt:
fat12.c:
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
1 2 3 4 5 6 7 8 9 10 11 12 13
void parse_dir(uint8_t* a, int32_t in, struct dir_entry* rs)
{
int32_t i = (in %DIR_ENTRIES) * 32;
Irrelevantes à la "use fgets instead of gets" entfernt
Ist schon berechtigt, denn momentan kann man locker über den Puffer hinaus schreiben. Damit kann man sich in unser OS "hinein hacken". Das gets sollten wir wirklich implizit in ein "fgets" mit stdin als file verwandeln.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 21:02:56 26.02.2010, insgesamt 1-mal bearbeitet
Die "FloppyImage.bin" funktioniert unter/auf "MS Virtual-PC" einigermaßen perfekt. Allerdings gibt es ein Problem in der "ckernel.c" bzw. in der "time.c":
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
1 2 3 4 5 6 7 8 9 10 11 12 13
// ckernel.c Revision 151
if (CurrentSeconds!=CurrentSecondsOld)
{
itoa(CurrentSeconds, timeBuffer);
getCurrentDateAndTime(DateAndTime); // <- arbeitet nicht korrekt
strcat(DateAndTime, " ");
strcat(DateAndTime, timeBuffer);
strcat(DateAndTime, " seconds since start.");
// output in status bar
printf(DateAndTime, 49, 0xC);
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
// ckernel.c Revision 151
if (CurrentSeconds!=CurrentSecondsOld)
{
itoa(CurrentSeconds, timeBuffer);
getCurrentDateAndTime(DateAndTime); // <- arbeitet nicht korrekt
strcat(DateAndTime, " ");
strcat(DateAndTime, timeBuffer);
strcat(DateAndTime, " seconds since start.");
// output in status bar
printf(DateAndTime, 49, 0xC);
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
// ckernel.c Revision 151
if (CurrentSeconds!=CurrentSecondsOld)
{
itoa(CurrentSeconds, timeBuffer);
getCurrentDateAndTime(DateAndTime); // <- arbeitet nicht korrekt
strcat(DateAndTime, " ");
strcat(DateAndTime, timeBuffer);
strcat(DateAndTime, " seconds since start.");
// output in status bar
printf(DateAndTime, 49, 0xC);
}
"getCurrentDateAndTime" arbeitet wie ein "strcat". Darum wird der String pro Aufruf immer länger. Nach spätestens drei Aufrufen blockiert die VM, was heißt, daß "nichts mehr geht".
Leider bin ich zu doof dafür um mir ein PrettyOS selbst zu kompilieren. Deshalb mußte ich die "FloppyImage.bin" reversen.
Das könnte inzwischen auch einfacher geworden sein: Wir haben ein neues makefile. Das hilft, wenn Du es unter Windows versuchst, da msys nicht mehr nötig ist.
"getCurrentDateAndTime" arbeitet wie ein "strcat". Darum wird der String pro Aufruf immer länger. Nach spätestens drei Aufrufen blockiert die VM, was heißt, daß "nichts mehr geht".
Danke für den Hinweis. Sehr wichtig, da wir Sun VB für USB EHCI Tests brauchen!
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Das kompilieren unter Windows sollte eig. auch nicht mehr so schwer sein ;-)
Das Problem mit dem Absturz unter VPC und VB hat ehenkes übrigens soeben behoben.
Dafür hab ich folgendes entdeckt:
Wir haben einen Schreibcursor. Dies hab ich erst jetzt gemerkt, da er bei mir nur unter Microsoft Virtual PC funktioniert (Nutze ich selten). Qemu und Virtual Box zeigen ihn schlichtweg nicht an.
Das dürfte ein Fehler sein.
Die zu schnelle Uhr unter Virtual Box besteht auch weiterhin.
Nochmal ich: Revision 163 läuft unter VBox mehr oder wenige in einer Endlosschleife. Ständig wiederholt sich der USB-Status. Befehle scheinen aber abgearbeitet zu werden. Unter Qemu hingegen läuft das System normal.
_________________ Mein System zum testen von PrettyOS:
AMD64 X2 5200+;4 GB RAM;> 500 GB HDD
QEMU;Windows VirtualPC;VirtualBox
Ja, Das Problem hatte ich auch. "mingw32-make.exe" findet die "i586-elf-gcc.exe" nicht. Versuch mal die "Umgebungsvariablen" korrekt zu setzen, so wie Cuervo es hier im ersten Beitrag beschrieben hat ( -> pdf).
Mr X schrieb:
Die zu schnelle Uhr unter Virtual Box besteht auch weiterhin.
Das liegt an der "systemTimer_setFrequency" aus der "timer.c" Das "command byte" sollte besser auf "Mode 2" gesetzt werden:
Wir haben einen Schreibcursor. Dies hab ich erst jetzt gemerkt, da er bei mir nur unter Microsoft Virtual PC funktioniert (Nutze ich selten).
Qemu und Virtual Box zeigen ihn schlichtweg nicht an. Das dürfte ein Fehler sein.
Der "Schreibcursor" ist ein Feature von "Virtual-PC". Wenn die "update_cursor" aus der "video.c" so hier verändert wird:
Zum Fehler gerade warum sich VirtualBox bei mir mit einem Fehler verabschiedet:
Es sieht so aus als wenn nach dem Aktiveren von Paging in den Bereich zwischen 0 und 20 mb geschrieben wird. Dieser Bereich ist zwar gemappt, aber (Außer 0xB8000) nicht zum schreiben freigegeben. Setze ich in paging.c in Zeile 252 noch MEM_WRITE läuft es. Wo das passiert und warum das scheinbar nur bei mir auftritt hab ich noch nicht überprüft.
Wenn die KERNEL.BIN nach dem Kompilieren größer 52.732 Bytes ist, dann bleiben VPC und VB schon beim Booten stecken.
Das Problem ist in der "Fat12.inc" und dort ab Label "LoadFile:".
Kurz gesagt, wenn BX ein "Wrap-Around" macht (was heißt von z.B. 0xFF00 + 0x0200 auf 0x0100 kommt), dann muß das Segmentregister ES entsprechend aktualisiert werden (i.e. ES = ES + 0x0100).
Anderenfalls überschreibt "ReadSectors" via [es:bx] etwas und/oder bleibt einfach im "int 0x13" stecken.
Danke für den Hinweis. Ich habe die kernel.bin zunächst auf ca. 50 KB verkleinert (ab Rev. 175), damit wir da nicht anstoßen. Aber da muss uns was einfallen.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 19:23:44 05.03.2010, insgesamt 1-mal bearbeitet
Zunächst einmal, entschuldigt bitte, daß ich noch bei Revision 175 bin. Aber ich schreibe gerade an einem Userprogramm, welches auf Festplatten zugreifen kann. Dazu mussten einige Dateien geändert werden und ich habe keine Lust, sie bei jeder neuen Revision wieder zu ändern.
Eigentlich soll das ja ein Kerneltreiber werden. Aber die großzügigen Debugausgaben und ein kleines Menü zur bequemeren Bedienung beim Testen (typisch Windowser) haben leider den Umfang der KERNEL.BIN gesprengt.
Nun zum Thema:
Wenn man in der Shell versehentlich eine falsche Eingabe macht, dann werden auch "leere" Einträge angezeigt. Das stört etwas beim Testen. Bislang löse ich das Problem via "Hotfix":
;******************************************************************************
; LoadFile ()
; ES:SI File to load
; EBX:BP Buffer to load file to
; AX Return value: success 0, error -1
;******************************************************************************
LoadFile:
xorecx, ecx; size of file in sectors
pushecx
.FIND_FILE:
pushbx; BX=>BP points to buffer to write to; store it for later
pushbp call FindFile ; find our file. ES:SI contains our filename
cmpax, -1
jne .LOAD_IMAGE_PRE
popbp popbx popecx movax, -1
ret
; get starting cluster
pushword ROOT_SEG ;root segment loc
popes movdx, WORD [es:di + 0x001A] ; DI points to file entry in root directory table. Refrence the table...
mov WORD [cluster], dx; file's first cluster
popbx; get location to write to so we dont screw up the stack
popes pushbx; store location for later again
pushes call LoadFAT
.LOAD_IMAGE:
; load the cluster
movax, WORD [cluster] ; cluster to read
popes; bx:bp=es:bx
popbx call Convert_Cluster_to_LBA
xorcx, cx movcl, BYTE [SecPerClus]
call ReadSectors
popecx incecx pushecx pushbx pushes movax, FAT_SEG ;start reading from fat
moves, ax xorbx, bx
; get next cluster
movax, WORD [cluster] ; identify current cluster
movcx, ax; copy current cluster
movdx, ax; copy current cluster
shrdx, 1 ; divide by two
addcx, dx; sum for (3/2)
movbx, 0 ;location of fat in memory
addbx, cx movdx, WORD [es:bx]
testax, 1 ; test for odd or even cluster
jnz .ODD_CLUSTER
.EVEN_CLUSTER:
anddx, 0000111111111111b ; take low 12 bits
jmp .DONE
.ODD_CLUSTER:
shrdx, 4 ; take high 12 bits
.DONE:
mov WORD [cluster], dx cmpdx, 0x0ff0 ; test for EOF
jb .LOAD_IMAGE
;******************************************************************************
; LoadFile ()
; ES:SI File to load
; EBX:BP Buffer to load file to
; AX Return value: success 0, error -1
;******************************************************************************
LoadFile:
xorecx, ecx; size of file in sectors
pushecx
.FIND_FILE:
pushbx; BX=>BP points to buffer to write to; store it for later
pushbp call FindFile ; find our file. ES:SI contains our filename
cmpax, -1
jne .LOAD_IMAGE_PRE
popbp popbx popecx movax, -1
ret
; get starting cluster
pushword ROOT_SEG ;root segment loc
popes movdx, WORD [es:di + 0x001A] ; DI points to file entry in root directory table. Refrence the table...
mov WORD [cluster], dx; file's first cluster
popbx; get location to write to so we dont screw up the stack
popes pushbx; store location for later again
pushes call LoadFAT
.LOAD_IMAGE:
; load the cluster
movax, WORD [cluster] ; cluster to read
popes; bx:bp=es:bx
popbx call Convert_Cluster_to_LBA
xorcx, cx movcl, BYTE [SecPerClus]
call ReadSectors
popecx incecx pushecx pushbx pushes movax, FAT_SEG ;start reading from fat
moves, ax xorbx, bx
; get next cluster
movax, WORD [cluster] ; identify current cluster
movcx, ax; copy current cluster
movdx, ax; copy current cluster
shrdx, 1 ; divide by two
addcx, dx; sum for (3/2)
movbx, 0 ;location of fat in memory
addbx, cx movdx, WORD [es:bx]
testax, 1 ; test for odd or even cluster
jnz .ODD_CLUSTER
.EVEN_CLUSTER:
anddx, 0000111111111111b ; take low 12 bits
jmp .DONE
.ODD_CLUSTER:
shrdx, 4 ; take high 12 bits
.DONE:
mov WORD [cluster], dx cmpdx, 0x0ff0 ; test for EOF
jb .LOAD_IMAGE
;******************************************************************************
; LoadFile ()
; ES:SI File to load
; EBX:BP Buffer to load file to
; AX Return value: success 0, error -1
;******************************************************************************
LoadFile:
xorecx, ecx; size of file in sectors
pushecx
.FIND_FILE:
pushbx; BX=>BP points to buffer to write to; store it for later
pushbp call FindFile ; find our file. ES:SI contains our filename
cmpax, -1
jne .LOAD_IMAGE_PRE
popbp popbx popecx movax, -1
ret
; get starting cluster
pushword ROOT_SEG ;root segment loc
popes movdx, WORD [es:di + 0x001A] ; DI points to file entry in root directory table. Refrence the table...
mov WORD [cluster], dx; file's first cluster
popbx; get location to write to so we dont screw up the stack
popes pushbx; store location for later again
pushes call LoadFAT
.LOAD_IMAGE:
; load the cluster
movax, WORD [cluster] ; cluster to read
popes; bx:bp=es:bx
popbx call Convert_Cluster_to_LBA
xorcx, cx movcl, BYTE [SecPerClus]
call ReadSectors
popecx incecx pushecx pushbx pushes movax, FAT_SEG ;start reading from fat
moves, ax xorbx, bx
; get next cluster
movax, WORD [cluster] ; identify current cluster
movcx, ax; copy current cluster
movdx, ax; copy current cluster
shrdx, 1 ; divide by two
addcx, dx; sum for (3/2)
movbx, 0 ;location of fat in memory
addbx, cx movdx, WORD [es:bx]
testax, 1 ; test for odd or even cluster
jnz .ODD_CLUSTER
.EVEN_CLUSTER:
anddx, 0000111111111111b ; take low 12 bits
jmp .DONE
.ODD_CLUSTER:
shrdx, 4 ; take high 12 bits
.DONE:
mov WORD [cluster], dx cmpdx, 0x0ff0 ; test for EOF
jb .LOAD_IMAGE
.SUCCESS:
popes popbx popecx xorax, ax ret
%endif
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Wenn ReadSectors im "int 0x13" stecken bleibt, dann mag es sein, daß der Puffer [ES:BX] ungültig ist. Aber das kann ja nicht sein. 0xFE00 + 0x0200 (BytesPerSec) wäre dann genau die "Kante", also eigentlich ok.
Die Sache ist schwieriger als gedacht. Einen Hotfix hätte ich schon, aber den poste ich lieber nicht weil der die Denkweise von angehenden Programmierern bis in alle Ewigkeit versauen würde.
Probiert jetzt mal, falls Zeit und Spaß vorhanden, soviele Userprogramme wie möglich zu schreiben und bindet sie alle gleichzeitig mit ein. Die Userprogramme sollten möglichst "fett" und "verschwenderisch" sein, z.B. ein Menü, welches nur etwas anzeigt und sonst "nichts" macht.
Falls ihr das Problem noch nicht gelöst habt, es macht mehr Sinn bei einem Pointer ES:BX, BX immer "0" zu lassen und 0x20 (512bytes bei einem Segment-Register um 8 bits nach rechts geshiftet) auf es zu addieren, so umgeht ihr das 64kb Problem.
Das Hauptproblem beim Laden der KERNEL.BIN lag lustigerweise in der "boot2.asm". Dort wird der Stack bei Label "entry_point:" wieder auf 0000:FFFF gesetzt. Dadurch gerät er in Konflikt mit allem, was ab 0000:0500 bereits geladen wurde (und noch wird).
In der "Fat12.inc" gibt es einen "Denkfehler". BP ist kein Segmentregister. [BP:BX] geht nicht, aber [BP+BX] geht.
Hier die sehr grob "gefixten" Versionen der boot2.asm und der Fat12.inc, damit der Spaß beim Programmieren weitergehen kann.
Änderungen sind mit "==HOTFIX==" gekennzeichnet. Zumindest sollte damit jetzt eine KERNEL.BIN > 57 KB problemlos geladen werden.
Wie gesagt, ist nur sehr grob gefixt. Ab ca. 118 KB ist der Spaß wieder vorbei. Offenbar kommt sich da noch mehr ins Gehege. Ist zu erwarten, daß in nächster Zeit die KERNEL.BIN 118 KB erreicht? Eigentlich wollte ich an meinem Userprogramm weiterbasteln.
Eig. ist das nicht zu erwarten... Zumindest nicht in den nächsten paar Wochen. (Wenn Du Zeit&Lust hättest wär es natürlich schon schön, wenn Du auch die 118KB-Grenze beheben könntest, aber das ist nicht so eilig ).
Mach ruhig erstmal an Deinem Userprog weiter. wir haben ja grad mal 52 KB erreicht.
Via Hotfix sind ca. 250 KB möglich. Unangenehmerweise enthält der Bootloader fest vergebene Adressen, die sich langsam ins Gehege kommen. Aber darum kann man sich auch später noch kümmern.
Hier mal ein Screenshot von meinem Userprogramm. PrettyOS lernt grade, was eine "Festplatte" ist.
Ohne mir den Source-Code jetzt angeguckt zu haben, werfe ich einfach mal UnrealMode ein (kann sein das ihr das schon nutzt).
Wie ladet ihr denn den Kernel, wird er erst komplett geladen und dann an eine andere Position verschoben/kopiert, wenn ja, dann kann man das immer gleich machen braucht so nur nen Buffer der so groß ist wie ein Cluster und kann (UnrealMode vorausgesetzt) Dateien beliebiger Größe laden.
Nun gibt es aber ein Problem in der "time.c" mit dem Wochentag. Der Grund dafür ist, einfach gesagt, daß es zwei verschiedene "Arten" vom CMOS gibt:
1. Register 0x06 zählt von 1 bis 7,
2. Register 0x06 zählt von 0 bis 6.
Per Software kann man nicht herausfinden, ob Register 0x06 von 1 bis 7 oder von 0 bis 6 zählt. Deshalb wäre es besser wenn der Wochentag anhand des Datums ausgerechnet wird. Dazu muß man nur von einem bekannten Datum bis heute die Anzahl vergangener Tage ausrechnen und dann einfach modulo 7.
Der 01.01.1900 ist immer eine gute Idee. Der ist zufälligerweise ein Montag.
Ohja, stimmt, da gabs ja ein Problem mit Bochs+Fließkommazahlen...
Ich werde ein Workaround erzeugen, kommt bald!
EDIT: Ich hab mir mal Bochs runtergeladen und PrettyOS damit gestartet: Ich konnte keinen Fehler feststellen...
Bochs-Version: 2.4.2
PrettyOS: Rev. 210
Zuletzt bearbeitet von Mr X am 12:20:36 12.03.2010, insgesamt 2-mal bearbeitet
Offenbar scheint die Sun VirtualBox "gewisse" Problemchen mit dem USB-Support unter "gewissen" Host-Betriebssystemen zu haben.
Wenn man folgendes macht:
1. VM starten,
2. im Menü der VM (Geräte->USB-Geräte) ein "USB-Gerät" auswählen (möglichst das richtige ),
3. die VM "neu starten" (Maschine->Zurücksetzen)
Zwei Sachen, die immer wieder erfolgen, wenn man neu aufbaut:
1) del wird nicht gefunden, weil msys oder wie jetzt bei mir auf einem alternativen PC Win-AVR mit den entsprechden Pfaden auf der Platte hängen. Da muss man die entsprechenden Pfade eliminieren. Wir verwenden daher auch kein msys mehr.
2) Das makfile bleibt hier bei [initrd] hängen:
Code:
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
E:\PrettyOS\trunk\Source>del FloppyImage.bin
E:\PrettyOS\trunk\Source\FloppyImage.bin konnte nicht gefunden werden
E:\PrettyOS\trunk\Source>tools\mingw32-make OS=WINDOWS
nasm -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloader
/boot.bin
nasm -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage2_bootloade
r/BOOT2.BIN
del *.o
E:\PrettyOS\trunk\Source\*.o konnte nicht gefunden werden
mingw32-make: *** [initrd] Error 1
Code:
1 2 3 4 5 6 7 8 9 10 11
E:\PrettyOS\trunk\Source>del FloppyImage.bin
E:\PrettyOS\trunk\Source\FloppyImage.bin konnte nicht gefunden werden
E:\PrettyOS\trunk\Source>tools\mingw32-make OS=WINDOWS
nasm -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloader
/boot.bin
nasm -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage2_bootloade
r/BOOT2.BIN
del *.o
E:\PrettyOS\trunk\Source\*.o konnte nicht gefunden werden
mingw32-make: *** [initrd] Error 1
Code:
1 2 3 4 5 6 7 8 9 10 11
E:\PrettyOS\trunk\Source>del FloppyImage.bin
E:\PrettyOS\trunk\Source\FloppyImage.bin konnte nicht gefunden werden
E:\PrettyOS\trunk\Source>tools\mingw32-make OS=WINDOWS
nasm -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloader
/boot.bin
nasm -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage2_bootloade
r/BOOT2.BIN
del *.o
E:\PrettyOS\trunk\Source\*.o konnte nicht gefunden werden
mingw32-make: *** [initrd] Error 1
Dieser Fehler ist hässlich, weil man die Lösung nicht leicht findet, zumindest geht es mir immer so.
Es liegt an den beiden "delete *.o", die in den targets ckernel und initrd nichts finden, make-fehler produzieren und deshalb blockieren. Diese beiden kommen nun einfach weg! Könnte dann nur einen Linker Error geben.
Diese beiden Punkte sind die typischen Probleme, denen man beim Einstieg in den Build-Prozess seitens Windows evtl. begegnen kann.
Vorschlag mastamind im IRC: mit den wildcards nur die source dateien auflisten (nicht zwei mal)
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 01:20:59 17.03.2010, insgesamt 6-mal bearbeitet
Ich kann mich an alte DOS Zeiten nur schwer erinnern, aber bestand nicht die Möglichkeit mittels Errorleveln die Rückgabewerte eben von "Del" abzufangen und darauf zu reagieren? Helft mir wenn ich falsch liege...
Nachtrag: Del liefert den Errorlevel 1 zurück, wenns nicht erfolgreich war. Alternativ kann man mittels "exist" vielleicht probieren, ob die entsprechende Datei existiert - mit etwas aufwand ist damit vielleicht auch eine Prüfung von mehreren Datein möglich.
_________________ Mein System zum testen von PrettyOS:
AMD64 X2 5200+;4 GB RAM;> 500 GB HDD
QEMU;Windows VirtualPC;VirtualBox
Zuletzt bearbeitet von anubis2k5 am 20:36:21 17.03.2010, insgesamt 2-mal bearbeitet
Ja, genau so wurde make ausgestoppt. Daher habe ich die beiden del *.o ab Rev. 245 erstmal gestrichen, damit sie auf diese Weise niemand beim Einstieg behindern.
Danke für deinen Hinweis. Vielleicht schafft das jemand.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
VMWARE, VPC, VB und mein "realer" PC zeigen in der Statuszeile ca. 2400 MHz an. (In etwa auch korrekt). BOCHS allerdings nur 49 MHz . Liegt aber daran, daß BOCHS bei rdtsc einen "eigenen" Zähler zurückgibt.
Worauf soll eigentlich beim USB-Treiber geachtet werden? Zumindest auf dem "realen" PC reagiert er auf ein "PSTS_CONNECTED_CHANGE" und zeigt dabei äußerst wortreich viele bunte Zahlen an.
@+gjm+: Danke für den Hinweis! Dies war aber leider nicht die Fehlerursache.
Wir schaffen es einfach nicht, bei extended capabilities im EHCI dem BIOS die Herrschaft zu entreißen!
Siehe Rev. 258, da habe ich endlich mal richtig gecheckt, ob das überhaupt klappt. Vorher hatten wir da eine Fehlauswertung im Sinne von if(failed){print: alles ok}. Bei mir ergibt sich BIOS: 1 und OS: 0. Es macht auch keinen Sinn beides auf 1 zu zwingen, sonst hat man einen Gladiatorenkampf.
XanClic sieht momentan keinen logischen Fehler im Code. Vielleicht ist mit einer Funktion (pci read/write) was falsch, oder wir kapieren etwas noch nicht.
// pci bus data
uint8_t bus = pciDev_Array[num].bus;
uint8_t dev = pciDev_Array[num].device;
uint8_t func = pciDev_Array[num].func;
eecp = BYTE2(pCapRegs->HCCPARAMS);
printformat("\nDeactivateLegacySupport: eecp = %x\n",eecp);
/*
cf. EHCI 1.0 spec, 2.2.4 HCCPARAMS - Capability Parameters, Bit 15:8 (BYTE2)
EHCI Extended Capabilities Pointer (EECP). Default = Implementation Dependent.
This optional field indicates the existence of a capabilities list.
A value of 00h indicates no extended capabilities are implemented.
A non-zero value in this register indicates the offset in PCI configuration space
of the first EHCI extended capability. The pointer value must be 40h or greater
if implemented to maintain the consistency of the PCI header defined for this class of device.
*/
// cf. http://wiki.osdev.org/PCI#PCI_Device_Structure
// eecp // RO - This field identifies the extended capability.
// 01h identifies the capability as Legacy Support.
uint32_t NextEHCIExtCapPtr = eecp + 1; // RO - 00h indicates end of the ext. cap. list.
uint32_t BIOSownedSemaphore = eecp + 2; // R/W - only Bit 16 (Bit 23:17 Reserved, must be set to zero)
uint32_t OSownedSemaphore = eecp + 3; // R/W - only Bit 24 (Bit 31:25 Reserved, must be set to zero)
uint32_t USBLEGCTLSTS = eecp + 4; // USB Legacy Support Control/Status (DWORD, cf. EHCI 1.0 spec, 2.1.8)
// pci bus data
uint8_t bus = pciDev_Array[num].bus;
uint8_t dev = pciDev_Array[num].device;
uint8_t func = pciDev_Array[num].func;
eecp = BYTE2(pCapRegs->HCCPARAMS);
printformat("\nDeactivateLegacySupport: eecp = %x\n",eecp);
/*
cf. EHCI 1.0 spec, 2.2.4 HCCPARAMS - Capability Parameters, Bit 15:8 (BYTE2)
EHCI Extended Capabilities Pointer (EECP). Default = Implementation Dependent.
This optional field indicates the existence of a capabilities list.
A value of 00h indicates no extended capabilities are implemented.
A non-zero value in this register indicates the offset in PCI configuration space
of the first EHCI extended capability. The pointer value must be 40h or greater
if implemented to maintain the consistency of the PCI header defined for this class of device.
*/
// cf. http://wiki.osdev.org/PCI#PCI_Device_Structure
// eecp // RO - This field identifies the extended capability.
// 01h identifies the capability as Legacy Support.
uint32_t NextEHCIExtCapPtr = eecp + 1; // RO - 00h indicates end of the ext. cap. list.
uint32_t BIOSownedSemaphore = eecp + 2; // R/W - only Bit 16 (Bit 23:17 Reserved, must be set to zero)
uint32_t OSownedSemaphore = eecp + 3; // R/W - only Bit 24 (Bit 31:25 Reserved, must be set to zero)
uint32_t USBLEGCTLSTS = eecp + 4; // USB Legacy Support Control/Status (DWORD, cf. EHCI 1.0 spec, 2.1.8)
// pci bus data
uint8_t bus = pciDev_Array[num].bus;
uint8_t dev = pciDev_Array[num].device;
uint8_t func = pciDev_Array[num].func;
eecp = BYTE2(pCapRegs->HCCPARAMS);
printformat("\nDeactivateLegacySupport: eecp = %x\n",eecp);
/*
cf. EHCI 1.0 spec, 2.2.4 HCCPARAMS - Capability Parameters, Bit 15:8 (BYTE2)
EHCI Extended Capabilities Pointer (EECP). Default = Implementation Dependent.
This optional field indicates the existence of a capabilities list.
A value of 00h indicates no extended capabilities are implemented.
A non-zero value in this register indicates the offset in PCI configuration space
of the first EHCI extended capability. The pointer value must be 40h or greater
if implemented to maintain the consistency of the PCI header defined for this class of device.
*/
// cf. http://wiki.osdev.org/PCI#PCI_Device_Structure
// eecp // RO - This field identifies the extended capability.
// 01h identifies the capability as Legacy Support.
uint32_t NextEHCIExtCapPtr = eecp + 1; // RO - 00h indicates end of the ext. cap. list.
uint32_t BIOSownedSemaphore = eecp + 2; // R/W - only Bit 16 (Bit 23:17 Reserved, must be set to zero)
uint32_t OSownedSemaphore = eecp + 3; // R/W - only Bit 24 (Bit 31:25 Reserved, must be set to zero)
uint32_t USBLEGCTLSTS = eecp + 4; // USB Legacy Support Control/Status (DWORD, cf. EHCI 1.0 spec, 2.1.8)
Solange KERNEL und USER den gleichen "Videobereich" (0xB8000) für Ausgaben nutzen, sollte KERNEL nach erfolgreicher Ausführung von "elf_exec" auf eigene Ausgaben verzichten. Sonst gerät die Ausgabe vom USER u.U. völlig durcheinander:
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// file.c revision 271
int32_t flpydsk_load(const char* name, const char* ext)
{
(...)
if( elf_exec( file, f.size ) ) // <- falls erfolgreich ...
{
}
(...)
// printf("\n\n"); // <- ... sollte auf ausgaben ab hier verzichtet werden
flpydsk_control_motor(false); // <- hier drin dann auch
sleepSeconds(3);
return 0;
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// file.c revision 271
int32_t flpydsk_load(const char* name, const char* ext)
{
(...)
if( elf_exec( file, f.size ) ) // <- falls erfolgreich ...
{
}
(...)
// printf("\n\n"); // <- ... sollte auf ausgaben ab hier verzichtet werden
flpydsk_control_motor(false); // <- hier drin dann auch
sleepSeconds(3);
return 0;
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// file.c revision 271
int32_t flpydsk_load(const char* name, const char* ext)
{
(...)
if( elf_exec( file, f.size ) ) // <- falls erfolgreich ...
{
}
(...)
// printf("\n\n"); // <- ... sollte auf ausgaben ab hier verzichtet werden
flpydsk_control_motor(false); // <- hier drin dann auch
sleepSeconds(3);
return 0;
}
(Betrifft aber nicht die Statuszeilen).
Die Wirksamkeit des VirtualBox-Workaround kann ich nicht bestätigen. Bei mir hat VB ein Problem mit dem Host. Manchmal kann VB der gestarteten VM USB zur Verfügung stellen, manchmal aber auch nicht. Das hängt wahrscheinlich vom Wetter ab. Aber es liegt garantiert nicht am IRQ in der VM von VB. (Wäre ja erschreckend, wenn es so wäre).
VBox und Qemu (Version mit EHCI) laufen momentan am besten. Bei Bochs und VPC fehlen EHCI, und bei VMWare kommt leider nur 00h zurück im IN qTD anstelle 12h etc. Bei realer Hardware klappt es entweder gut oder erst nach einigen Anläufen. Bei Tobikings Laptop macht das BIOS Anstalten und gibt den Staffelstab nicht an den EHCI-Treiber ab, obwohl wir alles brav nach Lehrbuch (Intel PRM) durchführen.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Du hast mich zwar nicht direkt gefragt, sag aber, wo Du es ansprichst, auch mal was dazu, ehenkes
Ich denke, wir brauchen langfristig mehrere Konsolen.
Daher schlage ich vor: Eine Log-Konsole, wo alle Ausgabe außer der Statusleiste hinkommt.
Plus n User-Konsolen, wo man Programme ausführen kann.
Vlt. kann die Log-Konsole auch eine Steuerungskonsole sein, von der aus zusätzlich zur Log-Funktion Befehle ausgeführt werden, wobei Programme dabei in andere Konsolen umgeleitet werden, in die man dann umschalten kann.
VMs reagieren unterschiedlich auf gleichen Code. Wenn bei PrettyOS irgendwas auf Anhieb nicht funktioniert, ist bei mir erstmal die/eine VM dran schuld. Danach erst eventuelle geringfügige Programmierfehler im Quellcode.
Zum Thema:
Eine VM mit MS-DOS als "Gast" (oder wie das sonst heißt) kann die "neuen" Dateien auf der FloppyImage.bin nicht lesen, da ... siehe oben.
Mehr Programme gehen bald (vmtl. rev 294). Derzeit gibts noch eine Blockade in der Shell, die das verhindert (Mit Absicht, sonst stören sich die Progs alle gegenseitig)
EDIT: Seit Rev. 294 gehts.
Zuletzt bearbeitet von Mr X am 21:29:16 29.03.2010, insgesamt 1-mal bearbeitet
Erst ab Rev. 295 läuft das Multikonsolen-System von MrX sehr gut. Wir mussten die shell auf einen anderen Stackpointer setzen als die restlichen User-Programme. Das verstehen wir nicht wirklich. Hier das start.asm:
Jarvix (im IRC) meint, dass es am User-Stack liegt, den wir nicht richtig für jede User-App allokieren. Die Methode in start.asm sei falsch für viele Programme.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 21:55:39 30.03.2010, insgesamt 2-mal bearbeitet
Revision 295
Es gibt tatsächlich ein Paging-Problem:
Assembler Code:
; user\user_tools\start.asm 295
_start:
; mov esp, 0x600000 ; stackpointer
movesp, 0x01402000 ; <- solange das problem nicht beseitigt ist
Assembler Code:
; user\user_tools\start.asm 295
_start:
; mov esp, 0x600000 ; stackpointer
movesp, 0x01402000 ; <- solange das problem nicht beseitigt ist
Assembler Code:
; user\user_tools\start.asm 295
_start:
; mov esp, 0x600000 ; stackpointer
movesp, 0x01402000 ; <- solange das problem nicht beseitigt ist
Wenn der Stack der USER mit Adresse 0x600000 inititialisiert wird, benutzen sämtliche USER einen identischen Stack (und somit auch identische lokale Variablen (was heißt Adresse und Wert sämtlicher lokalen Variablen sind bei sämtlichen USERN identisch (sofern man ein Programm mehrmals startet). ( <- Hoffentlich kam das verständlich rüber .).
Irgendwie wird Adresse 0x600000 (und KERNELs 0x500000) nicht korrekt "gepaged".
Wenn KERNEL (Shell) und alle USER die 0x01402000 benutzen, gibt es keine Probleme. Ein (dann neues) Problem gäbe es erst, wenn die Shell und/oder die Userprogramme > 0x2000 Bytes wären.
wobei wir nicht 0x600000, sondern 0x5fffff nehmen sollten.
Nein, da ein PUSH zuerst ESP um vier verringert und dann den Wert auf den Stack legt. Somit führt ESP==0x600000 dazu, dass das erste PUSH den Wert nach 0x5FFFFC legt (im Übrigen sollte man wohl besser keinen unalignten Stack benutzen, der Wert sollte IMO besser immer an vier ausgerichtet sein).
@XanClic: ja, ist richtig. Sorry, da hat Jarvix mich irritiert.
@+gjm+: danke, wir nehmen nun 0x1420000 als gemeinsame virtuelle Stackadresse, allokieren aber für jedes User-Programm in create_task und nicht nur einmal in paging_install. Damit sind die physikalischen Speicheradressen wirklich verschieden.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Offensichtlich wird da wohl versucht, was auf den Stack zu legen, das klappt aber nicht (warum auch immer, ob die Page jetzt wirklich Read-Only ist, wie es angezeigt wird, oder ob sie nicht für den Usermode ist) und das Programm verabschiedet sich mit einer Protection Violation.
EDIT: OK, das Problem bestand darin, dass man offensichtlich erstmal make clean ausführen muss, was ich nicht getan habe. Jetzt läuft es.
Lag offenbar daran, dass immer noch 0x500000 vorgegeben wurde durch alte Dateien, jetzt aber 0x1420000. Nach Update auch bei XanClic: "Na ja, es scheint zu funktionieren".
Bei mir läuft es aber auf real PC noch nicht, stürzt bei Eingabe in TTT ab.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
memsetw! Das "* 2" bewirkt, daß doppelt soviel Speicher überschrieben wird wie eigentlich gedacht. Das könnte auch der Fehler sein, warum TTT auf dem realen PC nicht läuft. VMs schummeln ja immer.
//memset((void*)tictactoe, 0, 18); // tictactoe has two bytes!
memset((void*)tictactoe, 0, sizeof(tictactoe));
C/C++ Code:
//memset((void*)tictactoe, 0, 18); // tictactoe has two bytes!
memset((void*)tictactoe, 0, sizeof(tictactoe));
C/C++ Code:
//memset((void*)tictactoe, 0, 18); // tictactoe has two bytes!
memset((void*)tictactoe, 0, sizeof(tictactoe));
Aber folgendes stört weiterhin:
C/C++ Code:
memset((void *)ph->vaddr, 0, ph->memsz); // to set the bss (Block Started by Symbol) to zero
C/C++ Code:
memset((void *)ph->vaddr, 0, ph->memsz); // to set the bss (Block Started by Symbol) to zero
C/C++ Code:
memset((void *)ph->vaddr, 0, ph->memsz); // to set the bss (Block Started by Symbol) to zero
Sollte das den Absturz auf dem realen PC verhindern, dann wird irgendwo im Quellcode auf nicht initialisierte Variablen zugegriffen.
Das wiederum wird der tatsächliche Grund für den Absturz sein.
elf.c, line 138
Hier wird ein Pointer auf die Instanz ph vom Typ struct program_header_t auf konkrete Werte gesetzt, wenn ich mich nicht täusche, oder?
Es stürzt nichts mehr ab, alles läuft gut. Nur einige alte PC von Cuervo machen unverständliche Probleme mit Floppy/DMA beim Laden.
C/C++ Code:
memset((void*)tictactoe, 0, sizeof(tictactoe));
C/C++ Code:
memset((void*)tictactoe, 0, sizeof(tictactoe));
C/C++ Code:
memset((void*)tictactoe, 0, sizeof(tictactoe));
Danke, wird so eingebaut.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 18:49:30 02.04.2010, insgesamt 6-mal bearbeitet
Die VMs haben es mal wieder voll drauf. VMWARE initialisiert das eingestellte RAM bei Start nicht mit Null. Das hat zur Folge, daß die BSS-Sektion der KERNEL.BIN nicht mit Null, sondern mit Speichermüll (bzw. eigentlich überhaupt nicht) initialisiert wird. Darum läuft VMWARE z.Zt. nicht. Ein übler Hack könnte das Problem beseitigen:
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
// ckernel.c 362
int main()
{
//.bss 0x00052de0 0x26b24 -> steht so in der KERNEL.MAP und kann jedesmal anders sein
memset((void *)0x00052de0, 0, 0x26b24); //
init();
(...)
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11
// ckernel.c 362
int main()
{
//.bss 0x00052de0 0x26b24 -> steht so in der KERNEL.MAP und kann jedesmal anders sein
memset((void *)0x00052de0, 0, 0x26b24); //
init();
(...)
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11
// ckernel.c 362
int main()
{
//.bss 0x00052de0 0x26b24 -> steht so in der KERNEL.MAP und kann jedesmal anders sein
memset((void *)0x00052de0, 0, 0x26b24); //
init();
(...)
}
Hoffentlich fällt Euch was besseres ein, da das auch die realen PCs betrifft.
Danke für den Hinweis! Wir hatten das früher schon mal in kernel.asm, wurde offenbar entfernt, weil der Kernel keine elf-Datei ist, sondern binär. Das passt aber auch gut zu Beginn von init() in main().
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 18:36:47 14.04.2010, insgesamt 1-mal bearbeitet
@ +gjm* et.al.: wir könnten mal jemand brauchen, der uns bei EHCI noch einige Tipps gibt, was da bei real Hardware noch schief läuft. Manchmal haben wir J-State anstelle Hi-Speed (könnte ein Zeitproblem sein), und bei modernen PCs mit ext. capabilities noch Host System Error, den wir nicht verstehen. Da hängen wir noch, was den USB-Fortschritt hemmt. Da wäre konkrete Hilfe durch Spürnasen sehr viel wert. Zum Glück läuft das Ganze bei qemu. Da kann man unter Win aber keine USB-devices vom Host durchreichen, soweit ich weiß.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 11:13:10 15.04.2010, insgesamt 2-mal bearbeitet
Bei der Entwicklung des USB-Treibers gibt es mittlerweile zuviele mögliche Fehlerursachen. Beispielsweise kann die Ursache für den "Host System Error" auch ein völlig anderes PCI-Gerät gewesen sein.
Um die möglichen Fehlerursachen drastisch einzuschränken, stelle ich mal zur Diskussion, den USB-Treiber unabhängig von PrettyOS zu entwickeln.
Dazu müsste eine Version von PrettyOS aufs wesentliche reduziert werden (PM, ev. Paging, Eingabe, Ausgabe). Diese Version könnte dann umbennant werden in PrettyDD (Pretty Driver Development ) und soll einzig und alleine nur für die Entwicklung von Treibern dienen. Auf/mit PrettyDD entwickelte Treiber sollten dann problemlos ins (one and only) PrettyOS integriert werden können.
Beispielsweise kann die Ursache für den "Host System Error" auch ein völlig anderes PCI-Gerät gewesen sein.
Das veretehe ich noch nicht ganz, wie wir durch eine "abgespeckte stabile Version" bei der EHCI-Entwicklung Fehler durch andere PCI-Geräte ausschließen können. An welche Geräte denkst Du da konkret und wie schließe ich deren Fehler sicher aus? Welche Module würdest Du hier konkret weg lassen?
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 01:30:27 16.04.2010, insgesamt 1-mal bearbeitet
Das könnte man aber möglicherweise auch über einen #define _TEST_EHCI_ Schalter bewirken. Wenn der gesetzt ist, dann wird z.B. Netzwerk, vielleicht auch Floppy usw. nicht aktiviert.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Laut pciScan() benutzen mehrere PCI-Geräte den selben irq. So läßt sich nicht herausfinden, welches Gerät den Handler via irq aufgerufen hat bzw. darf nur das EHCI-Gerät den Handler aufrufen. Allerdings wird auf meinem realen PC ein "Host System Error" auch ausgelöst, wenn versucht wird, statt EHCI OHCI (was heißt das falsche Gerät) zu initialisieren.
Das Wort "Unsinn" bezog sich nicht auf deinen Vorschlag, +gjm+, sondern auf ehenkes Makro-Idee.
Ich denke, es wäre sinnvoller, einen Branch dafür anzulegen, anstatt den Codes mit Makros aufzublähen, die die meisten nicht bräuchten.
das zeigt bei dem PC, der Host System Error alarmiert, folgendes:
- capabilities list
- fast back to back transaction
- master abort
für "fast back to back transaction" steht bei low level:
Zitat:
Wenn diese Bit gesetzt ist bedeutet dasss dass das betreffende PCI-Gerät die minimal schnelleren Back-to-Back Transfers unterstützt. Als Target werden diese Transfers immer unterstützt, aber als Master dürfen diese Transfers nur benutzt werden falls das Bit 9 im Command-Register gesetzt ist.
bezüglich master abort: nix
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Der Kommentar aus dem Manual betrifft PSTS_PORT_RESET und nicht PSTS_POWERON.
Mein realer PC hat lt. Scan 10 USB-Ports. Davon sind aber nur 9 "von außen" verfügbar. Deshalb wird ein Port (jedesmal der gleiche) ständig als "power on, enabled, EHCI owned" angezeigt. Unabhängig davon ob nun ein USB-Gerät "eingeklinkt" ist/wird oder nicht. Dieser Port zeigt auch (ganz selten aber) mal "J-Status" an.
Außerdem kann es ganz, ganz, ganz selten passieren, daß die untere Statuszeile nach > 200 Sekunden für eine Sekunde Unsinn anzeigt (z.B. 55:55:5555 als Uhrzeit).
Besser die Deskriptoren zu aller erst installieren und danach den "Rest". VMWARE hatte mal in früheren Revisionen in "kernel_console_init" Mist gemacht woraus dann ein Triplefault resultierte. USB rev 391 funktioniert auf meinem realen PC auch.
stimmt, der einmalige Aufruf einer Funktion ging bisher immer recht gut, nur die Abfolge macht Probleme. Schau dir bitte mal die rev. 435 an.
Noch besser: die Version 436 mit aktiviertem #define _USB_DIAGNOSIS_ (ging vorher nicht fehlerfrei)
Ich habe noch ein "test unit ready" vor "inquiry" gesetzt, dann hakt es beim IN-endpoint bei "inquiry" aus, was zuvor an Platz eins bestens lief. Der QH/qTD-Code ist also prinzipiell ok.
Nimmt man zweimal inquiry hintereinander:
- erstes läuft gut
- beim zweiten "inquiry" wird der IN-QueueHead nicht mehr ausgeführt
Mit Rev. 441 haben wir eine erste stabile Plattform bei USB Mass Storage Device erzielt. Wenn sich dies stabilisiert können wir die Floppy bald in "Rente" schicken.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Rev. 444 zeigt den oberflächlichen Grund, warum Transfers nicht laufen (qTD Status 0x80 (= active bit7) wird nicht zurück gesetzt und qTD nicht ausgeführt):
Es liegt am NAK counter. Setzt man RL (reload Nak Counter) auf 15 (4-bit-value), dann findet man bei manchen Devices NAK counter = 0, also 15 mal NAK. Dann bleibt der EHCI hilflos stehen.
Hier schickt der Host zuerst einmal das Datenpaket, kann das Gerät dieses nicht annehmen, antwortet es mit NAK. Wenn es das Paket empfangen kann, antwortet es mit ACK, wenn das Gerät danach noch ein Paket aufnehmen kann oder mit NYET, wenn nicht. Hat der Host ACK empfangen, so sendet er das nächste Paket. Hat er allerdings ein NYET oder ein NAK erhalten, dann beginnt er nun mit PING-Paketen. Das Gerät muss mit NAK antworten, wenn es immer noch kein Paket empfangen kann, oder mit ACK, wenn es nun bereit ist. Dies verringert die Anzahl an sinnlos gesendeten Daten natürlich erheblich. Das Gerät kann hierbei sogar angegeben, wann das nächste PING-Paket gesendet werden soll (der Host muss dies aber nicht befolgen).
Der NAK counter zählt auch NYET, wenn ich das richtig verstanden habe.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 20:59:59 09.05.2010, insgesamt 1-mal bearbeitet
Wenn man alles Unmögliche ausgeschlossen hat, muss in dem, was noch übrigbleibt, so unwahrscheinlich es auch scheinen mag, die Wahrheit zu finden sein.
^^ In diesem Sinne:
Nach jedem Aufruf von usbSendSCSIcmd (usb2_msd.c) geht das verloren, was der Aufruf von usbTransferSetConfiguration (usb2.c) in checkPortLineStatus (ehci.c) bewirkt hatte.
Ich habe das jetzt objektiv getestet:
1) lief auch schon vorher auf real PC
2) es gibt in der Tat usb-sticks, die die configuration zurück auf 0 setzen! Kann man mit getConfig ja vorher testen
3) aber jetzt kommt es:
Zitat:
PrettyOS [Version 0.0.0.449] Console 1: EHCI Ports
--------------------------------------------------------------------------------
USB2: SET_CONFIGURATION 1>!
USB2: GET_CONFIGURATION>! 1
OUT part
asyncList: 01667000h <-- QH_Out CommandQTD: 01669000h
before aS:
curr QH: 01667000h next QH: 01667000h
curr qTD: 00000000h next qTD: 01669000h
NAK counter: 0>!
after aS:
curr QH: 01667000h next QH: 01667000h
curr qTD: 01669000h next qTD: 00000000h
NAK counter: 15
IN part
asyncList: 01668000h <-- QH_In
handshakeQTD: 0166B000h StatusQTD: 0166D000h DataQTD: 0166F000h
before aS:
curr QH: 01668000h next QH: 01668000h
curr qTD: 00000000h next qTD: 0166F000h
NAK counter: 0>!
after aS:
curr QH: 01668000h next QH: 01668000h
curr qTD: 0166B000h next qTD: 00000000h
NAK counter: 15
00h 80h 02h 02h 1Fh 00h 00h 00h 6Dh 65h 6Dh 6Fh 72h 79h 00h 00h 55h 53h 42h 32h
2Eh 30h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 31h 2Eh 30h 30h
memoryUSB2.01.00
Command Passed ("good status")
qTD Status: 01h Do Ping<-- command
qTD Status: 00h OK (no bit set)<-- data
qTD Status: 00h OK (no bit set)<-- status
USB2: GET_CONFIGURATION>! 0
USB2: SET_CONFIGURATION 1>!
USB2: GET_CONFIGURATION>! 0
Vor "inquiry" ist alles ok.
Nach "inquiry" sitzt die configuration auf 0 (bedeutet unkonfiguriert) und lässt sich aber auch nicht mehr gerade biegen auf 1.
@+gjm+: Echt Superklasse dein Fund! Wie machst du das bloß?
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 22:40:20 11.05.2010, insgesamt 4-mal bearbeitet
Ich sehe drei Fälle:
1) MSD device ist unempfindlich gegen falschen handshake (bei mir zwei 16 GB sticks und der 512 MB stick)
2) MSD device ist empfindlich gegen handshake, man kann aber die config wieder setzen (das war der Fund von +gjm+)
3) empfindlich, nicht reaparierbar, also trotz "setzen" kommt die config nicht mehr (mein 1 GB stick und Tobiking's Laptop mit seinem stick)
Der Fund von +gjm+, mein 1 GB stick und der Beweis bei Tobiking's Laptop, das waren wichtige Puzzleteile.
Der Meilenstein wurde erreicht!
Ein gewaltiger Dank gebührt +gjm+. Er begleitet PrettyOS seit den Anfängen in absolut konstruktiver Weise. Ihm gebührt ein Platz in der "Hall of Fame" unserer kleinen OS-Community.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 23:23:01 11.05.2010, insgesamt 1-mal bearbeitet
Handshake --> Konfiguration von 1 auf 0 ---> set_config(1) (+gjm+) ---> Nebeneffekt: setzt die toggles der device endpoints auf 0 --> mehrfach fehlerhaftes Programm läuft.
Nun wurde im bulk-Transfer der Handshake entfernt, und es wird sauber getogglet.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 00:11:07 13.05.2010, insgesamt 2-mal bearbeitet
BL2 hatte im Fat12.inc offenbar mit dem kernel-Laden nach 0x3000 bis ... seinen eigenen Stack bei 0x1FFFF überschrieben, was wir durch Versetzen des Stacks nach 0x3FFFF beseitigen konnten. Allerdings bietet dieses Fat12.inc noch Optimierungspotential, weil sich dort bugs und hotfixes irgendwie die Waage halten.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
ich habe mit "bochs" ein problem mit dem laden des images. mir scheint, als ob der bootloader stage1 geladen wird, danach aber ein abbruch kommt. die version von prettyos habe ich nun nicht im kopf, weis aber das ckernel.c die version "0.0.0.530" hat.
###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file="C:\Program Files\Bochs-2.4.5\BIOS-bochs-latest"
vgaromimage: file="C:\Program Files\Bochs-2.4.5\VGABIOS-lgpl-latest"
# what disk images will be used
floppya: 1_44="C:\prettyos\trunk\Source\FloppyImage.img", status=inserted
#floppyb: 1_44=floppyb.img, status=inserted
# hard disk
#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
# choose the boot disk.
boot: a
# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx
#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
# where do we send log messages?
log: C:\prettyos\trunk\Source\bochsout.txt
# disable the mouse, since DLX is text only
mouse: enabled=0
# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so
# in the DLX Linux example I'm enabling keyboard_mapping so that paste
# will work. Cut&Paste is currently implemented on win32 and X windows only.
###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file="C:\Program Files\Bochs-2.4.5\BIOS-bochs-latest"
vgaromimage: file="C:\Program Files\Bochs-2.4.5\VGABIOS-lgpl-latest"
# what disk images will be used
floppya: 1_44="C:\prettyos\trunk\Source\FloppyImage.img", status=inserted
#floppyb: 1_44=floppyb.img, status=inserted
# hard disk
#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
# choose the boot disk.
boot: a
# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx
#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
# where do we send log messages?
log: C:\prettyos\trunk\Source\bochsout.txt
# disable the mouse, since DLX is text only
mouse: enabled=0
# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so
# in the DLX Linux example I'm enabling keyboard_mapping so that paste
# will work. Cut&Paste is currently implemented on win32 and X windows only.
###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file="C:\Program Files\Bochs-2.4.5\BIOS-bochs-latest"
vgaromimage: file="C:\Program Files\Bochs-2.4.5\VGABIOS-lgpl-latest"
# what disk images will be used
floppya: 1_44="C:\prettyos\trunk\Source\FloppyImage.img", status=inserted
#floppyb: 1_44=floppyb.img, status=inserted
# hard disk
#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
# choose the boot disk.
boot: a
# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx
#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
# where do we send log messages?
log: C:\prettyos\trunk\Source\bochsout.txt
# disable the mouse, since DLX is text only
mouse: enabled=0
# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so
# in the DLX Linux example I'm enabling keyboard_mapping so that paste
# will work. Cut&Paste is currently implemented on win32 and X windows only.
die version von prettyos habe ich nun nicht im kopf, weis aber das ckernel.c die version "0.0.0.530"
0.0.0.530 ist die Version
Vielleicht hilft als erste Maßnahme ein Update auf 0.0.1.9, es kann sein, das Du eine Version hast, die Fehler enthält. Bei mir zumindest funktioniert Version 0.0.1.9 unter Bochs.
Kommen irgendwelche Fehlermeldungen? Es gab mal Probleme mit Bochs, das einen Fehler in der KeyQueue gefunden haben wollte, und deshalb panisch wurde. Da kam dann eine Fehlermeldung. Der scheint aber inzwischen weg zu sein, "panic: action=ignore" ist nicht mehr nötig im brxc-File um PrettyOS auszuführen.
danke dir mir scheint aber eher, als ob meine bochs installation kapput ist... auf realer hardware laufen beide versionen... na, darum kümmere ich mich gleich mal...
im IRC:
<somone>MrX: ich habe mal versucht ein userprogramm zu schreiben mit, fgets u. fputc, aber qemu bringt fehlermeldungen, das ich nicht schreiben oder lesen kann...
<somone>FLOPPY ERROR: fdctrl_write_data: can't write data in status mode
<somone>FLOPPY ERROR: fdctrl_read_data: can't read data in CMD state
EDIT: ich habe die syscall-Nr. korrigiert
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 11:33:36 07.08.2010, insgesamt 1-mal bearbeitet
Da dies der Testthread von PrettyOS ist ,wollte ich meinen Test wiedergeben.
Also ich habe das Image des .tar.gz Archives verwendet ,welches ich von ehenkes bekommen habe.
Dies habe ich natürlich prompt mit meiner Sun VirtualBox unter meinem Ubuntu getestet.
Die Hardwareerkennung schien gut zu laufen zumindest ,wenn es nach der Ausgabe von PrettyOS ging.
Dann bin ich in der ,für meine Verhältnisse unübersichtlichen, Shell gelandet.
Sie ist deswegen unübersichtlich ,weil unter und über der Eingabe ,in der die eingegebenen Zeichen erscheinen, Text beziehungsweise ein Zug zu sehen ist und man erst suchen muss.
Als ich damit zurecht gekommen bin habe ich help eingeben und die implementierten Funktionen/Befehle getestet.
Alles hat funktioniert außer reboot.
Und noch etwas ,was aber wahrscheinlich so gehört, ist ,dass mit dem Befehl fformat das Floppyimage nicht mehr PrettyOS gebootet hat.
Also in diesem Sinne einen Gruß von mir und hoffentlich hilft euch mein Rückblick.
tev
PrettyOS 0.0.1.166 - Rev: 744
wenn ich hello starte und in konsole m strg+t ausführe, landet der ausdruck bei konsole 0, also bei hello (unerwartetes verhalten)
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
zwischen svn rev. 579 und 580 ging das strg+s "kaputt". Test: img in qemu starten, strg+s, fdir (directory zerstört)
Der erste Screenshot (strg+s) überschreibt boot2.bin (cluster #2 u. #3) und den ersten cluster (#4) von kernel.bin. Damit kann qemu PrettyOS nicht mehr starten.
Dass dies über eine lange Strecke nicht entdeckt wurde, zeigt, wir brauchen einen vorgeschriebenen Testablauf, zumindest alle 10 commits, damit wir zeitnah Fehler entdecken. Hier bitte ich um Vorschläge.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 13:30:36 13.08.2010, insgesamt 4-mal bearbeitet
/// TEST static uint32_t i=0;
i++;
printf("\tfputc %u ",i);
/// TEST
if (retVal == 1)
{
/// TEST
printf("OK ");
if (i==4098)
{
waitForKeyStroke();
}
/// TEST return(CE_GOOD);
}
return CE_WRITE_ERROR;
}
Damit kann man den FAT_putc verfolgen. Nach dem 4098ten (video screen + zeilenumbruch) FAT_fputc wird qemu gestoppt und abgebrochen. Schaut man sich dann per EDITDISK boot2.bin und kernel.bin mit dem hex-editor an, so stellt man fest, dass diese Dateien unbeschädigt sind. screen.txt ist angelegt mit Größe 0 byte. Es fehlt also noch der dir-entry-Eintrag.
Lässt man das waitForKeyStroke() durch Bestätigung in qemu weiter laufen, so wird boot.bin komplett mit 0 überschrieben und kernel.bin im ersten Sector genullt.
Fazit: FAT_putc richtet hier keinen direkten Schaden an.
Hierbei fällt bei strg+s im unteren Bereich nur die Zahl "sector 19" an. Die Daten des Screenshots werden beginnend ab 0x51000 (sector 648 = 617+31) abgelegt. Dies führt auch nicht weiter.
Die Daten, die z.Z. überschrieben werden, beginnen ab sector 33.
---------------
... und weiter gehts:
C/C++ Code:
static uint32_t fatWrite (FAT_partition_t* volume, uint32_t currCluster, uint32_t value, bool forceWrite)
{
/// TEST
printf("\nfatWrite: currCluster %u value %X", currCluster, value);
/// TEST
C/C++ Code:
static uint32_t fatWrite (FAT_partition_t* volume, uint32_t currCluster, uint32_t value, bool forceWrite)
{
/// TEST
printf("\nfatWrite: currCluster %u value %X", currCluster, value);
/// TEST
C/C++ Code:
static uint32_t fatWrite (FAT_partition_t* volume, uint32_t currCluster, uint32_t value, bool forceWrite)
{
/// TEST
printf("\nfatWrite: currCluster %u value %X", currCluster, value);
/// TEST
<DerHartmut>
Testen: Jede sinnvolle Plattform, sprich: Mindestens 3 Virtuelle Maschinen und 2 Real-PCs (wenn nicht möglich dann halt nicht möglich), Funktion der Änderung testen, ggf. Testcode einbauen (bei Commit wieder entfernen), eventuelle Wechselwirkungen beachten und andere Stellen testen, falls Wechselwirkungen vorhanden.
Also ich persönlich <DerHartmut> mache das so
1. Code schreiben
2. Compillieren, bis er sauber durchbaut
3. Testcode schreiben (falls nötig), mit printf() mögliche Ausgaben ausgeben
4. Ist vom Code noch anderer Code betroffen?
5. Rekursion!
6. Alles klappt? Testcode entfernen, nochmal durchbauen
7. Committen
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 17:04:18 13.08.2010, insgesamt 2-mal bearbeitet
Vorbemerkung: Unerkannte Bugs sind ein echtes Problem, weil sie an unpassender Stelle zuschlagen können, vor allem in Kombination, und Verwirrung stiften.
Bugs müssen zeitnah erkannt werden, da man so am besten reagieren kann. Daher wird hier ein systematischer Test vorgeschlagen.
Dinge, die man ständig beim Ausführen von PrettyOS implizit testet, werden ausgelassen, z.B. Boot-Verhalten.
Zitat:
Test für PrettyOS (sollte alle 10 commits durchgeführt und dokumentiert werden):
---------------------------------------------------------------------------------
CPU:
FPU-Test (should be implemented at ESC+f)
Memory:
recognized correctly? (should be implemented at ESC+m)
Keyboard:
Are AltGr keys recognized? Test known combinations of strg+key or ESC+key?
Video/Monitor:
Physical Address of grafics card?
Which vbe modes are shown?
Does vbe grafics work properly?
Tasking/Scheduler:
Start different programs in their own consoles. Check with strg+t.
Change freqency at timer_install(100). Try 1000 Hz.
Floppy Disk Device:
Please test the sequence strg+s, fdir, strg+s, fdir.
Load "arrow" two times.
USB mass storage devices:
Try FAT16 and FAT32 (and FAT12 if possible):
Please test the sequence strg+u, strg+u, strg+u. Test the Directory and the content of screenshot (3 texts in "screen.txt").
Networking:
Describe environment. Test ARP reply, PING reply. All incoming packets recognized?
User Library:
Load program "test" (to be developed).
Bitte um Mithilfe, diesen Test weiter auszuarbeiten.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 17:53:38 20.08.2010, insgesamt 2-mal bearbeitet
Neben der Optimierung des äußeren Testens (eigentlich Overhead) gilt es, folgende Strategie verstärkt zu beachten:
1) Loggen/Visualisieren
2) Internes Testen durch PrettyOS selbst
3) Verstärkte Kommunikation bezüglich Änderungen bei Memory und Prozess Management (hier sind ausführliches Loggen und Tests bei mehreren Umgebungen unerlässlich, um Fehler möglichst früh zu detektieren und zu debuggen)
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Wir tappen bei dem Fehler bislang im dunkeln. Ich fasse mal hier kurz zusammen, was ich festgestellt habe (auch um selbst den Überblick zu behalten):
Das bloße abstellen des neuen Cachings (z. 616 auskommentieren) bewirkt keine Besserung (aber natürlich eine Lese-Verlangsamung, weil für jeden Sektor der Track neu gelesen wird (trackweise!)).
-> Am Caching liegt es nicht.
Eine Umstellung auf sektorweises Lesen bewirkt keine Fehler bei strg+s.
-> Es hat was mit dem trackweisen Lesen zu tun
Leert man den DMA_BUFFER, bevor man schreibt (und schreibt anschließend das rein, was man schreiben will), verändert dies den Zustand des Floppyimages nach strg+s. Korrekt wäre, wenn sich nichts ändern würde am Verhalten.
-> Es scheint, als würde fälschlicherweise ein ganzer Track (oder zumindest mehr aus dem DMA_BUFFER als nötig) geschrieben.
Zuletzt bearbeitet von Mr X am 23:04:51 05.09.2010, insgesamt 1-mal bearbeitet
Erklärung: Die meisten Floppy-Treiber, die ich bislang gesehen habe (z.B. Tyndur und CDI), inklusive zahlreicher Seiten zum FDC (lowlevel-wiki, osdev.org) sind fehlerhaft. Wir merken es nur, weil unsere DMA-Implementation marode ist.
Der Schlüssel ist Bit 7 des Kommandos an den FDC beim lesen/schreiben eines Sektors. lowlevel war (ist jetzt korrigiert) der Meinung, dort müsste die Anzahl der Sektoren pro Track stehen.
Osdev.org behauptete, dort müsste die Anzahl der zu lesenden Sektoren stehen.
Die Treiber, die ich auch zu Rate gezogen habe folgten dem lowlevel-Vorschlag.
Nachdem ich auf einen Kommentar im CDI-Treiber gestoßen bin (der die richtige Info enthielt, sie aber nicht anwendete im Code) wurde mir das Problem klar. Kwolf/taljeth und ich haben in #lost dann darüber diskutiert, wer Recht hat und letztlich fanden wir auch in der offiziellen Spec den Hinweis, das dort der letzte zu bearbeitende Sektor stehen muss. Steht dort 18, wird bis zum letzten Sektor des Tracks gearbeitet (Also trackweise, wenn man von 1 an liest^^). (Beim lesen ists ja ohnehin egal, ob zuviel gelesen wird.)
Bei uns wurde durch die falsche Angabe zuviel geschrieben, bei tyndur aber nicht. Das liegt am DMA-Treiber. Die zweite Begrenzung für die geschriebene Datenmenge ist die Datenmenge, die DMA dem FDC gibt. Das ist bei uns falsch eingestellt (immer Trackgröße), bei tyndur hingegen richtig (Sektorgröße, wenn nur ein Sektor gelesen/geschrieben wird)
Schaut man sich diesen Ablauf an, so erkennt man noch Optimierungspotenzial:
- Warum wird sector 19 fünf Mal nacheinander gelesen?
- Warum wird sector 1251 doppelt gelesen?
Erforderliche Schreibvorgänge:
3 nach root dir (Name, erster Cluster, Größe)
9 nach data (4098 byte)
1 nach FAT1
1 nach FAT2
Warum doppelt nach sector 1251 geschrieben wird, ist nicht klar.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 00:45:36 07.09.2010, insgesamt 2-mal bearbeitet
BL2-Problem beim Laden des Kernels bei PCs von MrX:
Zitat:
<MrX>So, ich hab den Fehler bei mir sehr genau eingrenzen können.
<MrX>Er gerät in eine Endlosschleife (.COPY_TO_DEST in ReadSectors (Fat12.inc)), und zwar bei dem ersten Leseaufruf der .LOAD_IMAGE-Schleife in LoadFile (Fat12.inc)
<MrX>Herausgefunden durch Debugausgaben: Ein print direkt vor der Schleife erscheint, eines direkt danach nicht.
So, hab heute mal PrettyOS in Parallels Desktop 6 getestet. Mag ja sein, dass es für graphische OS gedacht ist, aber ich dachte mir, ich könnte es ja mal versuchen. Es trat folgender Fehler auf:
http://prettyos.fanofblitzbasic.de/mem.png
Zur Erklärung: Eigentlich müsste statt "Continuing anyway..." dort "OS halted!" stehen, aber ich habe die Endlosschleife danach auskommentiert.
(Maustreiber geht sogar^^)
Kann mir jemand erklären, was da genau passiert?
Das ist bisher das erste Mal, dass das passiert, kann man nicht einfach den Speicher an der Stelle vorher einmal leeren? Ich weiß, das ist nicht wichtig, aber wenn es doch mal woanders passiert?
Gute Idee im Chat:
<MrX>Wir brauchen ein Testprogramm
<MrX>Ein Userprogramm (test.elf), dass verschiedene Dinge austestet.
<ehenkes>Das ist eine hervorragende Idee
<ehenkes>Dann sehen wir auch, wo wir noch User-Kernel-Barrieren haben
(Doku hier, damit sie nicht verloren geht)
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
<ehenkes><Pretty00001>1234567 sieben zeichen gehen
<ehenkes>bei 12345678 (Eingabe) bleibt das User-Programm hängen.
<ehenkes>Ich baue auf dich, denn für networking benötigen wir das funktionsfähig
<ehenkes>ich verwende qemu 0.14.1, spielt das eine rolle?
<MrX>ich denke nein.
<ehenkes>hardwaretest notwendig?
<ehenkes>ich teset einfach mal
<MrX>Ich werde gets mal gezielt testen, wenn ich Zeit habe.
<ehenkes>re
<ehenkes>wenn man irc eingibt, wird hello.elf angezeigt, z.T. auch absturz beim laden
<ehenkes>was Cuervo auch sagte
<ehenkes>merkwürdiges verhalten bei der floppy
<ehenkes>aber absturz nur ab und zu
<ehenkes>zur Zeit komme ich über SYN_SENT nicht raus, der IRC server mag mich nicht mehr ^^
<ehenkes>MrX: schau bitte auch mal nach dieser merkwürdigen anzeige der falschen datei beim von floppy laden
<ehenkes>das war früher nicht
<ehenkes>hab eben browser eingegeben, da lädt er rasend schnell
<ehenkes>auch keine komischen anzeigen falscher files
<ehenkes>bei starwars lädt er etwas klänger, aber auch sehr schnell, keine fehlanzeigen
Stand bei rev. 1022
Leider haben wir inzwischen einige kleine Schwächen im OS.
Auch Abstürze, freezes.
Nach Neuformatieren der Floppy und laden von irc.elf kommt kein hello.elf, dafür aber absturz.
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 23:38:33 03.07.2011, insgesamt 3-mal bearbeitet
Habe heute starwars geöffnet,
plötzlich, während des Vorspanns ist folgendes passiert:
Über serielle Konsole wurde "invalid ack - drop!!!" ausgegeben (mehrfach) und starwars war stehengeblieben. Habe mit ESCape beendet und folgendes Bild war zu sehen:
Cuervo meldet im chat folgende notwendige Korrekturen/Ergänzungen an:
1. EVENT_TCP_CLOSED sollte sofort ausgelöst werden, wenn die Verbindung ESTABLISHED verlässt, nicht erst, wenn sie gelöscht wird (<--- erledigt)
2. Wir brauchen EVENT_TCP_CONNECTION_FAILED (<--- timeout bitte im user-prg)
3. fopen() soll keine Ausgaben erzeugen (<--- erledigt)
4. Es ist definitiv ein Fehler im Floppytreiber (error 34 und seek error)
5. Fehler in PCI ? (häufiger durchlauf der for-schleife in function)
_________________ OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Zuletzt bearbeitet von Erhard Henkes am 18:08:43 17.08.2011, insgesamt 4-mal bearbeitet
Wenn man, ausserhalb des bootloaders, von Diskette lesen will, tauchen folgende Meldungen auf (Beispiel mit fdir, gleiches Verhalten beim Laden von Programmen):
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.
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.