Sourcecode Fortschritt



  • Ich würde diesen Thread gerne nutzen, um die Fortschritte festzuhalten.

    Prä-Geschehenes:
    Badestrand hat das Paging-Modul und Heap überarbeitet (*klick*)
    Erhard hat Uhrzeit und Datum (von Cuervo und Erhard) eingebaut (*klick*)



  • Version 26: Hauptsächlich ELF-Loader, sonst einige kleine Sachen:

    - Simpler (!) ELF-Loader setzt bei User-Programm Einstiegsadresse bei 0x01400000 (20 MB) voraus, lädt den Source dahin und erstellt den Task.
    - Die Build.bat-Datei angepasst, dass sie auch den stage1- und stage2- bootloader miterstellt.
    - Interrupt-Krams zusammengefasst, bitte um Rückmeldung. Ich wollte es vor allem übersichtlicher machen, sind auch zwei Dateien rausgeflogen.
    - Key-Queue aus der ODA-Struktur nach keyboard.c verlegt
    - Ausgabe der Memory Map in paging.c, wenn der Diagnose-Schalter an ist
    - Zur Memory Map wird nicht mehr die Anzahl der Einträge gespeichert, die Liste endet mit einem Eintrag der Größe 0.


  • |  Mod

    Version 27: Kleine Korrektur in flpydsk.c
    with real floppy: qemu runs 'fdir' correctly, bochs runs fdir now until return values (rev 17 works, but I do not know why), problems on real hardware still ongoing

    Version 28:
    changes in cmos.c for weekday (there have been problems at some hardware)
    switch_context (syscall) uses 0x7E as interrupt no.
    task switch now works with 0x20 or 0x7E


  • |  Mod

    Version 29:
    Floppy disk driver a little bit improved (qemu, virtualBox runs smoothly)

    But still problems with bochs, virtualPC and real hardware.
    On real hardware there are time critical steps (now transfer repeated until size=2 (512K sectors size) is returned), and there is a read-sector stop at track limit ( stops at C H S 0 1 18 (LBA 35), does not go to 1 0 2 (LBA 37) ).

    Version 30:
    Little bug fixes
    rotating asterisk got green color



  • Verzeih die kurze Frage hier - aber weswegen denn auf einmal Englisch in nem eher deutschen Forum wo doch auch all die anderen Diskussionen auf Deutsch geführt werden?

    Is das ned eher Sinnfrei? 😉

    (Und wenn die Frage hier ner reinpasst büdde abspalten oder so 🙂 )


  • |  Mod

    Sorry, bei mir Gewohnheit. Merke das manchmal garnicht mehr. Hier ist übrigens Englisch und Deutsch akzeptiert.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-252232.html

    Sprachen in diesem Subforum: Deutsch und Englisch
    Languages at this sub-forum: German and English


  • |  Mod

    Version 31:
    Floppy-Treiber etwas optimiert,
    Problem in timer.c behoben (war Ursache für das fdir Problem)

    Nun läuft fdir auf Bochs, VirtualBox, qemu und 2 von 3 PCs (also noch Verbesserungsbedarf); VirtualPC geht auch noch nicht


  • |  Mod

    Version 32:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=32

    - getCurrentSeconds() eingebaut: liefert Zeit in Sekunden seit PrettyOS-Start (allerdings ticks-abhängig, funktioniert nicht zwischen cli/sti)
    - Statusleiste (status bar) implementiert; Scrolling, Cursor- und Tasksteuerung angepasst
    - Floppy-Treiber beim Warten auf Interrupt und auf Read/Write-Transfer um einen Timeout (5 sec) erweitert, damit Kernel hier nicht mehr dauerhaft bei ausbleibendem Interrupt o.ä. hängen bleibt (auf 2 von 3 PCs wird das root directory mit fdir gelesen, ansonsten geht es nach 5 sec weiter im Code mit Fehlermeldung "timeout"). VirtualPC bleibt jetzt auch nicht mehr hängen, funktioniert aber noch nicht richtig bezüglich root dir Ausgabe.
    Auf VMWare läuft PrettyOS auch (Aussage Cuervo).


  • |  Mod

    Version 33:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=33

    Auf mancher Hardware klappt das Auslesen von Floppy-Inhalten nur jedes zweite Mal (Grund noch nicht klar). Work-around:
    - User-Funktion floppy_dir() und Kernel-Funktion flpydsk_read_directory() erhielten einen Rückgabewert. fdir liest nun noch ein zweites Mal, wenn der Rückgabewert keine Inhalte anzeigt.
    - DMA-Puffer wird vor dem Auslesen der root dir gelöscht, damit man die echten gelesenen Inhalte und keine alten Daten sieht.
    - Timeout wurde von 5 auf 2 Sekunden verkürzt.


  • |  Mod

    Version 34:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=34

    - time.h/time.c ergänzt, Datum/Zeit aus cmos.h/c in dieses Modul überführt
    - Statusleiste: Datum und Zeit, zusätzlich vergangene Sekunden seit dem Start
    - aktuelles FloppyImage.bin
    - einiges wurde ausgeblendet (Ausdruck nach 'Diagnose' verlagert)

    FloppyImage (im Verzeichnis 'kernel') wurde mitgeliefert, damit man die neuesten Features sofort ansehen kann, z.B. mit Qemu (batch-Datei für Windows):

    qemu-system-x86_64.exe -usbdevice mouse -fda FloppyImage.bin -boot a -localtime
    

  • |  Mod

    Version 35:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=35

    - NULL als (void*) 0 redefiniert, wie in C üblich (vorher nur 0)
    - NULL in paging.c ausgetauscht gegen 0 (wegen error: cast pointer to integer)
    - itoa und reverse von K&R (siehe wikipedia), strcpy von wikipedia
    - Rotierender ASCII Stern wurde umgefärbt und nach unten rechts in Statusleiste verschoben
    - 2-Klausel-BSD-Lizenz und Disclaimer in os.h und ckernel.c für weitere Diskussionen erstmalig eingefügt, aber ganz unten wie abgesprochen (einmalig!)

    Offenes Problem:
    In char* getCurrentDateAndTime(char* pStr) muss wie folgt

    int i; for(i=0;i<80;++i){pStr[i] = 0;}
    

    der als Zeiger übergebene DateAndTime-String gelöscht werden. Ansonsten geht die Ausgabe schief und das OS stürzt wegen buffer overflow ab. Der Fehler liegt nicht in strcpy oder itoa, soweit ich das bisher sehe, also entweder in der Funktion selbst oder in strcat.

    Der work-around funktioniert aber gut.


  • |  Mod

    Version 36:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=36

    - Kleiner Bug beim Auslesen von Root Dir behoben (Punkt zwischen Name und Extension wurde immer beim ersten Mal nicht gesetzt, jetzt dann, wenn Eintrag nicht Volume Label ist)

    Lob an unseren Chef-Tester Cuervo, dem aufgefallen ist, dass da BOOT2SYS steht anstelle BOOT2.SYS, wenn das Label leer war

    Screenshot: http://www.henkessoft.de/OS_Dev/Bilder/PrettyOS_rev36.PNG


  • |  Mod

    Version 37:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=37

    - Fehlerhaftes strcat ausgetauscht gegen Variante aus wikipedia, die strcpy und strlen einsetzt. Nun kann die for-Schleife am Anfang von getCurrentDateAndTime entfallen, die den ganzen String auf 0 setzte.


  • |  Mod

    Version 38:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=38

    Heute ist mal wieder Spaß angesagt:
    - Modul gags.h/c mit fahrendem Zug (aus wikipedia) <--- unbedingt ansehen!

    Dass dieses Modul nichts in einem "bare bone" Kernel zu suchen hat, ist mir selbstverständlich klar! Das war nur ein Test für das Feature Laufband. Ich habe eine einfache Idee - ohne großen API-Aufwand - gesucht für ein Programm, das man von der Floppy Disk laden und im User-Space laufen lassen kann. Das kam dabei heraus. 😉

    Screenshot: http://www.henkessoft.de/OS_Dev/Bilder/FahrenderZug.PNG

    #include "os.h"
    #include "gags.h"
    
    // Zug als Beispiel übernommen aus
    // http://de.wikipedia.org/wiki/ASCII-Art#Allgemeine_Beispiele
    // TODO: eigene ASCII-Art erzeugen
    
    char* line1 = "  _______                _______      <>_<>                                     "    ;
    char* line2 = " (_______) |_|_|_|_|_|_|| [] [] | .---|'\"`|---.                                 "   ;
    char* line3 = "`-oo---oo-'`-oo-----oo-'`-o---o-'`o\"O-OO-OO-O\"o'                                "  ;
    
    void showTrain(int8_t val)
    {
        int i;
        char temp1,temp2,temp3;
        switch(val)
        {
            case 1:
                temp1 = line1[79];
                temp2 = line2[79];
                temp3 = line3[79];
    
                for(i=79;i>0;--i)
                {
                    line1[i] = line1[i-1];
                    line2[i] = line2[i-1];
                    line3[i] = line3[i-1];
                }
                line1[0] = temp1;
                line2[0] = temp2;
                line3[0] = temp3;
                k_printf(line1,46,0xE);
                k_printf(line2,47,0xE);
                k_printf(line3,48,0xE);
            break;
    
            default:
            break;
        }
    }
    

    -----------------------------------------------

    Version 39:

    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=39

    - Laufband ("fahrender Zug") im Kernel aus Effizienzgründen entfernt (auskommentiert) :xmas1:

    // showTrain(1); // TODO: transfer to user space as elf exec format; k_printf as syscall
    

    -----------------------------------------------

    Version 40:

    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=40

    - gags.h/c im Kernel entfernt
    - syscalls ergänzt
    - showInfo(val) testweise im User-Bereich eingebaut; Laufband-Funktion noch nicht vorhanden (TODO: separate Task)
    - makefile korrigiert im User-Bereich



  • Der Zug ist mega cool!

    Version 41: Unterstriche in den Ordnernamen und das Präfix "k_" in Funktionsnamen entfernt.


  • |  Mod

    Version 42:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=42

    - getCurrentSeconds() in userlib.h/c nachgerüstet (program.c wird jetzt kompiliert) <--- Dank an Cuervo für das Auffinden dieses Fehlers
    - gags.h/c im Kernel gelöscht (Funktion ist in program.c)

    Der Zug ist mega cool!

    Thanks! 🙂



  • Version 43:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=43

    - In start.asm aus user/user_program_c das Ausnullen der BSS entfernt, ist afaik sowieso schon auf 0 und ergab bei mir wegen Integer-Underflow in ecx 'nen fiesen Fehler.

    - Noch zwei oder drei Funktionen mit "k_"-Präfix gefunden und korrigiert.

    - kernel/gdt.inc gelöscht, da anscheinend ungenutzt (dann auch stage2_bootloader/gdt2.inc wieder in gdt.inc umbenannt)

    - mingw32-make.exe, nasmw.exe, CreateFloppyImage.exe, BootDisk2BootStick.exe, dd.exe und bochs.bxrc in Ordner "tools"

    - Das Erstellen des Images, Entfernen aller .o-Dateien jetzt in globalem makefile

    - Aufrufen von Bochs, Qemu oder das Bauen der Diskette in Batch-File. Die Batch-Datei kann "einfach so" aufgerufen werden, dann kompiliert alles. Wird als Parameter "bochs" übergeben, wird das Image in Bochs ausgeführt. Wird (evtl zusätzlich) "disc" übergeben, wird alles auf die Diskette geschrieben. Für Qemu und anderes können wir auch noch was basteln. Und das ganze noch als Shellskript für die Linuxer schreiben, ist bisher nur als Stub vorhanden.

    TODO:
    Der Stack der User-Prozesse muss vom Kernel gesetzt werden, jeder braucht auch seinen eigenen Stack. In unserem User-Programm zumindest wird der Stack händisch auf 0x60000 gesetzt. Erhard, du kennst dich in dem Tasking-Modul doch aus, magst du mal probieren, jedem Prozess seinen eigenen Stack zu geben? Irgendwo unter 0xC0000000 oder so.. 🙂

    @Erhard: Wird "quickformat_Floppy_A.bat" noch gebraucht?



  • Version 44 & 45: Minimale Änderungen. U.a. die Linux-Version von CreateFloppyImage hinzugefügt. Ging aber nicht so einfach, weil einmal ein Ordner mit demselben Namen existiert hatte, schien SVN zu stören. Egal, es heißt jetzt CreateFloppyImage2.


  • |  Mod

    Version 45 baut so nicht auf:

    G:\OSDev\PrettyOS\trunk\Source>tools\mingw32-make OS=WINDOWS
    nasmw -f bin stage1_bootloader/boot.asm -Istage1_bootloader/ -o stage1_bootloader/boot.bin
    nasmw -f bin stage2_bootloader/boot2.asm -Istage2_bootloader/ -o stage1_bootloader/boot2.bin
    rm .o -f
    i586-elf-gcc user/user_program_c/
    .c -c -Iuser/user_program_c -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin
    i586-elf-ld *.o -T user/user_program_c/user.ld -Map user/user_program_c/kernel.map -nostdinc -o user/user_program_c/program.elf
    c:\crosstools\bin\i586-elf-ld.exe: warning: cannot find entry symbol _start; defaulting to 01400000
    rm *.o -f
    tools/make_initrd user/init_rd_img/test1.txt file1 user/init_rd_img/test2.txt file2 user/init_rd_img/test3.txt file3 user/user_program_c/program.elf shell
    writing file user/init_rd_img/test1.txt->file1 at 0x1304
    writing file user/init_rd_img/test2.txt->file2 at 0x1327
    writing file user/init_rd_img/test3.txt->file3 at 0x134a
    writing file user/user_program_c/program.elf->shell at 0x1910
    mv initrd.dat kernel/initrd.dat
    rm .o -f
    i586-elf-gcc kernel/
    .c -c -Ikernel/include -std=c99 -march=i386 -mtune=i386 -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Iinclude
    nasmw -O32 -f elf kernel/data.asm -Ikernel/ -o data.o
    nasmw -O32 -f elf kernel/flush.asm -Ikernel/ -o flush.o
    nasmw -O32 -f elf kernel/interrupts.asm -Ikernel/ -o interrupts.o
    nasmw -O32 -f elf kernel/kernel.asm -Ikernel/ -o kernel.o
    nasmw -O32 -f elf kernel/process.asm -Ikernel/ -o process.o
    i586-elf-ld *.o -T kernel/kernel.ld -Map kernel/kernel.map -nostdinc -o kernel/kernel.bin
    rm *.o -f
    tools/CreateFloppyImage2 PrettyOS FloppyImage.bin stage1_bootloader/boot.bin stage2_bootloader/boot2.bin kernel/kernel.bin
    Cannot open the file 'stage2_bootloader/boot2.bin'
    mingw32-make: *** [ckernel] Error -1

    Wenn ich build.bat disc in der Konsole eingebe, wird boot2.sys nicht kopiert.

    boot2.bin landet in stage1_bootloader :xmas2:

    ---------------------------------------------------------

    Notwendige Korrektur:

    makefile, , Zeile 26/27:

    boot2: $(wildcard $(STAGE2DIR)/*.asm $(STAGE2DIR)/*.inc)
    	$(NASM) -f bin $(STAGE2DIR)/boot2.asm -I$(STAGE2DIR)/ -o $(STAGE2DIR)/boot2.bin
    

    boot.asm, Zeile 264:

    ImageName      db "BOOT2   BIN"
    

    boot.asm, Zeile 268:

    msgFailure     db 0x0D, 0x0A, "BOOT2.BIN MISSING", 0x0D, 0x0A, 0
    

    boot2.asm, Zeile 26:

    msgFailure db 0x0D, 0x0A, "Missing KERNEL.BIN", 0x0D, 0x0A, 0x0A, 0
    

    Dann startet aber der Kernel immer noch nicht! 😕


  • |  Mod

    Version 46:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=46

    Die neuen Bezeichnungen boot2.bin und kernel.bin wurden überall eingebaut und der Fehler im Makefile behoben.

    Der Kernel wird aber noch nicht gestartet! 😕