Sourcecode Fortschritt
-
Im Unterverzeichnis ...\PrettyOS\trunk\Source\user\user_test_c build.bat ausführen.
mingw32-make main
==> HELLO.ELF
-
Rev. 87:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=87Zwischenschritt (leider noch Fehler enthalten) mit Bitte um Fehlersuche.
task.c: exit als syscall eingebaut (beendet Prozess)
user.c: gets eingefügtUser-Programm mit gets (altes Programm in "zzz_alternative_User-Programme", falls die Fehler nerven, das sollte wiederholbarer laufen)
Systemfrequenz: 100 Hz
Diese Version sollten wir nun erstmal stabilisieren, da ich an mehreren Stellen kleine Ungenauigkeiten vermute, die nun zuschlagen.
Bei MT kann es auch zu races kommen, sodass wir noch einiges gegeneinander abschotten müssen.
-
Rev 88:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=88Zwischenschritt mit Bitte um Fehlersuche / Ideen.
Diagnose aktiviert (PID der tasks werden angezeigt)
Absturz bei Überschreiten von exit (wird durch test-Funktion angezeigt) in start.asm verhindert durch jmp $
User-Programm mit gets <--- richtig schlimm, lange namen eingeben
Systemfrequenz: 10 Hz
Was muss durch cli/sti abgeschottet werden?
Wo sind kritische Abschnitte notwendig?
-
Rev. 89:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=89Fehler gefunden! Wie erwartet im Multitasking.
Während der Ausführung von gets wurde der task gewechselt. Damit fing die shell Zeicheneingaben und vor allem das ENTER (Line Feed: 10) des User-Programms ab, das dann auf das Ende des Strings wartete.
Abhilfe: Das Taskswitching wurde während gets(...) deaktiviert (wohl keine dauerhafte Lösung). Hierzu wurde ein syscall settaskflag geschaffen.
siehe: task.c, syscall.c, userlib.c
Wenn man das nachvollziehen will:
Diagnose in os.h aktivieren, dann sieht man die PID der Tasks. Einfach in gets das taskswitching zulassen.
-
Rev. 90:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=90Fehlerbeseitigungen:
task.c: in exit() sofort task-switch nach sti(), damit der Prozess nicht hinter exit gelangen kann.
interrupts.asm: 0x7E war dort nicht eingetragen in die IDT (--> #GP)! Danke an XanClic für diesen Hinweis!
-
Rev. 91
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=90userlib.h/c: itoa, atoi
Beispielprogramm hello.elf mit Collatz-Folge (3n+1)#include "userlib.h" int main() { char s[1000]; unsigned long start; // Beginn der Berechnung bei 'start' unsigned long end; // Ende der Berechnung bei 'end' unsigned long zahl; // Element der Folge unsigned long i,j; // Zählvariable für die Folgenlänge settextcolor(11,0); puts("--------------------------------------------------------------------\n"); puts("Bitte geben Sie ihren Namen ein:\n"); gets(s); puts("This piece of software was loaded by PrettyOS from the floppy disk of "); puts(s); putch('\n'); puts("--------------------------------------------------------------------\n"); puts("--- Collatz-Folge 3n+1 ---\n"); puts("--------------------------------------------------------------------\n"); /**************************** Eingabebereich ****************************/ puts("Erste Zahl: "); gets(s); start = atoi(s); puts("Letzte Zahl: "); gets(s); end = atoi(s); /**************************** Eingabebereich ****************************/ for(j=start; j<end+1; j++) { zahl=j; i=1; putch('\n'); itoa(j,s); // begin value puts(s); putch(' '); while(zahl != 1) // test on cycle 4-2-1 { if( zahl % 2 == 0 ) zahl /= 2 ; // Collatz else zahl = 3 * zahl + 1 ; // Collatz itoa(zahl,s); puts(s); // element of the series putch(' '); i++ ; } if(zahl == 1) { puts("\tH(n): "); itoa(i,s); puts(s); // H(n) length of the series putch('\n'); } } settextcolor(15,0); return 0; }
Jede Start-Zahl endet in der Folge auf 4-2-1. Das ist die Behauptung.
siehe:
http://www.ericr.nl/wondrous/index.html
http://www.henkessoft.de/C++/C++/cpp_konsole.htm (Kap. 1.5)Ein kleiner Meilenstein.
-
Rev. 92:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=92fat.h/c: FAT-Lesen/nach 12-Bit transferieren signifikant beschleunigt
(FATMAXINDEX testweise auf 300 eingestellt; das muss noch umgestellt werden)Cuervo stellt Probleme beim Lesen von echter Floppy fest.
Bei mir klappt es auf einem PC mit der FAT, dann allerdings #PF, d.h. die gelesenen/errechneten FAT-Einträge stimmen nicht;
auf dem anderen stimmen die FAT-Einträge nicht (alles 0).
Da das bisher geklappt hat, liegt das an der Code-Änderung in fat12.c (Beschleunigung durch trackweises Lesen in ein Array).Also leider noch nicht in Ordnung bei realer Hardware
==> Debuggen auf echter Hardware
-
Rev. 93:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=93Fehler bei der Analyse der Eingabe von Filenamen in der shell behoben (Eingabe von hello.elf usw. funktioniert nun).
Dank an XanClic für den Hinweis auf die Lösung.Bis zur Lösung der Probleme mit echter Hardware bitte auf Simulationen testen (MS Virtual PC liest nicht, aber Bochs, Qemu, Sun Virtual Box funktionieren gut).
-
Rev. 94:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=94fat12.c: Verbesserungen bezüglich echter Hardware
hello.c: Eingabe von 0 als erste Zahl wird abgefangen (auf 1 gesetzt)
-
Rev. 95:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=95fat12.c: verbesserte Fehlerabfrage bei file_ia(...) - timeout eingebaut
-
Rev. 96:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=96Verbesserte Fehlermeldungen zur Fehlersuche bei echter Hardware.
-
Rev. 97:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=97Neu: beep(frequ, duration) als syscall und in userlib
Nun kann das Spielhallen-feeling starten
für qemu: -soundhw pcspk (als Parameter)fat12.c: read überarbeitet
-
Rev. 98:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=98- Testversion for correctness of int32_t flpydsk_read_sector_ia( int32_t i, void* a) at real hardware
Currently, only each second time the read procedure to the DMA Buffer really overwrites the contents (manipulated from us to AAAA...) there.int32_t flpydsk_read_sector_ia( int32_t i, void* a) { /// TEST: change DMA before write/read printformat("DMA manipulation\n"); memset((void*)DMA_BUFFER, 0x41, 0x200); // 0x41 is in ASCII the 'A' /// TEST: motor on/off flpydsk_control_motor(true); int32_t n, retVal; for(n=0;n<2;n++) // two times should be enough to overwrite the AAAA... { retVal = flpydsk_read_sector(i,0); if(retVal!=0) { printformat("\nread error: %d\n",retVal); } } memcpy( a, (void*)DMA_BUFFER, 0x200); return retVal; }
-
Rev. 99:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=99Testversion, die die Schwachstelle Floppy --> DMA_BUFFER aufdeckt und mindestens 10 mal probiert, meldet Erfolg oder Misserfolg.
Kann noch beschleunigt werden, indem man den Motor nicht anschaltet (noch Sicherheitsmaßnahme).
-
Rev. 100:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=100Es wurde versuchsweise ein User-TaskCounter (exit in task.c, load in fat12.c, syscall.c) eingeführt, um die shell steuern zu können. Die Shell geht nur dann in die Eingabeschleife ($>), wenn keine User-Tasks laufen.
Die Userlib wurde mit weiteren Funktionen (bereits im Kernel vorhanden) bestückt.
TODO: das Durchsuchen der rootdir muss beschleunigt werden (z.Z. sehr lahm wegen motor on und Diagnose)
-
Rev. 101:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=101Floppy-Motor-Steuerung verbessert (siehe flag in ODA, os.h)
Sun VB "unterbricht" nach ca. 20 mal Task 2 (shell); real PCs und qemu laufen.
Fragen:
warum bricht Sun VB ab?
warum läuft Floppy ---> DMA nicht zuverlässig (teilweise zwischen 1 bis 16 fails, gerade bei höheren Sektoren)?Zur Zeit kann nur ein zusätzlicher Task durch Eingabe in die Shell gestartet werden, weil diese solange wartet, bis dieser wieder beendet ist (Task-Zähler).
-
Rev. 102:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=102- Beschleunigungen in fat12.c und flpydsk.c <--- allerdings Erkennung verschlechtert!
- gets in der user/user_program_c/userlib.c korrigiert
- __asm__ volatile ("hlt"); in der while-loop des kernels eingebaut
-
Rev 103:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=103fat12.c: kleine Veränderungen
video.c: printformat um %y erweitert (gibt hexadezimal nur 2 Stellen aus, ideal für die Byte-orientierte Ausgabe von Dateiinhalten )Diese Version läuft mit Sun Virtual Box 3.1.2, Qemu, Bochs 2.4.2 und auf realer Hardware, prinzipiell auch mit MS Virtual PC, dort jedoch mit unüberwindlichem read error (liegt angeblich an DMA autoinit).
-
Rev 104:
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=104fat12.c: Vereinfachungen (sector/track) durch Zusammenlegen von Funktionen
irq.c: Ausgabe der Fehlermeldungen (#PF, #GPF) in hellrotDiese Version läuft mit:
Sun Virtual Box 3.1.2,
Qemu 0.11.50,
Bochs 2.4.2,
realem PC mit Floppy Disk.MS VPC macht noch Probleme (läuft nicht mit autoinit von DMA).
-
Rev 105: Durchbruch bei Floppy/DMA
http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=105Einige wesentlich Verbesserungen im Bereich Floppy/DMA/FAT12:
DMA nun ohne autoinit bit (wird von osdev.org für floppy mit autoinit empfohlen!), dafür jeweils ein erneutes DMA-Init vor dem Lesen von Floppy:
Funktioniert nun endlich sicher (Hardware unterstützt autoinit offensichtlich nicht ausreichend) und erlaubt nun auch den Einsatz von MS Virtual PC (bug: simuliert autoinit nicht).Beim Schreiben ist autoinit noch aktiv. Das stellen wir ebenfalls um, wenn sich das Lesen von Floppy via DMA auf diese Art bewährt.
Die Motor-Steuerung wurde nun auch optimiert, sodass es nun wirklich schneller läuft.
Der Floppy-Motor wird bei #PF und #GPF nun auch ausgeschaltet (Hinweis von Cuervo).
TODO: Schreibvorgang checken (z.B. fformat)!