Sourcecode Fortschritt


  • 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! 😕


  • Mod

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

    Nun überall Großschrift in den asm für die Dateinamen (BL1, BL2)
    Alles auf BIN gesetzt (nicht mehr SYS)
    Fehler im makefile berichtigt: start.asm (user) wurde nicht assembliert

    Nun gibt es einen ASSERTION Fehler:
    ASSERTION FAILED((const void*)(header->entry) == USERCODE_VADDR) at kernel/elf.c
    :153OPERATING SYSTEM HALTED



  • Sorry für die Verwirrung! Bin auch gerade online gegangen weil ich die Fehler bemerkt hatte, beim Übertragen auf den INet-Rechner ist wohl was schief gelaufen.

    Die meisten Sachen hast du ja erfolgreich behoben, die start.asm aus dem User-Prozess muss noch mitkompiliert werden (ist irgendwie aus dem Makefile rausgeflutscht) und ein assert muss aus elf.c raus:
    ASSERT( (const void*)(header->entry) == USERCODE_VADDR );
    Das User-Programm startet nämlich nicht bei 0x01400000, sondern 0x200 Bytes später. Warum auch immer. Funktioniert aber trotzdem.
    => Version 48


  • Mod

    Folgendes geht bei mir lokal:

    - ASSERTION in Zeile 153 auskommentiert, damit die shell startet (Grund für diese Maßnahme momentan unklar)
    - readelf und batch-Datei in User
    - floppy_build.bat für direktes Starten des Build-Prozesses im Explorers

    Momentan kann ich nicht committen wegen Konflikt

    Super! Badestrand und ich haben das gleiche gemacht. Ich schieb mal meine Luxusklasse-Ausführung für faule Windows-Anwender hinterher:

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

    In bochs bevorzuge ich übrigens

    floppya: 1_44=a:, status=inserted

    Vielleicht sollte man auf Dauer zwei verschiedene versionen anbieten.


  • Mod

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

    Nun ist BOOT2.BIN und KERNEL.BIN im makefile groß geschrieben, damit es auch unter Linux problemlos läuft. 🙂

    elf.c:
    Zeile 129: ASSERT( header->phnum == 1 );
    Zeile 152: ASSERT( (const void*)(ph->vaddr) == USERCODE_VADDR );
    müssen evtl. unter Linux noch auskommentiert werden.

    In Windows klappt das mit dem Cross-Compiler auch mit den ASSERTs.


  • Mod

    Version 51: (badestrand)
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=51
    - Run the build.bat file with qemufloppy or qemuimage as parameter to start qemu.

    Version 52: (Erhard Henkes)
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=52
    - Systemfrequenz auf 1000 Hz erhöht
    - getCurrentMilliseconds() ergänzt (syscall)
    - "Zug" bewegt sich alle 20 Millisekunden flüssig nach vorne

    Es war mir ein Bedürfnis den "Zug" (Beispielanwendung für das dreizeilige Laufband) zu :xmas1: Weihnachten :xmas2: betriebsbereit zu haben. Er läuft im User-Bereich (z.Z. noch in der Shell) lässt sich durch den neuen Millisekunden-Timer und die neue System-Frequenz von 1000 Hz ziemlich rasant über den Bildschirm bewegen. Leider ist er noch keine eigene Task. Daher kann man ihn z.B. mit langwierigen Aktionen wie 'fdir' ausstoppen.

    😉 Anstelle des Zuges könnte auch Ihre Werbung stehen. 😉


  • Mod

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

    - Folgendes auskommentiert in elf.c:
    Zeile 11: static const void* USERCODE_VADDR = (void*)0x01400000;
    Zeile 129: ASSERT( header->phnum == 1 );
    Zeile 152: ASSERT( (const void*)(ph->vaddr) == USERCODE_VADDR );

    - Folgendes ergänzt:
    Zu den CFLAGS noch "-m32" hinzufügen
    In die Linkerscripte (kernel.ld, user.ld) "OUTPUT_ARCH(i386)" hinzufügen

    Nun sollte es von Seiten Linux und 64-Bit keine Barrieren geben. Erste Tests bestätigen dies! 🙂

    http://www.cyberciti.biz/tips/compile-32bit-application-using-gcc-64-bit-linux.html


  • Mod

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

    - build.sh für Linux ergänzt
    - tools/bochsrc ergänzt
    - Zug auf vielfachen Wunsch etwas ausgebremst (40 Zeichen/sec) :xmas1:

    Der "Zug" steht nur stellvertretend für das zukünftige Informationsband, in dem Diagnosedaten angegeben werden. Wir wollen ja ein Lehr-OS schaffen.


  • Mod

    Version 55:

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

    -fno-pic im makefile ergänzt
    in userlib.c __asm__ anstelle asm

    Screenshot: http://www.henkessoft.de/OS_Dev/Bilder/Rev55.PNG 🙂


  • Mod

    Version 56:

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

    - flpydsk_read_directory() nach fat12.c ausgelagert, da spezifisch für Dateisystem FAT12

    in fat12.h/c sollen die FAT12-spezifischen Funktionen zur Dateiverwaltung auf Floppy Disk abgelegt werden.


  • Mod

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

    - fat12.h/.c: Quickformat für die FloppyDisk implementiert ("fformat")
    läuft noch nicht fehlerfrei (FAT2 wird nicht analog zu FAT1 geschrieben), funktioniert aber bereits. Kann auch mit FloppyImage.bin getestet werden. Als Hex-Editor empfehle ich für die echte Floppy den Hex-Editor Neo, da dieser direkt Volumes auslesen kann.

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

    Leider fehlte in dieser Version (vielleicht auch schon vorher in 56) die fat12.c!


  • Mod

    Rev. 57a:
    http://prettyos.svn.sourceforge.net/viewvc/prettyos?view=rev&revision=58

    - fat12.h/.c: Quickformat für die FloppyDisk implementiert ("fformat")
    läuft noch nicht fehlerfrei (FAT2 wird nicht analog zu FAT1 geschrieben), funktioniert aber bereits. Kann auch mit FloppyImage.bin getestet werden. Als Hex-Editor empfehle ich für die echte Floppy den Hex-Editor Neo, da dieser direkt Volumes auslesen kann.

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

    Diese Version sollte komplett sein. 🙂


  • Mod

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

    fat.c: FAT2 nun analog FAT1

    - Noch eine Menge Optimierungspotential
    - date/time fehlt noch


  • Mod

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

    In fat12.c - testweise - noch ein "Preformat" eingefügt, das die ersten 32 Sektoren komplett auf eine Zahl (0xAA) setzt, bevor die eigentliche Fortmatierung startet.
    Die Routine muss noch auf das Track-weise Schreiben (18 Sektoren auf einmal) angepasst werden.

    EDIT: das fformat ist bisher leider nur qemu-fähig. Auf echten PCs wird bisher nicht formatiert. Fehler wird durch Debuggen (ohne Preformat) gesucht. Die Funktion steigt bereits ganz vorne aus:

    /// write bootsector
        retVal = flpydsk_write_boot_sector(&b);
        if(retVal != 0)
        {
            printformat("E_Disk - flpydsk_write_boot_sector");
            return E_DISK;
        }
    

    Problem liegt hier (um timeout-Routine ergänzt für Fehlersuche):

    int32_t flpydsk_write_sector_ia( int32_t i, void* a)
    {
        memcpy((void*)DMA_BUFFER, a  , 0x200);
    
        uint32_t timeout = 2; // limit
        int32_t  retVal  = 0;
        while( flpydsk_write_sector(i) != 0 )
        {
            retVal = -1;
            timeout--;
            printformat("error write_sector. left: %d\n",timeout);
    	    if(timeout<=0)
    	    {
    	        printformat("timeout\n");
    	        break;
    	    }
        }
        if(retVal==0)
        {
            printformat("success write_sector.\n");
        }
        return retVal;
    }
    

    Das Problem mit echter Hardware liegt also in flpydsk_write_sector(i).
    qemu läuft anstandslos.

    Ich lade diese Version mit Fehlerroutine hoch. Vielleicht findet jemand die Lösung für flpydsk_write_sector(i).

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


Anmelden zum Antworten